多个模块的 Python 单元测试覆盖率

Posted

技术标签:

【中文标题】多个模块的 Python 单元测试覆盖率【英文标题】:Python unit test coverage for multiple modules 【发布时间】:2018-05-09 20:51:53 【问题描述】:

找了半天,居然没有满意的答案。

我的 Python 项目中有多个模块/文件,我为使用 unittest 编写了单元测试。结构是这样的,我在一个目录中有生产模块module_A.pymodule_B.py(比如myproject/production),在同级目录中有相应的测试文件test_module_A.pytest_module_B.py(比如myproject/tests)。

现在我已经安装了coverage.py 并且想要运行与该项目相关的所有测试(即所有.py-文件,前缀为test_ 来自tests 目录)并接收显示覆盖率的覆盖率报告对于所有生产模块(module_A.pymodule_B.py)。

我发现我可以通过从myproject/tests 目录运行以下命令来做到这一点:

coverage erase coverage run -a --source myproject.production test_module_A.py coverage run -a --source myproject.production test_module_B.py coverage report

这为我提供了一张漂亮的表格,其中列出了我的所有生产模块及其覆盖结果。到目前为止一切顺利。

但是我可以只用一个命令来完成这项工作吗?假设我想要包含在一份报告中的不是 2 个而是 20 或 200 个测试,那么“手动”执行此操作似乎很荒谬。 p>

必须有一种方法可以自动执行此操作,但我似乎找不到它。当然,shell 脚本可以做到这一点,但这是相当笨拙的。我正在考虑类似于unittest discover 的东西,但对于coverage.py,这似乎不起作用。

或者我可以使用 coverage-API 以某种方式完成此任务吗?到目前为止,我没有运气尝试。

.

解决方案:(感谢 Ned Batchelder 先生)

myproject/tests目录运行:

coverage run --source myproject.production -m unittest discover && coverage report

一行,做需要做的事。

【问题讨论】:

你知道nose2吗,可以试试。 github.com/nose-devs/nose2 【参考方案1】:

应该这样做:

coverage.py run -m unittest discover

【讨论】:

正是我想要的。我知道我只是错过了关于你的包裹的一些东西。谢谢!我的完整解决方案是coverage run --source myproject.production -m unittest discover && coverage report。像魅力一样工作。

以上是关于多个模块的 Python 单元测试覆盖率的主要内容,如果未能解决你的问题,请参考以下文章

为多个 Python 文件编写单元测试

用idea在测试多个特定目录下的单元覆盖率覆盖情况

python中的单元测试模块unittest

单元测试中的白盒测试设计

徒手搭建Python单元测试框架

python的测试