我有一个温度应用程序,可以在不同温度单位之间转换用户输入(单位,温度)。它涉及通过正常的str(输入(xyz))和浮点(输入(123))类型的提示提示用户输入这些单位和数字,之后应用程序的其余部分获取该数据并使用它来执行任务,从一些基本的手工测试中我发现它确实正确。
我想使用unittest练习为我的应用程序编写单元测试,所以也写了(我也相信)。测试通过预期的地方。然而,我的问题是,即使我提供测试所需的数据以便在测试中工作,我仍然会在我的主应用程序中完成输入提示。虽然我可以按Enter键跳过它,测试将按预期进行,我宁愿找到一种方法让unittest填写输入提示本身,完全绕过输入位,或者至少让它静音以便我不要每次都要经历我的所有输入提示。是否可以使用unittest做到这一点?
以下是我为主应用程序编写的基本结构
def main():
unit_from, unit_to, temperature = user_input
# continues with the rest of the application using above data...
#function to get user input
def user_input():
#gets user input using str and float prompts.
#and then returns those values for use in the rest of the program
main()
和单位测试:
import unittest
#module containing classes where the formulas for conversion live
import temperature
#main application that utilzes temperature classes and drives it all
import temp_converter
class FahrenheitConvertTestCase(unittest.TestCase):
#one of my example tests
def test_f_to_c(self):
from_unit = 'FAHRENHEIT'
to_unit = 'CELSIUS'
temp = 32.0
t_convert = temperature.Fahrenheit(temp, from_unit, to_unit)
converted_temp = t_convert.convert()
self.assertEqual(converted_temp, 0.0)
答案 0 :(得分:1)
如果您的模块具有类似
的函数调用main()
将在导入模块时调用它。
您可以通过将其包装在条件
中来避免这种情况if __name__ == '__main__':
main()
然后main
只会在该模块作为主程序执行时调用,而不是在导入时调用。
答案 1 :(得分:1)
您必须模拟输入方法以返回模拟值。有关如何添加模拟的参考,请参阅unittest.mock。另外考虑阅读Python common mock gotchas,它可以节省您的大量时间。因此,添加模拟后,您的测试看起来与下面的代码类似:
@mock.patch('input', return_value='1')
def test_f_to_c(self, mock_input):
from_unit = 'FAHRENHEIT'
to_unit = 'CELSIUS'
temp = 32.0
t_convert = temperature.Fahrenheit(temp, from_unit, to_unit)
converted_temp = t_convert.convert()
self.assertEqual(converted_temp, 0.0)
祝你好运!