Powershell 如何在Team Build 2013测试后脚本中检测测试运行是否成功?

Powershell 如何在Team Build 2013测试后脚本中检测测试运行是否成功?,powershell,tfs,tfsbuild,Powershell,Tfs,Tfsbuild,我在TFS 2013中有一个生成配置,它生成版本化的生成工件。此生成使用现成的流程模板工作流。我想在单元测试失败时销毁构建工件,只留下日志文件。我有一个测试后的powershell脚本。如何在此脚本中检测测试失败 以下是我的测试后脚本中的相关清理方法: function Clean-Files($dir){ if (Test-Path -path $dir) { rmdir $dir\* -recurse -force -exclude logs,"$NewVersion" }

我在TFS 2013中有一个生成配置,它生成版本化的生成工件。此生成使用现成的流程模板工作流。我想在单元测试失败时销毁构建工件,只留下日志文件。我有一个测试后的powershell脚本。如何在此脚本中检测测试失败

以下是我的测试后脚本中的相关清理方法:

function Clean-Files($dir){
    if (Test-Path -path $dir) { rmdir $dir\* -recurse -force -exclude logs,"$NewVersion" }
    if(0 -eq 1) { rmdir $dir\* -recurse -force -exclude logs }
}
Clean-Files "$Env:TF_BUILD_BINARIESDIRECTORY\"
$testRunSucceeded = (sqlcmd -S .\sqlexpress -U sqlloginname -P passw0rd -d Tfs_DefaultCollection -Q "select State from tbl_TestRun where BuildNumber='$Env:TF_BUILD_BUILDURI'" -h-1)[0].Trim() -eq "3"

如何测试函数中的测试成功?

这不是一个直接的答案,但是。。。我们只是将保留策略设置为只保留x个版本。如果测试失败,工件不会被推到下一步

在我们的Jenkins设置中,每次新构建都会清除工件,所以这不是问题。只有通过的构建才会触发将工件推送到Octopus NuGet服务器的步骤。

(根据更多信息更新)

实现这一点的方法是使用环境变量并在PowerShell脚本中读取它们。不幸的是,powershell脚本每次都在一个新进程中运行,因此您不能依赖正在填充的环境变量

也就是说,有一个变通方法,您仍然可以获得这些值。它包括在powershell脚本开始时调用一个小实用程序,如本文所述:

最简单的方法(无需自定义构建模板等)是在测试后脚本中执行以下操作:

function Clean-Files($dir){
    if (Test-Path -path $dir) { rmdir $dir\* -recurse -force -exclude logs,"$NewVersion" }
    if(0 -eq 1) { rmdir $dir\* -recurse -force -exclude logs }
}
Clean-Files "$Env:TF_BUILD_BINARIESDIRECTORY\"
$testRunSucceeded = (sqlcmd -S .\sqlexpress -U sqlloginname -P passw0rd -d Tfs_DefaultCollection -Q "select State from tbl_TestRun where BuildNumber='$Env:TF_BUILD_BUILDURI'" -h-1)[0].Trim() -eq "3"
让我们把这个分开:

  • sqlcmd.exe是必需的;它与SQL Server一起安装,默认情况下位于路径中。如果您在没有SQL Server的计算机上进行构建,请安装
  • -S参数是TFS服务器的服务器+实例名称,例如本地计算机上的“sqlexpress”实例
  • 可以像我的示例那样使用SQL登录名/密码组合,也可以在SQL Server上为TFS构建帐户提供一个帐户(首选)。授予帐户对TFS实例数据库的只读访问权限
  • TFS实例数据库的名称类似于“TFS_DefaultCollection”
  • sqlcmd语句末尾的“-h-1”部分告诉sqlcmd输出不带标题的查询结果;[0]选择第一个结果;删除前导空格时需要修剪();状态“3”表示所有测试均通过
  • 也许有一天微软会发布一个很好的RESTAPI,提供对测试运行/结果信息的访问。不过别屏住呼吸,我已经等了六年了。同时,直接访问TFS DB是一种安全可靠的方法


    希望这是有用的

    如果某些目录内容未被删除,并且该目录并非真正为空,则失败?或者只是
    remove Item
    cmdlet中的错误?失败是单元测试在单元测试运行期间失败。测试运行是团队构建模板的一个步骤。测试运行完成后,也会通过模板调用powershell脚本。这似乎可以做到这一点。似乎是TFS团队构建团队的重大失误。如果我在测试后执行一个脚本,那么我希望访问该脚本中的测试结果是合乎逻辑的。另外,从某个随机的.net开发者博客下载一个zip文件有点粗略,该博客托管在另一个随机的.net开发者博客上,并且希望任何人都能使用它。我用dotpeek四处搜索,它看起来像是大会引用了Telerik的分析系统。在博客帖子或下载的任何地方都没有这方面的通知。这并不能真正激发信心。我想我会回复海报上的建议,即他们开放此工具集的源代码,并通过nuget使其可用。@我自己也不完全同意这应该更容易做到。一旦我这样做了,至少我必须努力将环境变量从bat传递到powershell。幸运的是,我找到了另一个线程,希望我能帮别人省下我花在这个上面的两个小时,你是说这个RESTAPI吗?嗯,这是一个有趣的解决办法。我会把它放在我的后口袋里。是的,@RichardBanks,但不——它在内部部署产品中不可用。是的,很遗憾,我在一个客户工作现场,这就是环境。