C++ Vstest.console.exe以代码255退出

C++ Vstest.console.exe以代码255退出,c++,visual-studio-2013,bamboo,C++,Visual Studio 2013,Bamboo,我们正在竹子构建中运行自动化的单元测试,但它们有时会失败,即使我们的日志表明所有测试都适当地通过了。我在谷歌上搜索了一下,目前还没有找到答案。有人知道为什么VSTest.Console.Exe返回的值不是0吗 非常感谢 以下是日志的最后几行: build 26-May-2016 14:11:25 Passed ReInitializeConnection build 26-May-2016 14:11:25 Passed UserIdentifier_CRUD bui

我们正在竹子构建中运行自动化的单元测试,但它们有时会失败,即使我们的日志表明所有测试都适当地通过了。我在谷歌上搜索了一下,目前还没有找到答案。有人知道为什么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

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

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

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

这不是我想要的解决方案,但是如果返回代码不是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毫秒)
方法等待它完成

然后,流程输出上的输出处理程序在不同的线程中执行,但有一个对测试上下文的引用来写入其输出

这可能以两种方式导致问题:

  • WaitForExit(int毫秒)
    on的文档中,它指出:

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

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

  • 当超时过期时,进程继续在后台运行,因此也可能能够写入测试上下文

  • 在我们的案例中,解决方案有三个方面:

  • 调用
    WaitForExit(int)
    后,可以终止进程(超时),也可以再次调用
    WaitForExit()
    (非超时)
  • 从流程对象取消注册输出事件处理程序
  • 正确地处置
    过程
    对象(使用
    处理

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

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

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

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

    然后,流程输出上的输出处理程序在不同的线程中执行,但有一个对测试上下文的引用来写入其输出

    这可能以两种方式导致问题:

  • WaitForExit(int毫秒)
    on的文档中,它指出:

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

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

  • 当超时过期时,进程继续在后台运行,因此也可能能够写入测试上下文

  • 在我们的案例中,解决方案有三个方面:

  • 调用
    WaitForExit(int)
    后,可以终止进程(超时),也可以再次调用
    WaitForExit()
    (非超时)
  • 从流程对象取消注册输出事件处理程序
  • 正确地处置
    过程
    对象(使用
    处理

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

    我有相同的错误(但在Jenkins下运行)。发生这种情况时,即使测试通过,也不会生成TRX输出。这使得它在跟踪测试结果时不太有用。我仍在尝试跟踪错误的原因。@JT。如果你知道了,一定要告诉我。我目前的解决方案非常不稳定,因为我基本上只是忽略了测试控制台生成的错误,这无疑会在某一天咬我的屁股@jhammond在下面看到了我的答案,详细了解了我们必须做些什么来解决这个问题。当它发生时,TRX输出