【问题标题】:How do I detect if the test run was successful in a Team Build 2013 Post-Test script?如何检测 Team Build 2013 Post-Test 脚本中的测试运行是否成功?
【发布时间】:2015-01-04 16:57:04
【问题描述】:

我在 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\"

如何在函数中测试测试是否成功?

【问题讨论】:

  • 如果某些目录内容没有被删除并且目录不是真正的空,则失败?或者只是来自remove-Item cmdlet 的错误?
  • 在单元测试运行期间失败作为单元测试失败。

标签: powershell tfs tfsbuild


【解决方案1】:

(根据更多信息更新)

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

也就是说,有一种解决方法,因此您仍然可以获得这些值。它涉及在您的 powershell 脚本开始时调用一个小实用程序,如本博文所述:http://blogs.msmvps.com/vstsblog/2014/05/20/getting-the-compile-and-test-status-as-environment-variables-when-extending-tf-build-using-scripts/

【讨论】:

  • 测试运行是 Team Build 模板的一个步骤。测试运行完成后,也会通过模板调用 powershell 脚本。
  • 这似乎可以解决问题。 TFS Team Build Team 似乎是一个巨大的失误。如果我正在执行脚本后测试,那么我想访问该脚本中的测试结果是合乎逻辑的。此外,从一些随机的 .net 开发人员博客下载 zip 文件有点粗略,该博客托管在另一个随机的 .net 开发人员博客上,并希望任何人都可以使用它。我用 dotpeek 戳了一下,看起来程序集引用了 Telerik 的分析系统。博客文章或下载中没有任何通知。这并不能真正激发信心。
  • 我想我会回复发帖人的建议,即他们开源此工具集并通过 nuget 提供。
  • @NotMyself 我完全同意这应该更容易做到。完成此操作后,至少我不得不努力将环境变量从 bat 传递到 powershell。幸运的是,我找到了另一个线程 stackoverflow.com/questions/4384814/… 希望我可以节省我花在这上面的两个小时
【解决方案2】:

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

使用我们的 Jenkins 设置,无论如何它都会在每次新构建时擦除工件,所以这不是问题。只有通过的构建会触发将工件推送到 Octopus NuGet 服务器的步骤。

【讨论】:

  • 是的,很遗憾我在一个客户工作现场,这就是环境。
【解决方案3】:

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

$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"

让我们把它分开:

  1. 需要sqlcmd.exe;它与 SQL Server 一起安装,默认情况下位于路径中。如果您在没有 SQL Server 的机器上进行构建,请安装 Command Line Utilities for SQL Server
  2. -S 参数是服务器 + TFS 服务器的实例名称,例如本地机器上的“sqlexpress”实例
  3. 要么像我的示例那样使用 SQL 登录名/密码组合,要么在 SQL Server 上为 TFS 构建帐户提供一个帐户(首选)。授予帐户对 TFS 实例数据库的只读访问权限。
  4. TFS 实例数据库的名称类似于“Tfs_DefaultCollection”。
  5. sqlcmd 语句末尾的“-h-1”部分告诉 sqlcmd 输出不带标题的查询结果; [0] 选择第一个结果;需要 Trim() 来删除前导空格; “3”状态表示所有测试均已通过。

也许有一天微软会发布一个不错的 REST API,提供对测试运行/结果信息的访问。不过不要屏住呼吸——到目前为止,我已经等了六年了。同时,直接访问 TFS DB 是一种安全可靠的方式。

希望这有一些用处。

【讨论】:

  • 您是说这个 REST API 吗? visualstudio.com/en-us/integrate/reference/…
  • 嗯,这是一个有趣的解决方法。我会把它放在我的后口袋里。
  • 是的,@RichardBanks,但不——它在本地产品中不可用。
猜你喜欢
  • 2010-09-14
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多