Docker `覆盖范围是否合并来自不同容器的结果?

Docker `覆盖范围是否合并来自不同容器的结果?,docker,coverage.py,Docker,Coverage.py,复制: 创建一个包含两个服务的项目 使用docker compose run--rm--entrypoint='pipenv run coverage run[…]'[service name]在自己的容器中测试每个服务 使用容器外部的coverage Combine first service/.coverage second service/.coverage组合结果 运行coverage report,或者更糟的是运行coverage html 最后的这些命令找不到源文件,因为.cover

复制:

  • 创建一个包含两个服务的项目
  • 使用
    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中每个文件的最近路径
  • 这样的设置可以将/src/app从一个.coverage映射到service1目录,将/src/app从另一个.coverage映射到service2目录
  • 非解决方案:

    • 不使用Docker
    • 在同一容器中运行两个测试套件
    • 编写脚本以修改组合的.coverage文件

    诀窍是对每个服务使用单独的
    路径
    声明:

    .C-service1:

    [paths]
    source =
        service1
        /src/app
    
    .保险人C-SERVICE 2:

    [paths]
    source =
        service2
        /src/app
    
    这需要两个
    覆盖范围组合
    调用:

    coverage combine --append --rcfile=.coveragerc-service1 service1/.coverage
    coverage combine --append --rcfile=.coveragerc-service2 service2/.coverage
    

    rm.coverage
    首先启用重新运行。)

    我还不了解所有这些,但是可以有多个
    [path]
    条目有帮助吗?为什么这两种服务都使用“/src/app”?难道每个应用程序都不应该有自己的路径吗?我不希望声明两个源代码相同的
    source
    s会起作用。至于你的第二点,它们在不同的容器中运行,因此它们的路径绝对不应该相互依赖。我不是说它们的路径应该相互依赖,但为什么它们是相同的?这是来自不同回购协议的不同代码。为什么它们不是/src/app1和/src/app2?如果出于某种原因,您需要能够为其他一些工具统一引用它们,那么您还可以有一个从/src/app到/src/app1的符号链接,它们不在不同的repo中,为什么我要强制在每个服务上部署到不同的路径?符号链接只是让事情复杂化了,因为现在你说有时使用一条路径,有时使用另一条路径。好吧,也许我不理解Docker的思维方式。对我来说,有两个不同的源树作为同一条路径运行是很奇怪的。使用不同路径的一个原因是其他工具(如coverage.py)可能认为路径有意义。也许我还是错了。我很高兴你找到了解决办法。