当前位置: 首页 > 知识库问答 >
问题:

Azure Devops上React App的Cobertura格式代码覆盖率报告

段干弘毅
2023-03-14

我有一个反应应用,使用 npx 创建-反应-应用命令创建,并为 CI/CD 配置了一个基于 yaml 的 Azure DevOps 管道。然后我添加了一些简单的单元测试。

我在yaml管道中添加了一个脚本任务,以生成如下覆盖率结果。

- script: |
    cd reactonazure
    npm run test -- --coverage --ci --reporters=default --reporters=jest-junit --coverageReporters=cobertura
  displayName: 'test code coverage'

但是这个任务显示以下输出,然后任务继续运行,永远不会结束。我必须取消管道运行才能最终停止它。不知道发生了什么。有什么想法吗?

No tests found related to files changed since last commit.

但是,当我以CI =true作为前缀以按如下方式创建命令时,该命令工作正常,我得到了测试结果,但没有找到覆盖率报告(cobertura覆盖率.xml)。

CI=true npm test -- --reporters=jest-junit --reporters=default --coverageReporters=cobertura 

我添加了一个简单的脚本任务,如下所示,以列出文件和文件夹,以便我搜索 cobertura 覆盖范围.xml。但是我没有找到该文件。请注意,正在创建 jest.xml 文件。这就是我能够看到上面显示的测试结果的原因。问题出在测试覆盖率报告上。

- script: |
    pwd
    cd ..
    pwd
    ls -Rla
  displayName: 'list out the files and folders for inspection'
 

另外,当我在我的机器(Windows 10)上的vs code命令提示符下运行下面的命令时,我确实在coverage文件夹中看到了一个名为cobertura-coverage.xml的文件。

npm run test -- --coverage --ci --reporters=default --reporters=jest-junit --coverageReporters=cobertura

完整的管道yaml粘贴在下面。

trigger:
- master

variables:

  azureSubscription: 'AzureServiceConnection'

  # Web app name
  webAppName: BasicReactApp

  # Environment name
  environmentName: Dev

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)

    steps:
    - task: NodeTool@0
      inputs:
        versionSpec: '16.x'
      displayName: 'Install Node.js'

    - script: |
        cd reactonazure
        npm install
        npm run build --if-present
      displayName: 'npm install, build '

    - script: |
        cd reactonazure
        CI=true npm test -- --reporters=jest-junit --reporters=default --coverageReporters=cobertura 
      displayName: 'test code coverage'


    - task: PublishTestResults@2
      displayName: "Publish Test Results"
      inputs:
        testResultsFormat: 'JUnit'
        testResultsFiles: 'reactonazure/junit.xml'
        failTaskOnFailedTests: true
        mergeTestResults: true
      condition: succeededOrFailed()

    # The following, two are not functioning as no coverage.cobertura.xml file is being created.
    - task: PublishCodeCoverageResults@1
      displayName: "Publish code coverage"
      inputs:
        codeCoverageTool: Cobertura
        summaryFileLocation: "reactonazure/$(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml"
        reportDirectory: "reactonazure/$(System.DefaultWorkingDirectory)/coverage"
        failIfCoverageEmpty: false

    - task: PublishCodeCoverageResults@1
      displayName: 'Publish code coverage report'
      inputs:
        codeCoverageTool: 'Cobertura'
        summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
        failIfCoverageEmpty: true

有没有其他方法可以在管道上生成报告?

共有2个答案

章威
2023-03-14

生成我前面介绍的报告的命令不起作用。下面的工作终于开始了。

CI=true npm run test -- --coverage --watchAll=false --ci --reporters=default --reporters=jest-junit --coverageReporters=cobertura

考虑到建议的答案后的完整和最终yaml如下。

trigger:
- master

variables:

  azureSubscription: 'AzureServiceConnection'

  webAppName: BasicReactApp

  environmentName: Dev

  vmImageName: 'ubuntu-latest'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    pool:
      vmImage: $(vmImageName)

    steps:
    - task: NodeTool@0
      inputs:
        versionSpec: '16.x'
      displayName: 'Install Node.js'

    - script: |
        cd reactonazure
        npm install
        npm run build --if-present
     displayName: 'npm install, build '

    - script: |
        cd reactonazure
        CI=true npm run test -- --coverage --watchAll=false --ci --reporters=default --reporters=jest-junit --coverageReporters=cobertura 
      displayName: 'Test with code coverage'

    - task: PublishTestResults@2
      displayName: "Publish Test Results"
      inputs:
        testResultsFormat: 'JUnit'
        testResultsFiles: 'reactonazure/junit.xml'
        failTaskOnFailedTests: true
        mergeTestResults: true
      condition: succeededOrFailed()

    - task: PublishCodeCoverageResults@1
      displayName: "Publish code coverage"
      inputs:
        codeCoverageTool: Cobertura
        summaryFileLocation: "$(System.DefaultWorkingDirectory)/reactonazure/coverage/cobertura-coverage.xml"
        reportDirectory: "$(System.DefaultWorkingDirectory)/reactonazure/coverage"
        failIfCoverageEmpty: false

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(System.DefaultWorkingDirectory)/reactonazure/build'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      artifact: drop

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: Deploy
    displayName: Deploy
    environment: $(environmentName)
    pool:
      vmImage: $(vmImageName)
    strategy:
      runOnce:
        deploy:
          steps:
          - task: AzureWebApp@1
            displayName: 'Azure Web App Deploy'
            inputs:
              azureSubscription: $(azureSubscription)
              #appType: webAppLinux
              appType: webApp
              appName: $(webAppName)
              runtimeStack: 'NODE|16.x'
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
              startUpCommand: 'npm run start'
竺勇
2023-03-14

您提供给覆盖范围文件的路径不正确。它应该是$(系统.默认工作目录)/反应/覆盖/共故障转移覆盖率.xml

该任务将如下所示:

- task: PublishCodeCoverageResults@1
  displayName: "Publish code coverage"
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: "$(System.DefaultWorkingDirectory)/reactonazure/coverage/cobertura-coverage.xml"
    reportDirectory: "$(System.DefaultWorkingDirectory)/reactonazure/coverage"
    failIfCoverageEmpty: false
 类似资料:
  • 我正在为我的grails 3.1.6项目添加cobertura代码覆盖率,覆盖率报告似乎有点少,即我有单元测试用例(pos和neg两种情况)来覆盖if块,但报告说没有覆盖if块。gradle:2.13 Groovy:2.4.5 Grails:3.1.6 cobertura gradle Plugin:net.saliman:gradle-cobertura-plugin:2.3.2 这是我的代码

  • 我正在使用Cobertura maven插件[2.7版]来了解测试的代码覆盖率。我正在使用PowerMock[1.6.6]模拟依赖对象。但是当我运行mvn cobertura:cobertura并检查报告时,覆盖率保持不变。当我不使用嘲弄的时候,它很好用。这是兼容性问题吗?我多次尝试mvn clean,只是为了确保报告是新生成的。 这是我的pom.xml 对此我们非常感谢您的帮助。

  • 问题内容: 我正在使用声纳来衡量代码质量。我不知道的一件事是使用Cobertura测量代码覆盖率的步骤。 我按照http://cobertura.sourceforge.net/anttaskreference.html中的步骤进行操作,并且能够生成xml文件。如何将这些xml文件放入SONAR? 有没有在SONAR中使用Cobertura的简便方法? 我在与SONAR服务器不同的服务器上运行代码

  • 问题内容: 我正在使用Cobertura进行代码覆盖率分析。如果我在詹金斯(Jenkins)中运行构建,则覆盖范围结果中将包含其中的类,但覆盖率为 0% 。如果我在工作区(Eclipse)中运行代码覆盖率,则覆盖率会更高。包装的覆盖范围还可以。我错过了一些配置吗? 我的项目结构如下: 我的cobertura配置在POM文件中: 问题答案: 生成的代码不应进行测试,并且不应在代码覆盖率指标中使用。原

  • 我正在分析一个经过单元测试和Cobertura覆盖的Java项目。报告了xml。我正在使用SonarQube 4.1.1和最新的SonarRunner。我已经成功地将Cobertura覆盖率结果导入到Sonar 3.2和Ant analyzer,但在这个新版本中,我遇到了问题。在新的声纳分析执行(通过Jenkins)中,我在日志中没有看到它会启动任何Cobertura引擎或任何东西。我在Runne

  • 我使用jenkins的代码为每个插件生成覆盖率,并显示我喜欢的管道。是否有一个插件我可以使用它(例如Cobertura,但它似乎不受管道支持)?