python - 使用输入在循环内时的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 库测试此功能?
解决方案
我假设您的代码位于名为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文档以了解更多信息细节。
推荐阅读
- loopbackjs - loopback 3 是否支持表的 JSON 字段上的过滤器?我正在使用 MySQL 数据库
- qt - 是否可以在 QML 中获取加载的图像原始尺寸和字节大小?
- mysql - 获得 5 个下一个生日,包括明年
- android - 设置重复图标颜色的特定实例
- react-native - React Navigation 在导航时通过函数调用传递数据
- python-3.x - 不在情节中工作:sharex = True,sharey = True
- loopbackjs - 环回 4 与 socket.io 的集成
- sass - Gulp-sass 触发但在保存部分时不写入输出
- haskell - 签名中的绑定类型
- r - r闪亮输出的打印预览中没有背景颜色