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

Vstest.console.exe exits with code 255 in Bamboo

我们在我们的 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-dir\AVENTURA-T2-COREUNITTESTS\TestResults\bamboo_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 Files\Bamboo\temp\AVENTURA-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

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

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

所有这一切都是为了捕获来自 vstest.console.exe 的错误并抛出一个 return 代码 0 而不是 255。如果有人弄明白了,我会 非常 很高兴知道为什么 return 代码不是 0。

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

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

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

进程输出上的输出处理程序然后在不同的线程中执行,但具有对测试上下文的引用以写入其输出。

这可能会导致两个方面的问题:

  1. MSDNWaitForExit(int milliseconds) 的文档中指出:

    When standard output has been redirected to asynchronous event handlers, it is possible that output processing will not have completed when this method returns. To ensure that asynchronous event handling has been completed, call the WaitForExit() overload that takes no parameter after receiving a true from this overload.

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

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

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

  1. 调用 WaitForExit(int) 后,终止进程(超时)或再次调用 WaitForExit()(非超时)。
  2. 从进程对象中注销输出事件处理程序
  3. 正确处理 Process 对象(使用 using)。

您的案例的细节可能与我们的不同,但寻找线程测试,其中 (a) 线程可能在测试完成后执行,并且 (b) 写入测试输出。