python - 单元测试 __main__.py

标签 python python-unittest runpy

我有一个 Python 包(Python 3.6,如果它有所不同),我设计它作为 'python -m package arguments' 运行并且我'我想为 __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)

我的问题是,我怎样才能得到我在此处写为“mod_rc”的内容?

谢谢。

最佳答案

Misko Hevery 之前说过(我相信它在 Clean Code Talks: Don't Look for Things 但我可能是错的)他不知道如何有效地对主要方法进行单元测试,所以他的解决方案是让它们变得如此简单以至于你可以证明从逻辑上讲,如果您假设它们调用的(经过单元测试的)代码的正确性,它们就会起作用。

例如,如果您有一个独立的、经过测试的单元来解析命令行参数;做实际工作的库;以及一个用于将完成的工作呈现为输出的离散的、经过测试的单元,然后按顺序调用所有这三个单元的主要方法肯定会起作用。

使用该架构,您基本上可以通过一个大型系统测试来完成,该测试预计会产生除“默认”输出之外的其他内容,并且它会崩溃(因为您连接不当)或工作(因为它是接线正确,所有单独的部件都可以正常工作)。


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

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

这将以错误退出 iff 您的程序输出不正确,TravisCI 或类似软件将认为构建失败。

关于python - 单元测试 __main__.py,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49412706/

相关文章:

python runpy.run_module 退出代码

python - 如何使用 ctypes 读取打包结构

python - Cloud Function触发数据流时如何在数据流中传递requirements.txt参数?

python - 如何编写Python单元测试列名是字符串?

Python mock() 不模拟返回值

python - 使用 unittest 测试 argparse - 退出错误

python - 如何从您的脚本执行另一个 python 脚本并能够调试?

python - 什么是 python runpy 模块?

python - 我如何告诉 sympy i^2 = -1?

python - 如何使用 Twython 将 oauth_callback 值传递给 oauth/request_token