使用输入在循环内时的Python单元测试

使用输入在循环内时的Python单元测试,python,unit-testing,python-unittest,Python,Unit Testing,Python Unittest,我有以下资料: 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库测试此函数

我有以下资料:

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库测试此函数

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

这意味着,您不是调用输入函数来请求用户输入,而是对其进行修补以返回在
副作用
中定义的值。因此,每次输入调用都将返回列表的一个值。请注意,还应该包括0,否则测试将无法工作

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

每个测试方法的名称中都应加上
测试
。在CLI中使用
python-m unittest
时的默认模式会在当前目录中查找
test*.py
(与运行时相同。如果需要,您可能会更改此模式,但您必须查看文档以了解更多详细信息。

这是一个很好的起点和起点
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)