首页 > 解决方案 > 使用输入在循环内时的Python单元测试

问题描述

我有以下内容:

def func():
    s = 1
    i = -1
    while i != 0:
        s += i
        i = int(input())
    return s

if __name__ == "__main__":
    result = func()
    print(str(result))

您将看到对该函数进行了一次调用,但该函数包含一个循环,该循环会迭代直到用户输入值 0。

如何使用 unittest 库测试此功能?

标签: pythonunit-testingpython-unittest

解决方案


我假设您的代码位于名为mymodule.py. 因此,您可以创建一个测试文件名test_mymodule.py来实现您的测试。您要做的是使用unittest.mock模块来访问patch()函数以装饰内置输入。

这意味着什么不是调用输入函数来请求用户输入,而是修补它以返回在side_effect. 因此,每个输入调用都将返回列表的一个值。请注意,您也应该包括 0,否则测试将不起作用。

对于每个输入序列,您必须手动(甚至使用您的程序)计算以提供方法assertEqual的最终结果。

import unittest                                                                                                                                                                               
import unittest.mock                                                                                                                                                                          

from mymodule import func                                                                                                                                                                     

class TestModule(unittest.TestCase):                                                                                                                                                          

    @unittest.mock.patch('builtins.input', side_effect=[1, 2, 3, 0])                                                                                                                          
    def test_func_list1(self, mock):                                                                                                                                                          
        self.assertEqual(func(), 6)                                                                                                                                                           

    @unittest.mock.patch('builtins.input', side_effect=[0])                                                                                                                                   
    def test_func_list2(self, mock):                                                                                                                                                          
        self.assertEqual(func(), 0) 

每个测试方法的名称都应以 a 为前缀test_python -m unittest从 CLI使用时的默认模式test*.py在当前目录中查找(与运行TestLoader.discover()相同。您可以根据需要更改此设置,但您必须查看unittest文档以了解更多信息细节。


推荐阅读