`coverage combine` 来自不同容器的结果?

`coverage combine` results from different containers?

重现:

  1. 创建一个包含两个服务的项目。
  2. 使用 docker-compose run --rm --entrypoint='pipenv run coverage run […]' [service-name] 在其自己的容器中测试每个服务。
  3. 在容器外使用 coverage combine first-service/.coverage second-service/.coverage 合并结果。
  4. 运行 coverage report,或者更糟,coverage html.

这些最后的命令找不到源文件,因为 .coverage 文件是用每个容器中源文件的绝对路径保存的,这与主机不匹配。

有没有办法让覆盖率报告在这种情况下起作用?如果可能,以下任何一项都会有用:

  1. 记录 .coverage 中的相对路径,并在组合的 .coverage 文件中的路径前加上包含原始 .coverage 文件的目录。
  2. 在 .coverage 文件中包含源文件。如果在文件更改后发生报告,则特别有用。
  3. 在报告时启发式检测 .coverage 中每个文件的最接近路径。
  4. paths 这样的设置可以将 /src/app 从一个 .coverage 映射到 service1 目录,并将 /src/app 从另一个 .coverage 映射到 service2。

非解决方案:

诀窍是对每个服务使用单独的 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先启用再运行。)