如何让VSTest把失败记录为真正的失败,而不是当作警告?

前端开发 2026-07-12

我们有一个YAML测试脚本,其步骤对前面的作业有依赖。

作业1 将构建烟雾测试应用并随后运行它。如果VSTest步骤失败,我们看到的状态是警告状态,而不是失败,如下所示。

enter image description here

这会导致后续步骤出现问题,其中一个步骤的条件设为成功,另一个设为失败;尽管测试失败,已成功的步骤仍会执行,而不是失败的步骤。如何让测试步骤在测试失败时被标记为失败?下面显示的YAML:

- stage: RunTheSmokeTests
  displayName: Smoke Tests
  jobs:
  - job: GetAndRunSmokes
    steps:
    - task: NuGetToolInstaller@1
      displayName: 'Install NuGetTool'

    - task: NuGetCommand@2
      displayName: 'NuGet Restore'
      inputs:
        restoreSolution: '$(solution)'

    - task: VSBuild@1
      displayName: DeltaTestsBuild
      inputs:
        solution: '$(solution)'
        msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"' 
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'              

    - script: pwsh D:\a\1\s\DeltaSmokeTests\bin\Release\net9.0\playwright.ps1 install chromium --with-deps --only-shell
      displayName: 'Install Playwright runtimes'

    - task: VSTest@3
      displayName: VsTest - Dashboard
      inputs:
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
        testSelector: testAssemblies
        testAssemblyVer2: |
          D:\a\1\s\DeltaSmokeTests\bin\Release\net9.0\SmokeTests.dll
          !**\obj\**
        testFiltercriteria: 'TestCategory=DeltaDashboard'
        testRunTitle: 'Delta Regression DeltaDashboard'
        runTestsInIsolation: true
        rerunFailedTests: true
        rerunFailedThreshold: 50
        rerunMaxAttempts: 2
      continueOnError: true
      condition: succeededOrFailed()
      timeoutInMinutes: 10

  - job: NotifyTeamsChannelIfTestsPass
    dependsOn: DeletaGetAndRunSmokes
    condition: succeeded()
    steps:
      - task: PowerShell@2
        displayName: 'Notify Teams Channel all tests passed'
        condition: succeededOrFailed()
        inputs: etc etc

  - job: NotifyTeamsChannelIfTestsFail
    dependsOn: DeletaGetAndRunSmokes
    condition: failed() 
    steps:
      - task: PowerShell@2
        displayName: 'Notify Teams Channel some tests failed'
        condition: succeededOrFailed()
        inputs: etc etc

  - job: CreateReportFiles
    dependsOn: DeletaGetAndRunSmokes 
    condition: always()
    steps:
    - task: CopyFiles@2
      displayName: 'Copy Report Files to: $(build.artifactstagingdirectory)'
      inputs:
        SourceFolder: '$(system.defaultworkingdirectory)'
        Contents: '**/TestResults/**'
        TargetFolder: '$(build.artifactstagingdirectory)'
      condition: succeededOrFailed()

    - task: PublishBuildArtifacts@1
      displayName: 'Publish HTML Report Files'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
      condition: succeededOrFailed()

解决方案

你的 vstest 步骤包含 continueOnError: true,这将导致任务的状态无论结果如何都被标记为 succeeded

如果你希望测试失败时将该步骤标记为失败,需要把 continueOnError 设置为 false

如果你还想在失败后继续执行其他步骤,可以添加 condition: always()(在管道被取消时也会执行)或 condition: succeededOrFailed(),就像现在的情况一样。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章