Vstest.console.exe以Bamboo中的代码255退出

Vstest.console.exe exits with code 255 in Bamboo

本文关键字:代码 退出 Bamboo console exe Vstest      更新时间:2023-10-16

我们在Bamboo构建中运行自动化单元测试,但它们有时会失败,尽管我们的日志表明所有测试都通过了。我已经在谷歌上搜索了一些,但目前没有找到任何位置。有人知道为什么VSTest.Console.Exe返回0以外的值吗?

非常感谢!

以下是日志的最后几行:

build   26-May-2016 14:11:25    Passed   ReInitializeConnection
build   26-May-2016 14:11:25    Passed   UserIdentifier_CRUD
build   26-May-2016 14:11:25    Results File: D:build-dirAVENTURA-T2-COREUNITTESTSTestResultsbamboo_svc_BUILDP02 2016-05-26 14_10_58.trx
build   26-May-2016 14:11:25    
build   26-May-2016 14:11:25    Total tests: 159. Passed: 159. Failed: 0. Skipped: 0.
build   26-May-2016 14:11:25    Test Run Successful.
build   26-May-2016 14:11:25    Test execution time: 27.3562 Seconds
simple  26-May-2016 14:11:32    Failing task since return code of [C:Program FilesBambootempAVENTURA-T2-COREUNITTESTS-345-ScriptBuildTask-2971562088758505573.bat] was 255 while expected 0
simple  26-May-2016 14:11:32    Finished task 'Run vstest.console.exe' with result: Failed

这不是我想要的解决方案,但如果返回代码不是0,并且所有测试都通过了,它确实可以防止我的构建失败。在我们测试命令的末尾,我添加了:

if %ERRORLEVEL% NEQ 0 (
echo Failure Reason Given is %errorlevel%
exit /b 0
)

所有这些都会捕获vstest.console.exe中的错误,并抛出一个0而不是255的返回代码。如果有人能弄清楚这一点,我会非常感激知道为什么返回代码不是0。

正如对该问题的评论所示,我在公司的测试自动化中也遇到了这个问题。

在我们的例子中,当测试失败时,vstest会返回1,但偶尔会返回255。在255返回的情况下,将不会生成测试TRX输出。

在我们的情况下,我们正在运行生成子进程的集成测试。子进程附加了可写入测试上下文的输出处理程序。测试启动该过程,然后使用WaitForExit(int milliseconds)方法等待它完成。

进程输出上的输出处理程序随后在不同的线程中执行,但有一个对测试上下文的引用来编写它们的输出。

这可能会在两个方面造成问题:

  1. 在MSDN上的WaitForExit(int milliseconds)文档中,它指出:

    当标准输出被重定向到异步事件处理程序时,当此方法返回时,输出处理可能尚未完成。为了确保异步事件处理已经完成,请调用WaitForExit()重载,该重载在从该重载接收到true后不接受任何参数。

    这意味着输出处理程序可能在测试完成后写入上下文。

  2. 超时到期后,进程将继续在后台运行,因此也可以写入测试上下文。

在我们的案例中,修复有三个方面:

  1. 调用WaitForExit(int)之后,要么终止进程(超时),要么再次调用WaitForExit()(非超时)
  2. 取消注册进程对象的输出事件处理程序
  3. 正确处理Process对象(使用using)

您的情况可能与我们的不同,但请寻找线程测试,其中(a)线程可能在测试完成后执行,(b)写入测试输出。