我创建了一个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无法使构建失败。
答案 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的答案标记为正确,因为它是对此问题的最直接和直接的答案。