Python unittest跳过主应用程序中的特定步骤

时间:2016-06-18 15:01:36

标签: python unit-testing user-input

我有一个温度应用程序,可以在不同温度单位之间转换用户输入(单位,温度)。它涉及通过正常的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) 

2 个答案:

答案 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) 

祝你好运!