当从测试视图运行时,测试成功,但当从测试列表编辑器或命令行运行时失败。

4
我有一个测试套件,包含单元测试和集成测试,在使用C#、.NET 4.0和Visual Studio 2010的项目中。测试套件使用MSTest。当我运行解决方案中的所有测试(通过测试工具栏中的按钮或使用Ctrl-R A快捷键)时,所有的测试都能成功通过。
但是,当我尝试使用mstest从命令行显式地使用唯一存在的.testsettings文件运行相同的测试,或者尝试使用Test List Editor或.vsmdi文件运行它们时,集成测试则失败了。
由于集成测试测试UI,因此需要部署项目和其他相关内容,而单元测试则不需要。然而,我似乎无法确定这两种运行测试方法之间的实际差异。
当我检查来自测试运行的适当Out目录时,并不是所有文件都存在。
是什么原因导致在从Visual Studio正确部署的情况下,在另一种情况下无法正确部署某些文件?

1
你的测试失败是怎么样的?是断言被违反了,还是“无法启动测试,因为无法加载 dll xxx”?如果是前者,你能复制一个失败的测试代码吗? - gturri
看起来在成功的情况下复制了一些内容文件(在这种情况下,是一个 SQL Server Compact 数据库),但在失败的情况下被省略了。这本身就很奇怪,因为解决方案中只有一个 testsettings 文件,并且它被配置为允许部署。此外,数据库文件夹是使用 DeploymentItem 属性包含的。 - Michael
值得注意的是,问题与测试顺序无关。手动逐个运行集成测试,任何顺序都可以正常工作,集成测试之间并不相互依赖。只有在使用命令行或测试列表编辑器运行测试时才会出现问题。 - Michael
你可能需要检查测试中静态变量的使用。当运行测试套件时,通常会在一个进程实例中运行,因此静态变量将从一个测试运行粘滞到另一个测试运行。这在编写测试时经常被忽视,因为当不同时运行多个测试时,你将得到“未编辑”的静态变量。 - Caleb
1个回答

3
我写完上面的评论后不久,静态内容开始被复制。我遇到的另一个主要问题是,集成测试项目引用了系统被测试对象的依赖库(设置了copy-local为true),以确保在需要时DLL文件存在。由于某种原因,当通过Test List或mstest运行测试时,这些依赖库始终无法复制。
最终我做的解决方法是为所需的DLL文件包含[DeploymentItem]属性。这样无论如何运行测试,都能使事情正常工作。我仍然不清楚的是,Test View/mstest与常规测试运行程序有何区别(假设正确的.settings文件已传递给mstest)。我将这些注释/解决方法放在答案中,但如果有人能解决不同测试执行路径的根本原因,我将保留问题开放状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接