Cur*_*Pew 6 python runpy python-unittest
我有一个 Python 包(Python 3.6,如果它有所不同),我设计它作为“python -m包 参数”运行,我想为 __main__.py 模块编写单元测试。我特别想验证它是否正确设置了退出代码。是否可以使用 runpy.run_module 来执行我的 __main__.py 并测试退出代码?如果是这样,我如何检索退出代码?
更清楚地说,我的 __main__.py 模块非常简单。它只是调用一个经过广泛单元测试的函数。但是当我最初编写 __main__.py 时,我忘记将该函数的结果传递给 exit(),因此我希望在单元测试中模拟 main 函数以确保正确设置退出代码。我的单元测试看起来像:
@patch('my_module.__main__.my_main', return_value=2)
def test_rc2(self, _):
"""Test that rc 2 is the exit code."""
sys.argv = ['arg0', 'arg1', 'arg2', …]
runpy.run_module('my_module')
self.assertEqual(mod_rc, 2)
Run Code Online (Sandbox Code Playgroud)
我的问题是,我如何得到我在这里写的“mod_rc”?
谢谢。
Misko Hevery 之前说过(我相信是在《Clean Code Talks: Don't Look for Things》中,但我可能是错的),他不知道如何有效地对主要方法进行单元测试,所以他的解决方案是让它们变得如此简单如果您假设它们调用的(经过单元测试的)代码是正确的,那么您可以从逻辑上证明它们有效。
例如,如果您有一个离散的、经过测试的单元用于解析命令行参数;一个完成实际工作的图书馆;以及一个离散的、经过测试的单元,用于将已完成的工作渲染为输出,然后按顺序调用所有这三个单元的主方法肯定会起作用。
使用这种架构,您基本上可以通过一个大型系统测试来完成,该测试预计会产生除“默认”输出之外的其他内容,并且它要么崩溃(因为您连接不正确),要么工作(因为它连接正确)并且所有单独的部分都可以工作)。
至此,我不再假装自己知道自己在说什么。几乎肯定有更好的方法来做到这一点,但坦率地说,您可以编写一个 shell 脚本:
python -m package args
test $? -eq [expected exit code]
Run Code Online (Sandbox Code Playgroud)
这将退出并出现错误iff,您的程序输出不正确,TravisCI 或类似的将视为构建失败。
| 归档时间: |
|
| 查看次数: |
2867 次 |
| 最近记录: |