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

Posted

技术标签:

【中文标题】从测试视图运行时测试成功,但从测试列表编辑器或命令行运行时失败【英文标题】:Tests succeed when run from Test View but fail when run from test list editor or command line 【发布时间】:2013-12-30 22:27:03 【问题描述】:

我有一个测试套件,包含单元测试和集成测试,在一个项目中使用 C# on .NET 4.0 和 Visual Studio 2010。测试套件使用 MSTest。当我在解决方案中运行所有测试时(通过点击测试工具栏中的按钮或使用 Ctrl-R A 快捷键),所有测试、集成和单元都成功通过。

当我尝试使用mstest 从命令行运行相同的测试(明确使用存在的唯一.testsettings 文件)或尝试从测试列表编辑器或使用.vsmdi 文件运行它们时,集成测试失败。

集成测试测试 UI,因此依赖于部署项等,而单元测试则没有。但是,我似乎无法确定这两种运行测试的方法之间的实际区别。

当我从测试运行中检查适当的Out 目录时,并非所有文件都存在。

什么会导致在 Visual Studio 的一种情况下正确部署的某些文件无法在另一种情况下正确部署?

【问题讨论】:

您的测试是如何失败的?是否违反了断言,还是“无法启动测试,因为无法加载 dll xxx”?在第一种情况下,您可以将代码复制为失败的测试吗? 似乎某些内容文件(在本例中为 SQL Server 紧凑型数据库)在成功场景中被复制,但在失败场景中被忽略。这本身就很奇怪,因为解决方案中只有一个 testsettings 文件,并且它被配置为允许部署。此外,使用 DeploymentItem 属性包含数据库的文件夹。 另外值得注意的是,这个问题与测试的顺序无关。手动运行集成测试,一次一个,以任何顺序,仍然有效。集成测试不相互依赖。该问题仅在使用命令行或测试列表编辑器运行测试时出现。 您可能想检查您在测试中使用的静力学。运行测试套件时,它通常在一个流程实例中运行,因此静态会从一个测试运行到另一个测试运行。这在编写测试时经常被忽略,因为在不一起运行多个测试时会得到“未经编辑的”静态数据。 【参考方案1】:

在我写完上面的 cmets 后不久就开始复制静态内容。我遇到的另一个主要问题是集成测试项目引用了作为被测系统依赖项的库(将 copy-local 设置为 true),以确保 DLL 在需要时存在。由于某种原因,当测试通过测试列表或mstest 运行时,这些顽固地拒绝复制。

我最终解决这个问题的方法是为我需要的 DLL 包含 [DeploymentItem] 属性。无论测试如何运行,这都能正常工作。我仍然不清楚,可能已经回答了底层解决方案,或者提供了更好的解决方案,是 Test View/mstest 与常规测试运行器的不同之处(假设正确的 .settings 文件已传递给 mstest。) .我将这些注释/解决方法放在一个答案中,但我会留下这个问题,以防任何人都可以解决不同测试执行路径如何不同的根本原因。

【讨论】:

以上是关于从测试视图运行时测试成功,但从测试列表编辑器或命令行运行时失败的主要内容,如果未能解决你的问题,请参考以下文章

Espresso 在云中的设备上运行时抛出“在视图中执行“单击”时出错”,但相同的测试在本地成功运行

针对 Visual Studio 2012 本机 C++ 测试从命令行运行 mstest

pytest 运行命令

从命令行运行 gradle 时如何执行和显示友好的测试输出

为啥 ssh 从 crontab 失败但从命令行执行时成功?

从命令行运行 xctest