Python 使用输入在循环内时的单元测试
Python unittest when use input is inside a loop
我有以下内容:
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_mymodule.py
的测试文件来实施您的测试。您要做的是使用 unittest.mock module to have access to the patch() 函数来修饰内置输入。
这意味着您不是调用输入函数来请求用户输入,而是将其修补为 return side_effect
中定义的值。因此,每次调用 input 都会 return 列表的一个值。请注意,您还应该包括 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)
每个测试方法的名称中都应带有前缀 test_
。从 CLI 使用 python -m unittest
时的默认模式在当前目录中查找 test*.py
(它与 运行 TestLoader.discover(). You can probably change this if you want, but you will have to take a look at the 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_mymodule.py
的测试文件来实施您的测试。您要做的是使用 unittest.mock module to have access to the patch() 函数来修饰内置输入。
这意味着您不是调用输入函数来请求用户输入,而是将其修补为 return side_effect
中定义的值。因此,每次调用 input 都会 return 列表的一个值。请注意,您还应该包括 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)
每个测试方法的名称中都应带有前缀 test_
。从 CLI 使用 python -m unittest
时的默认模式在当前目录中查找 test*.py
(它与 运行 TestLoader.discover(). You can probably change this if you want, but you will have to take a look at the unittest 文档相同以获取更多详细信息。