Visual Studio 中的测试单独成功,一组失败
Posted
技术标签:
【中文标题】Visual Studio 中的测试单独成功,一组失败【英文标题】:Testing in Visual Studio Succeeds Individually, Fails in a Set 【发布时间】:2010-09-28 20:32:38 【问题描述】:当我在 Visual Studio 中单独运行测试时,它们都可以顺利通过。但是,当我一次运行所有这些时,有些通过,有些失败。我尝试在每种测试方法之间暂停 1 秒,但没有成功。
有什么想法吗?提前感谢您的帮助...
【问题讨论】:
【参考方案1】:您可能有一些共享数据。检查正在使用的类中的静态成员变量,这意味着一个测试设置了一个导致后续测试失败的值。
您还可以调试单元测试。根据您使用的框架,您应该能够将框架工具作为调试启动应用程序运行,并将编译程序集的路径作为参数传递。
【讨论】:
【参考方案2】:在一项测试中完成的某些修改/实例化很可能会影响其他测试。这表明糟糕的测试设计和缺乏适当的隔离。
【讨论】:
【参考方案3】:每个人都可能是对的,测试之间正在修改一些共享日期。但请注意order of MS Test execution。只是在测试之间暂停不是解决方案。每个测试都在它自己的测试类实例中的单独线程上执行。
【讨论】:
【参考方案4】:根据其他回复。听起来您有一个导致交互的单例或全局变量。
【讨论】:
【参考方案5】:我使用的其他单元测试框架努力确保测试产生相同的结果,无论测试是单独运行还是作为“全部运行”替代方案的一部分运行。目标是防止一个测试由于副作用而对另一个测试产生影响,例如(例如)让一个测试将类的静态状态留在另一个测试不期望的配置中。 VS 单元测试框架似乎没有提供这种隔离。我有 2 条建议来尽量减少问题所暗示的问题类型。首先,如果类具有状态(除了静态方法之外还有其他任何东西),则优先使用非静态类而不是静态类。创建此类的单个实例,并让它保留保存在静态类中的状态信息。其次,如果您确实选择了具有静态状态的静态类,请使用将静态状态设置回“空”的静态方法(例如,将所有静态属性设置为空/零/等的方法)。在每个单元测试结束时调用它以撤消测试对静态状态施加的任何影响。 (诚然,这不太优雅,但如果适度完成是可行的)。或者做我打算做的事情——找到一个提供跨测试隔离的单元测试框架。
【讨论】:
【参考方案6】:虽然我的问题最终是线程问题,但我也遇到了这个问题。就我而言,我在伪造 HttpContext 对象,因为测试依赖于它的存在。但是,我在 ClassInitialize 方法中进行了设置,认为这将用于以下每种方法:
[ClassInitialize]
public static void ClassInit(TestContext testContext)
HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
然而,事实证明,类中的每个测试方法都在单独的线程中运行。所以我不得不将此代码添加到依赖它来解决问题的每个测试方法中。
[TestMethod]
public void TestMethod1()
HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
...
[TestMethod]
public void TestMethod2()
HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
...
有关此内容的更多信息,请参见链接。 http://blogs.msdn.com/b/nnaderi/archive/2007/02/17/explaining-execution-order.aspx
【讨论】:
【参考方案7】:我在这里遇到了类似的问题,我是如何解决的:
-
将第二个测试的代码复制到第一个测试中(在它之后)。
尝试测试第一个测试。第一个测试可能会失败,然后您可以调试第一个测试(逐步)以找到导致问题的静态/共享变量或逻辑。
【讨论】:
以上是关于Visual Studio 中的测试单独成功,一组失败的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Visual Studio 2010 中设置单独的 Boost 测试项目
Visual Studio测试运行:从测试中心的测试计划运行编码的UI自动化测试
Visual Studio FsUnit测试设置 - 异常NUnit.Engine.NUnitEngineException
压缩文件后(它们从 Visual Studio 中的文件路径引用打开),如何让我的应用程序从单独的 Winform 打开? (C#)