在为Python脚本编写测试时,我正在测试的函数正在交换位置参数,测试失败



这是func_randomgame.py文件。主文件

import random
def run_game(guess, answer):
if (0<guess<4):
if (guess == answer):
print('You Won!')
return True
else:
print('Try Again!')
else:
print("Hey Bozo! I said 1~3")
if __name__ == '__main__':
answer = random.randint(1,3)
while True:
try:
guess = int(input('Please enter a number between 1~3:  ')
if (run_game(guess, answer)):
break

except (ValueError,TypeError):
print('Enter a number')
continue

这是我的测试文件:

import unittest
import func_randomgame
class TestGame(unittest.TestCase):
def test_1(self):
result = func_randomgame.run_game(1, 1)
self.assertTrue(result)
def test_2(self):
result = func_randomgame.run_game(5,1)
self.assertFalse(result)
def test_3(self):
result = func_randomgame.run_game('5',1)
self.assertFalse(result)

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

run_game(guess, answer)我的函数接受这两个参数。但是test_3正在失败。如果有人输入字符串('5'),而不是一个数字,结果应该是假的,test_3应该是好的。但事实并非如此。为什么会发生这种情况?

如果有人输入'5'作为字符串,表达式0 <' 5 ' & lt;

TypeError: '<' not supported between instances of 'int' and 'str'

,因此您的测试失败。

如果你想让你的函数支持字符串输入,你应该在比较之前强制转换它:

def run_game(guess, answer):
guess_as_number = int(guess)
if (0 < guess_as_number < 4):
if (guess == answer):
print('You Won!')
return True
else:
print('Try Again!')
else:
print("Hey Bozo! I said 1~3")

这将处理这个特定的情况。但是对于更健壮的代码,我建议使用try..except来包围并处理意外输入,并向用户提供信息错误消息。

如果有人输入字符串('5'),而不是一个数字结果应该是假的,test_3应该是好的。但事实并非如此。为什么会发生这种情况?

如果您希望您的测试用例通过,您需要在开始您的函数中的计算之前检查guess变量的类型。一个简单的修复方法如下:

def run_game(guess, answer):
if type(guess) == int and (0<guess<4):
if (guess == answer):
print('You Won!')
return True
else:
print('Try Again!')
else:
print("Hey Bozo! I said 1~3")

但是建议您重构函数以正确处理try except块的错误

最新更新