0

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

但是当我的测试失败时,AppVeyor 会报告构建成功如果 OpenCover + xUnit 报告测试失败,如何将 AppVeyor 配置为失败?

该脚本基于csMACnz 的示例

.\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 构建失败。

4

3 回答 3

1

我认为原因很简单。按照您编写 YML 文件的方式,AppVeyor 期望整体test_script提供非零返回码,而您留下的 PowerShell 脚本部分中的故障不会导致这种情况。

您必须分别运行每个命令,然后任何失败都会使整个构建失败,正如我的 AppVeyor 脚本所示

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 脚本中,我可以重现您遇到的相同问题。

于 2018-02-08T23:11:18.173 回答
1

同意 Lee 的观点,但更简单的选择是$ErrorActionPreference = "Stop在脚本的开头使用 "。

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

于 2018-02-09T00:53:21.437 回答
0

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

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

.\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 的答案是正确的,因为它是对该问题的最直接和最直接的答案。

于 2018-02-09T02:22:41.850 回答