django测试并行覆盖

时间:2017-03-10 15:23:16

标签: django coverage.py

我通过Makefiel运行以下内容:

NPROCS:=$(shell /usr/bin/nproc)

.PHONY: coverage-app
coverage-app:
    coverage erase --rcfile=./.coveragerc-app
    coverage run --parallel-mode --rcfile=./.coveragerc-app manage.py test -v 3 --parallel=$(NPROCS) app
    coverage combine --rcfile=./.coveragerc-app
    coverage report -m --rcfile=./.coveragerc-app

如果我将NPROCS设置为1,我会获得app内所有文件的预期100%测试覆盖率。但是,如果NPROCS大于1,我的报告中会有很多缺少的行。

我做错了什么?

我的.coveragerc-app如下:

# Control coverage.py
[run]
branch = True
omit = */__init__*
       */test*.py
       */migrations/*
       */urls.py
       app/admin.py
       app/apps.py
source = app
parallel = true

[report]
precision = 1
show_missing = True
ignore_errors = True
exclude_lines =
    pragma: no cover
    raise NotImplementedError
    except ImportError
    def __repr__
    if self\.logger\.debug
    if __name__ == .__main__.:

2 个答案:

答案 0 :(得分:11)

您错过了Measuring sub-processes的几个步骤:

1)将 coverage run 命令更改为以下命令:

COVERAGE_PROCESS_START=./.coveragerc-app coverage run --parallel-mode --concurrency=multiprocessing --rcfile=./.coveragerc-app manage.py test -v 3 --parallel=$(NPROCS) app

2)使用

在本地文件夹中创建名为 sitecustomize.py 的文件
import coverage
coverage.process_startup()

3)在你的rcfile中添加并发选项:

concurrency=multiprocessing

答案 1 :(得分:1)

the documentation

  

覆盖范围应在单个过程中运行以获取准确的统计信息。

不是这个问题的答案,但是对于那些希望以这种方式优化项目的人来说,知道Django维护人员不建议这样做可能会有所帮助。