执行覆盖率报告时"无要报告的数据"



我使用django.test进行单元测试

起初我运行

coverage run ./manage.py test audit.lib.tests.test_prune

并且运行良好

----------------------------------------------------------------------
Ran 1 test in 1.493s
OK

但当我运行coverage report时,意外发生了,它应该按预期显示一些报告,但No data to report

root@0553f9cad609:/opt/buildaudit# coverage report
No data to report.

我不知道,这让我困惑了一整天。。谢谢大家!

我的一些测试执行了辅助程序,我也想收集这些程序的覆盖率结果。这意味着coverage必须同时在多个进程中收集和存储度量。通常,它将它们存储在一个名为.coverage的文件中,这在并行收集度量时不起作用。相反,coverage需要被告知将结果存储在单独的文件中,每个进程一个,并为其提供唯一的文件名。根据文档,这可以通过将其添加到.coveragerc.中来完成

[run]
parallel = True

报告生成器,如coverage html,期望将这些结果组合到一个文件中。这可以通过在测试完成后和尝试从中创建报告之前运行此操作来完成。

% coverage combine

不这样做会在问题中产生无数据可报告错误。彭群忠首先提出了这一点。


超越这个问题,这实际上不足以让我从所有子过程中获得测量结果。这些文档很好地描述了其中的微妙之处和解决方案,但我将总结我所选择的内容。我使用多处理模块来启动一些子进程,因此我必须在.coveragerc.的[run]部分中添加以下内容

concurrency = multiprocessing

此外,子进程需要告诉coverage收集度量,因为与顶级测试不同,子进程不是由coverage运行的。为此,我在每个子流程的代码顶部添加了以下内容。有关其他选项,请参见参考。

import os
if "COVERAGE_PROCESS_START" in os.environ:
import coverage
coverage.process_startup()

这里使用的环境变量由coverage识别;不要重命名它。此外,我用以下内容运行了测试。我使用pytest,但其他测试框架也会使用类似的方法。还有一个pytest插件可以提供帮助。

% COVERAGE_PROCESS_START=.coveragerc coverage run pytest

最后,一些测试及其子流程需要进行小的更改,以确保coverage在流程终止时能够保存其结果。不礼貌的退出、SIGKILL等阻止了这种情况的发生。coverage在atexit钩子中写入结果,如果您有coverage6.3或更新版本,也可以在SIGTERM的信号处理程序中写入结果。如果您的子进程以任何其他方式终止,coverage将无法保存其结果。在我的情况下,我通常从子进程的父进程向其发送SIGTERM。使用子流程的父级。例如,Popen对象就是这样做的。

kid.terminate()

最新更新