首页 > 解决方案 > `coverage combine` 来自不同容器的结果?

问题描述

重现:

  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。

非解决方案:

标签: dockercoverage.py

解决方案


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首先启用重新运行。)


推荐阅读