我有一个温度应用程序,该应用程序将用户输入(什么单位,温度)在不同的温度单位之间转换。它涉及提示用户的这些单元和数字,通过普通的str(输入(xyz))和float(input(123))的提示,此后,其余的应用程序将获取数据并使用该数据来执行任务,从一些基本的手动测试中,我发现它确实正确。
我想使用Unitest练习为我的应用程序编写单元测试,因此也写了这些测试(我也相信)。测试通过了预期。但是,我的问题是,即使我提供了测试在测试本身中工作所需的数据,但我仍然可以通过我的主要应用程序中的输入提示。虽然我只能按Enter跳过它,并且测试将按预期进行,但我宁愿找到任何一项UNITCTEST填写这些输入提示本身的方法每次都必须贯穿我所有的输入提示。是否可以与Unitest一起执行此操作?
这是我为主要应用程序写的基本结构
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()
和Unitests:
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)
当您有一个带有函数调用的模块,如
main()
它将在导入的模块中调用。
您可以通过将其包裹在有条件的
中来避免这种情况if __name__ == '__main__':
main()
然后,只有在执行该模块为主程序而不是导入时才会调用main
。
您必须模拟输入方法才能返回模拟的值。有关如何添加模拟的参考,请参见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)
祝你好运!