`coverage combine` 来自不同容器的结果?
`coverage combine` results from different containers?
重现:
- 创建一个包含两个服务的项目。
- 使用
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
先启用再运行。)
重现:
- 创建一个包含两个服务的项目。
- 使用
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
先启用再运行。)