关于python:单元测试__main__.py

Unit testing __main__.py

我有一个python包(python 3.6,如果有区别的话),我设计它作为"python-m package arguments"运行,我想为uuu主模块编写单元测试。我特别想验证它是否正确设置了退出代码。是否可以使用run py.run_模块执行我的主程序并测试退出代码?如果是,如何检索退出代码?

更清楚地说,我的主模块非常简单。它只是调用一个经过广泛单元测试的函数。但是,当我最初编写uuMain_uuy.py时,我忘记将该函数的结果传递给exit(),所以我希望在模拟主函数的地方进行单元测试,以确保正确设置了退出代码。我的单元测试看起来像:

1
2
3
4
5
6
@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)

我的问题是,我如何才能得到我在这里写的"mod_rc"?

谢谢。


Misko Hevery以前说过(我相信这是在干净的代码对话中:不要找东西,但我可能错了),他不知道如何有效地对主要方法进行单元测试,所以他的解决方案是使它们变得如此简单,如果你假设它们调用的(单元测试的)代码是正确的,你就可以从逻辑上证明它们是有效的。

例如,如果您有一个用于解析命令行参数的离散的、经过测试的单元;一个执行实际工作的库;以及一个用于将完成的工作呈现到输出中的离散的、经过测试的单元,那么一个调用所有三个按顺序执行的主方法肯定可以工作。

使用这种体系结构,您基本上只需要一个大型系统测试就可以通过了,该测试预期会产生除"默认"输出以外的其他输出,它要么崩溃(因为您不正确地连接了它),要么工作(因为它正确地连接了,并且所有的单个部分都工作)。

在这一点上,我不再假装知道我在说什么。几乎可以肯定,有更好的方法可以做到这一点,但坦率地说,您可以编写一个shell脚本:

1
2
python -m package args
test $? -eq [expected exit code]

这将退出错误iff您的程序输出不正确,Travisci或类似将视为构建失败。