单元测试__main__.py

时间:2018-03-21 17:15:21

标签: python python-unittest runpy

我有一个Python包(Python 3.6,如果它有所不同)我已经设计为以' python -m 参数运行'我想为__main__.py模块编写单元测试。我特别想验证它是否正确设置了退出代码。是否可以使用runpy.run_module来执行我的__main__.py并测试退出代码?如果是这样,我该如何检索退出代码?

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

@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'?

感谢。

2 个答案:

答案 0 :(得分:2)

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

例如,如果您有一个用于解析命令行参数的离散的,经过测试的单元;做实际工作的图书馆;和一个离散的,经过测试的单元,用于将完成的工作渲染成输出,然后一个主要的方法,按顺序调用所有这三个,肯定会起作用。

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

在这一点上,我放弃了所有想知道我在说什么的借口。几乎可以肯定这是一种更好的方法,但坦率地说,你可以写一个shell脚本:

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

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

答案 1 :(得分:1)

使用pytest,我能够做到:

const parsedCart = { id: 1592539903073, products: [ { productID: 1001, name: "Test Product", qty: 1, options: { Color: "Red", }, }, { productID: 1002, name: "Test Product", qty: 1, options: { Color: "Red", }, }, ], }; const newObj = { productID: 1002, name: "Test Product", qty: 1, options: { Color: "Red", }, }; const index = parsedCart.products.findIndex( (product) => newObj.productID === product.productID && JSON.stringify(newObj.options) === JSON.stringify(product.options) ); console.log(index);

其中mypkgname是您将应用程序命名为包/模块的名称。然后只需正常运行pytest就可以了。我希望这可以帮助其他一些可怜的人。