MSTest单元测试随机开始失败

时间:2018-11-15 15:53:51

标签: azure-devops mstest azure-pipelines

几天前(11/12),我们为.NET 4.7 Windows Forms应用程序构建的CI意外开始“部分成功”。我将问题追溯到Visual Studio测试步骤。将每个DLL的单元测试分解为单独的步骤后,我进一步能够将其隔离到UI测试DLL。

这是一个普通的MSTest项目,其中的类测试UI的某些部分,这些部分可以在后台进行操作。通常是操纵控件的数据模型,然后检查控件的详细信息以确保数据模型更改具有预期的效果。 UI元素通过类中的新声明或作为要测试的控件的子级的TestClasses在代码中实例化。没有显示任何消息框,也没有实际呈现UI元素供人类或外部自动化进行审核。

这些测试在Azure“托管VS2017”环境中运行。全部失败的测试运行具有完全相同的错误消息:

  

活动的测试运行被中止。原因:未处理的异常:System.AppDomainUnloadedException:线程正在其中运行的应用程序域已被卸载。

我无法识别出失败的模式。在不同的单独测试之后可能会发生该异常。隔离,并行或不并行运行测试似乎不会影响失败。但是,故障的频率确实在增加。所有在本地重新创建此尝试均失败;我们用来运行单元测试的任何Visual Studio 2017安装都顺利通过了所有测试。

我可以通过Google在这个特定主题上真正找到的所有东西,要么是Visual Studio的过时版本的条目(此错误已得到纠正),要么是其他未解决的问题。以前有人遇到过这种麻烦吗?

2 个答案:

答案 0 :(得分:0)

自我跟踪以记录如何针对自己的情况解决此问题。

原因:实例化从System.Windows.Forms.Control或System.Windows.Forms.Form派生的对象,而没有正确处理它们。

我的解决方法:将所有实例化都包装在using()块中。

答案 1 :(得分:0)

在任何测试中创建后台线程并在其他测试仍在运行时引发异常时,这将使测试运行崩溃。

任何正确启动线程的代码都必须等待这些线程完成并处理可能发生的任何异常,这一点很重要。或者设置您的测试,以便它可以执行此错误处理和/或清除操作。

在执行其他测试的同时运行后台线程可以使整个测试套件变好:)。如您所知。可能还会导致生产代码出现问题。