docker - `coverage combine` 来自不同容器的结果?
问题描述
重现:
- 创建一个包含两个服务的项目。
- 使用 .在其自己的容器中测试每个服务
docker-compose run --rm --entrypoint='pipenv run coverage run […]' [service-name]
。 coverage combine first-service/.coverage second-service/.coverage
使用容器外部组合结果。- 跑
coverage report
,或者更糟,coverage html
。
这些最后的命令找不到源文件,因为 .coverage 文件是使用每个容器中源文件的绝对路径保存的,这与主机不匹配。
有没有办法让覆盖率报告在这种情况下工作?如果可能,以下任何一项都将是有用的:
- 在 .coverage 中记录相对路径,并在组合 .coverage 文件中的路径前加上包含原始 .coverage 文件的目录。
- 在 .coverage 文件中包含源文件。如果在文件更改后进行报告,则特别有用。
- 在报告时启发式地检测 .coverage 中每个文件的最接近路径。
- 这样的设置
paths
可以将 /src/app 从一个 .coverage 映射到 service1 目录,将 /src/app 从另一个 .coverage 映射到 service2。
非解决方案:
- 不使用 Docker。
- 在同一个容器中运行两个测试套件。
- 编写脚本来修改组合的 .coverage 文件。
解决方案
paths
诀窍是对每个服务使用单独的声明:
.coveragerc-service1:
[paths]
source =
service1
/src/app
.coveragerc-service2:
[paths]
source =
service2
/src/app
这需要两个coverage combine
调用:
coverage combine --append --rcfile=.coveragerc-service1 service1/.coverage
coverage combine --append --rcfile=.coveragerc-service2 service2/.coverage
(rm .coverage
首先启用重新运行。)
推荐阅读
- python - 我无法安装 pip 模块
- xamarin - MvvmCross 迁移导致 Xamarin Custom iOS View Presenter 问题
- python - 如何使用导数和梯度体面来找到最小化函数的 x 值
- airflow - Apache Atlas 和 Airflow 集成
- php - Json解码成php
- javascript - 用户输入功能无法正常工作?
- if-statement - 错误!条件 MS Word 365 的未知操作码
- angular - igx 网格内联功能不适用于自定义列
- docker - 从 docker-compose.yml 引用 Dockerfile?
- lua - 罗布洛克斯 || game.Players.LocalPlayer.Name 尝试调用字符串值?