并行覆盖 Django 测试
coverage in parallel for django tests
我是运行下面的一个Makefile
:
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__.:
您错过了一些步骤,来自 Measuring sub-processes:
- 将 coverage 运行 命令更改为这个:
COVERAGE_PROCESS_START=./.coveragerc-app coverage run
--parallel-mode --concurrency=multiprocessing
--rcfile=./.coveragerc-app manage.py test -v 3 --parallel=$(NPROCS) app
- 在您的本地文件夹中创建一个名为 sitecustomize.py 的文件
import coverage
coverage.process_startup()
- 在您的 rcfile(运行 部分)中添加并发选项:
concurrency=multiprocessing
Coverage should be run in a single process to obtain accurate statistics.
不是这个问题的答案,但对于那些希望以这种方式优化他们的项目的人来说,了解 Django 维护者不推荐它可能会有所帮助。
阅读上面答案中链接的覆盖率文档,也许它已经更新,因为仅执行以下操作似乎对我们的 Django 项目有效:
coverage run --concurrency=multiprocessing manage.py test app --parallel=3
coverage combine
coverage report
我是运行下面的一个Makefile
:
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__.:
您错过了一些步骤,来自 Measuring sub-processes:
- 将 coverage 运行 命令更改为这个:
COVERAGE_PROCESS_START=./.coveragerc-app coverage run
--parallel-mode --concurrency=multiprocessing
--rcfile=./.coveragerc-app manage.py test -v 3 --parallel=$(NPROCS) app
- 在您的本地文件夹中创建一个名为 sitecustomize.py 的文件
import coverage
coverage.process_startup()
- 在您的 rcfile(运行 部分)中添加并发选项:
concurrency=multiprocessing
Coverage should be run in a single process to obtain accurate statistics.
不是这个问题的答案,但对于那些希望以这种方式优化他们的项目的人来说,了解 Django 维护者不推荐它可能会有所帮助。
阅读上面答案中链接的覆盖率文档,也许它已经更新,因为仅执行以下操作似乎对我们的 Django 项目有效:
coverage run --concurrency=multiprocessing manage.py test app --parallel=3
coverage combine
coverage report