gitlab - 将 pytest 覆盖率附加到 Gitlab CI 工件中的文件

标签 gitlab pytest gitlab-ci pytest-cov

我正在尝试将我的 pytests 拆分到 gitlab 阶段,以减少运行它们所需的时间。然而,我很难获得完整的报道报告。由于我们数据库的设置方式,我无法使用 pytest-xdist 或 pytest-parallel。

Build:
  stage: Build
  script:
    - *setup-build
    - *build
    - touch banana.xml   # where I write the code coverage collected by pytest-cov
    - *push
  artifacts:
    paths:
    - banana.xml
    reports:
      cobertura: banana.xml

Unit Test:
  stage: Test
  script:
    - *setup-build
    - *pull
    - docker-compose run $DOCKER_IMG_NAME pytest -m unit --cov-report xml:banana.xml --cov=app --cov-append;
  needs:
    - Build

Validity Test:
  stage: Test
  script:
    - *setup-build
    - *pull
    - docker-compose run $DOCKER_IMG_NAME pytest -m validity --cov-report xml:banana.xml --cov=app --cov-append;
  needs:
    - Build

运行这两个阶段(构建 - 1 个作业,测试 - 2 个作业)后,我从 Gitlab 下载了banana.xml 文件,但其中没有任何内容,即使作业说 Coverage XML write to file香蕉.xml

在 gitlab 管道阶段拆分标记的测试时,我是否遗漏了如何将总覆盖率写入工件文件?

最佳答案

如果您想合并多个不同作业的覆盖率报告,则必须添加另一个阶段,该阶段将在测试后运行。这是我的一个工作示例:

# You need to define the Test stage before the Coverage stage
stages:
  - Test
  - Coverage

# Your first test job
unit_test:
  stage: Test
  script:
    - COVERAGE_FILE=.coverage.unit coverage run --rcfile=.coveragerc -m pytest ./unit
  artifacts:
    paths:
      - .coverage.unit

# Your second test job which will run in parallel
validity_test:
  stage: Test
  script:
    - COVERAGE_FILE=.coverage.validity coverage run --rcfile=.coveragerc -m pytest ./validity
  artifacts:
    paths:
      - .coverage.validity

# Your coverage job, which will combine the coverage data from the two tests jobs and generate a report
coverage:
  stage: Coverage
  script:
    - coverage combine --rcfile=.coveragerc
    - coverage report
    - coverage xml -o coverage.xml
  coverage: '/\d+\%\s*$/'
  artifacts:
    reports:
      cobertura: coverage.xml

您还需要在存储库中创建一个包含以下内容的.coveragerc文件,以指定coverage.py需要使用相对文件路径,因为您的测试是在不同的gitlab运行器上运行的,所以他们的完整路径不匹配:

[run]
  relative_files = True
  source =
  ./

注意:在您的情况下,最好直接使用 coverage 命令(因此 coverage run -m pytest 而不是 pytest ),因为它提供了更多选项,而且这也是 pytest 在幕后使用的。


文件中的问题是,您首先创建一个空文件,尝试从中生成报告(由于文件为空,因此不会生成任何内容),然后将其传递给两个测试作业,这两者都分别用本地覆盖报告覆盖它,然后从不使用它。

您需要以相反的方式进行操作,如我的示例所示:首先运行测试,然后在稍后阶段获取测试覆盖率数据,并从中生成报告。

关于gitlab - 将 pytest 覆盖率附加到 Gitlab CI 工件中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68413225/

相关文章:

docker - Gitlab 的 artifacts zip 文件是空的

gitlab - 在 Gitlab 中重用项目标签?

heroku - 使用 GitLab CI.yml 登录 Heroku

python - pytest:如何覆盖python程序中的命令行选项?

gitlab - 当每天多次调度管道(比代码更改更频繁)时,自定义管道列表

postgresql - 在 Gitlab CI 上设置 postgis

python - 如何在 pytest 2.5.1 中注册标记?

python - pytest 参数化 fixture - 来自 json 的参数?

continuous-integration - 我应该如何在生产服务器上部署 CI/CD 管道的结果

gitlab -/bin/sh : eval: line 98: bash: not found