Использование Unittest для тестирования моей python игры по угадыванию чисел - PullRequest
0 голосов
/ 19 февраля 2020

Это мой первый пост о переполнении стека, и я надеюсь произвести хорошее впечатление.

Я работаю над игрой в угадывание чисел в python, чтобы промокнуть ногой от юнит-теста, но наталкиваюсь на глупую головоломку.

Проблема в том, что я хочу создать класс юнит-теста, который проверяет следующие вещи

  1. Соответствует ли сгенерированный номер предполагаемому числу
  2. Что делает программа если вы вводите в письме
  3. Вы видите пользовательские ошибки, созданные при возникновении ошибки (в блоке try / Кроме)

Ссылка на мой проект Github здесь -> https://github.com/robpedersendev/python-number-guessing-game

Мой файл main.py ниже

import random
import sys


def guessingGame(number, guess):  # Answer and guess was placed here so as to allow the test to insert 
                                  # its own values into the game, but that is not working
    while true:

        try:
            guess = input(
                f"Number guesser.\t\t\n {name} choose a number between "
                f"{start} and {end}. Enter guess? : ")
            guess = int(guess)
            if guess < number:
                print("\n\nThat number is a tad low\n\n")
            elif guess > number:
                print("\n\nThat number is a tad high\n\n")
            else:
                print("\n\nCongrats, you chose the right number!\n\n")
                break

        except (TypeError, ValueError):
            print("Sorry, numbers only please")
            guess = str(f"\'{guess}\' Which is an invalid character")
            continue
        except (UnboundLocalError):
            print("Sorry, numbers only please")
            continue
        finally:
            print(f"{name}, your last successful guess was {guess}")


if __name__ == "__main__":
    true = True
    start = int(sys.argv[1])
    end = int(sys.argv[2])
    number = random.randrange(start, end)  # Selects the winning number
    name = input("\t\t\t\t\nHello stranger, whats your name? ")
    guessingGame()

Мой файл test.py выглядит как

import unittest
import main


class TestMain(unittest.TestCase):
    def test_input(self):
        true = True
        number = 5
        guess = 5
        result = main.guessingGame(number, guess)
        self.assertEqual(result)


if __name__ == "__main__":
    unittest.main()

Я получаю сообщение об ошибке

Traceback (most recent call last):
  File "c:\Users\Robert\desktop\Side Projects\Udemy\Master python zero to Mastery\projects\python-number-guessing-game\test.py", line 10, in test_input
    result = main.guessingGame(number, guess)
  File "c:\Users\Robert\desktop\Side Projects\Udemy\Master python zero to Mastery\projects\python-number-guessing-game\main.py", line 6, in guessingGame
    while true:
NameError: name 'true' is not defined

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)

[Done] exited with code=1 in 0.375 seconds

Сообщение об ошибке

Я знаю, что мне многое предстоит сделать и многому научиться, но я надеюсь получить полезные советы!

ОБНОВЛЕНИЕ:

Хорошо, я понял проблему (вроде).

Проблема в моем файле main.py Мне нужно иметь этот

true = True


def guessingGame(number, guess, name='bob', start=1, end=20):
    while true:

        try:
            # guess = input(
            #     f"Number guesser.\t\t\n {name} choose a number between "
            #     f"{start} and {end}. Enter guess? : ")
            guess = int(guess)
            if guess < number:
                print("\n\nThat number is a tad low\n\n")
            elif guess > number:
                print("\n\nThat number is a tad high\n\n")

Мой файл test.py

import unittest
import main


class TestMain(unittest.TestCase):
    def test_input(self):
        number = 5
        guess = 5
        start = 1
        end = 20
        name = "bob"
        result = main.guessingGame(number, guess)
        self.assertEqual(guess, number)


if __name__ == "__main__":
    unittest.main()

Мне нужно было предварительно определить значения и закомментируйте первый маленький блок кода. Как только я это сделал, мой тест прошел !! Любые идеи, как обойти эту часть, или это был плохой дизайн с моей стороны?

1 Ответ

0 голосов
/ 19 февраля 2020

https://book.crawfordc.com/anatomy-of-a-modern-test-file

Вот кое-что, что я написал некоторое время назад о написании модульных тестов с гипотезой и pytest. Для проверки того, что идет не так, когда вы вводите букву, вы используете шаблон with pytest.raises. Использование гипотезы для генерации случайных чисел также будет работать намного лучше, чем генерация случайных чисел.

(Вы должны просто сделать код while True:, а не переменную. Но вам нужно будет вернуть false, если это не удастся. Возможно, будет лучше, чем al oop.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...