代码之家  ›  专栏  ›  技术社区  ›  driis

vs 2010 test runner error“测试运行时代理进程已停止。”

  •  96
  • driis  · 技术社区  · 16 年前

    在Visual Studio 2010中,我有许多单元测试。当我使用测试列表一次运行多个测试时,我有时会为一个或多个测试发现以下错误:

    代理进程在 测试正在运行。

    它绝不是同一个测试失败,如果我再次尝试运行该测试,它就会成功。

    我发现了这个 bug report on Connect 这似乎是同样的问题,但它没有提供解决方案。

    还有人看到过这种行为吗?我怎样才能避免呢?

    编辑

    我仍在经历这个错误,我的许多同事也在同样的软件/硬件设置中。到目前为止,我已经对答案进行了评估,但他们没有解决问题。我要开始慷慨地寻求解决这个问题的办法。

    17 回复  |  直到 16 年前
        1
  •  40
  •   satorg    16 年前

    我刚刚经历过类似的问题:一些测试失败,并且在不同的测试运行中它们是不同的。我不知道发生这种情况的确切原因,但当我向某个类添加终结器时,它就开始出现了。当我禁用终结器时-问题消失。当我打开定稿器时,问题又回来了。

    现在我不知道如何克服这个问题。

        2
  •  84
  •   mafu    11 年前

    此消息是由 与执行测试线程不同的线程上的异常 . 到目前为止,所有的答案都归结为这个简单的解释。在Visual Studio中,在这种情况下不显示任何明智的信息是一个已知的错误。

    如果执行测试线程以外的线程抛出异常,则Visual Studio的测试运行程序将完全阻塞:它被吞没,没有输出,没有截获和调试的机会,也没有任何东西,除了一个本应作为单元测试的烧掉的阴燃混乱之外。

        3
  •  16
  •   Simon Steele    16 年前

    我遇到了这个问题,结果在我的代码中是一个问题,测试框架没有正确地捕捉到这个问题。一个小小的意外重构给我留下了这段代码:

    public void GetThingy()
    {
        this.GetThingy();
    }
    

    这当然是一个无限递归,并导致stackOverflowException(我猜)。这导致了恐惧:“代理进程在测试运行时被停止。”

    一个快速的代码检查显示了这个问题,我的测试现在运行良好。希望这有帮助-可能值得检查代码寻找问题,或者可能提取一点到控制台应用程序,并检查它是否在那里正常工作。

        4
  •  8
  •   Denise Skidmore    13 年前

    我通过查看测试结果文件(/testsults/*.trx)找到了问题的根源,它提供了后台线程中发生的异常的完整详细信息,解决了该异常后,“代理处理停止…”错误消失。

    在我的例子中,我无意中在单元测试中启动了GUI,这最终导致抛出System.ComponentModel.InvalidAsynchronousStateException。

    所以我的.trx文件包含:

       <RunInfo computerName="DT-1202" outcome="Error" timestamp="2013-07-29T13:52:11.2647907-04:00">
        <Text>One of the background threads threw exception: 
    System.ComponentModel.InvalidAsynchronousStateException: An error occurred invoking the method.  The destination thread no longer exists.
    at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle)
    at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
    at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
    at System.Windows.Forms.Control.Invoke(Delegate method)
    ...
    </Text>
      </RunInfo>
    

    这并没有提供关于什么测试导致了错误的任何信息,但它确实显示了异常在哪里,这非常有用。

        5
  •  5
  •   Mike Zboray    13 年前

    此消息通常在测试进程崩溃时生成,并且在后台线程上存在未处理的异常、发生堆栈溢出或显式调用时可能发生。 Process.GetCurrentProcess().Kill() 或 Environment.Exit . 另一个可能的原因是非托管代码中的访问冲突。

    没有人提到的是事件日志中可能有其他信息。通常,您不会获得关于测试在结果中崩溃的原因的太多信息,但是在后台线程上发生未处理的异常时,测试框架会使用源vsttexecution将详细信息写入应用程序事件日志。如果没有写入事件日志的信息,那么很可能是上面列出的其他原因之一。

        6
  •  3
  •   Gon    15 年前

    我遇到了同样的问题,在移除时解决了它

    Environment.Exit(0);
    

    所以我非常肯定,这个错误发生在测试或测试方法导致执行过程终止的时候。

        7
  •  2
  •   Reddog    16 年前

    感谢您发布问题。我刚碰到这个问题,想了一个你可能会碰到的原因。

    异步异常可能具有 发生

    在我的测试设置过程中,我创建了一个在线程池中对工作线程进行排队的对象。如果调试速度足够快,代码就会通过。

    如果工作线程在测试设置完成之前启动并出现错误,那么我将得到一个没有任何推理而被中止的结果。

    如果工作线程启动并且在测试开始后出现错误,那么我得到的结果是:错误-代理进程在测试运行时停止。

    重要的是要注意:这是我在几个测试中使用的一个组件。如果测试框架遇到过多的这些错误,它将中止其余的测试。

    希望这有帮助

        8
  •  2
  •   bendewey    15 年前

    在我的案例中,解决方案是通过检查 输出窗口 .

    'qtagent32.exe'(托管 (v4.0.30319)):已加载 'C:\测试结果\bDewey_uuxxxx 072 2011-01-11 17_00_40\out\mycode.dll', 符号已加载。E,9024, 9, 2011年1月11日,17:00:46.827, xxxxx 072\qtagent32.exe,未处理 捕获异常,通过 华生:【异常信息】

    在我的例子中,我有一个filesystemwatcher在一个单独的线程上抛出了一个错误。

        9
  •  2
  •   Jarrod Chesney    12 年前

    我在描述器~classname()中添加了try/catch块,该描述器是在我的测试中涉及的任何类中定义的。这帮我解决了问题。

    ~MyClass()
    {
        try
        {
            // Some Code
        }
        catch (Exception e)
        {
            // Log the exception so it's not totally hidden
            // Console.WriteLine(e.ToString());
        }
    }
    
        10
  •  2
  •   BlackTuareg    12 年前

    要查明异常是在哪里抛出的,请单击“测试结果”窗口中感叹号图标旁边的超链接“测试运行错误”。将打开具有堆栈跟踪的窗口。

    这有助于跟踪错误!

        11
  •  1
  •   Ben Stabile    15 年前

    我遇到了同样的问题,它是由非托管资源的终结器(由于某种原因未正确处理的文件编写器)引起的。

    在将终结器代码包装在吞咽异常的try-catch中之后,问题就消失了。我不建议吞咽这样的异常,因此很明显,首先找出异常发生的原因是明智的。

        12
  •  1
  •   Thomas    15 年前

    我曾在一些奇怪的场合发生过这样的事情,而罪魁祸首几乎总是一针见血。

    奇怪的是,所有测试在开发机器上都可以正常工作,然后在构建服务器上随机失败。

    经过更仔细的检查,结果发现尽管测试被列为在dev框中通过,但仍有异常被抛出。异常被抛出到一个单独的线程上,而该线程没有被当作错误接收。

    正在根据测试跟踪记录异常详细信息,因此我们能够确定需要修改哪些代码/测试。

    希望这能帮助别人。

        13
  •  0
  •   Peter Gfader    16 年前

    在我的例子中,我对一个WCF服务进行了一些单元测试。此WCF服务正在启动2个计时器。
    那些定时器会产生副作用。
    -->我默认禁用这些计时器,一切正常!

    顺便说一句:我用 WCFMock 为了伪造WCF服务,所以在我的WCF服务周围有“真正的”单元测试

        14
  •  0
  •   Cwoo    14 年前

    这个错误也是由我的终结器引起的。
    终结器实际调用了一些未模拟的DB代码。我花了一段时间才找到它,因为它不是我写的一个类,对它的引用被深埋了好几个类。

        15
  •  0
  •   DevDave    13 年前

    我遇到了一个类似的问题,一个测试在测试中失败,并且正在从我的另一个项目的DDL运行代码。我得到了如上所述的错误消息,如果我尝试调试测试,测试将在没有任何异常详细信息的情况下中止。

    我怀疑问题可能是我的其他项目的DLL来自Visual Studio 2012项目,我正在VS2010项目中运行测试,和/或可能是两个项目的UnitTestFramWork DLL版本不匹配。

        16
  •  0
  •   phil soady    13 年前

    这个问题也可以由testclass的构造函数中的异常或stackoverflow触发。

        17
  •  0
  •   Good Night Nerd Pride    12 年前

    由于这个错误可能有许多不同的原因,为了这个线程的完整性,我想添加另一个原因。

    如果 全部的 您的测试正在中止,正如OP所描述的,原因可能是项目配置错误。在我的例子中,目标框架被设置为.NET Framework 3.5。通过“项目属性”页(选项卡)将其设置为更高版本 应用 )解决了问题。