AppVeyor + OpenCover + xUnit - 测试失败时,Build不会失败

时间:2018-02-08 22:24:33

标签: c# xunit opencover appveyor coveralls

我创建了一个AppVeyor Build Script,它使用OpenCover和Coveralls.Net来运行我的xUnit测试并将代码覆盖率发布到Coveralls.io。

但是当我测试失败时 - AppVeyor会报告build successful如果OpenCover + xUnit报告测试失败,如何配置AppVeyor失败?

该脚本基于csMACnz's sample

.\src\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe 
   -register:user 
   -target:"xunit.console.clr4.exe"  
   "-targetargs:""src\HttpWebRequestWrapper.Tests\bin\$env:CONFIGURATION\HttpWebRequestWrapper.Tests.dll"" 
   /noshadow 
   /appveyor" 
   -filter:"+[HttpWebRequestWrapper*]*" 
   -output:opencoverCoverage.xml

    $coveralls = (Resolve-Path "src/packages/coveralls.net.*/tools/csmacnz.coveralls.exe").ToString()
    & $coveralls --opencover -i opencoverCoverage.xml --repoToken $env:COVERALLS_REPO_TOKEN --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_JOB_ID

我尝试将-returntargetcode标记添加到OpenCover.Console.exe代码中,但这似乎并不表示AppVeyor无法使构建失败。

3 个答案:

答案 0 :(得分:1)

我认为原因很简单。按照你编写YML文件的方式,AppVeyor希望整个test_script提供非零返回码,而你留下的PowerShell脚本部分内的失败不会导致这种情况。

您必须单独运行每个命令,然后任何失败都将导致整个构建失败,如my AppVeyor script shows

test_script:
  - dotnet test Tests\CSharpCore\Tests.NetStandard.csproj --configuration Release --no-build --filter "FullyQualifiedName~Lextm.SharpSnmpLib.Integration.TrapDaemonTestFixture"
  - dotnet test Tests\CSharpCore\Tests.NetStandard.csproj --configuration Release --no-build --filter "FullyQualifiedName~Lextm.SharpSnmpLib.Integration.DaemonTestFixture"
  - dotnet test Tests\CSharpCore\Tests.NetStandard.csproj --configuration Release --no-build --filter "FullyQualifiedName~Lextm.SharpSnmpLib.Unit"

如果我将这三个命令包装在批处理文件或PowerShell脚本中,我可以重现您遇到的相同问题。

答案 1 :(得分:1)

同意Lee,但更简单的选择是在您的脚本开头有$ErrorActionPreference = "Stop“。

在下面的帖子中查看您的评论,即使出现故障,也需要执行所有命令。我这个案例看ErrorVariable。好的讨论和样本是here

答案 2 :(得分:0)

看起来有几种方法可以从AppVeyor中获得所需的行为。我最终使用了AppVeyor Discussion Thread @ilyaf发布的$LastExitCode

这种方法最终给了我更大的灵活性 - 我可以继续运行我的整个测试脚本,但如果任何特定的部分失败,仍然无法通过测试步骤:

.\src\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe 
  -register:user 
  -target:"xunit.console.clr4.exe"  
  "-targetargs:""src\HttpWebRequestWrapper.Tests\bin\$env:CONFIGURATION\HttpWebRequestWrapper.Tests.dll"" 
  /noshadow 
  /appveyor" 
  -filter:"+[HttpWebRequestWrapper*]*" 
  -output:opencoverCoverage.xml

$testRunnerErrorCode = $LastExitCode

#can move this to end of script if I want to still publish code coverage
#for failed tests
if ($testRunnerErrorCode -ne 0){
   throw "xUnit failed with code $testRunnerErrorCode "
}


$coveralls = (Resolve-Path "src/packages/coveralls.net.*/tools/csmacnz.coveralls.exe").ToString()
& $coveralls --opencover -i opencoverCoverage.xml --repoToken  $env:COVERALLS_REPO_TOKEN --commitId $env:APPVEYOR_REPO_COMMIT --commitBranch $env:APPVEYOR_REPO_BRANCH --commitAuthor $env:APPVEYOR_REPO_COMMIT_AUTHOR --commitEmail $env:APPVEYOR_REPO_COMMIT_AUTHOR_EMAIL --commitMessage $env:APPVEYOR_REPO_COMMIT_MESSAGE --jobId $env:APPVEYOR_JOB_ID

我要将Lex的答案标记为正确,因为它是对此问题的最直接和直接的答案。