Visual Studio中的测试单独成功,在一组中失败

当我在Visual Studio中单独运行我的测试时,它们都会毫无问题地通过。 然而,当我立刻运行所有这些时,一些通过而一些失败。 我尝试在每种测试方法之间暂停1秒但没有成功。

有任何想法吗? 在此先感谢您的帮助…

您可能有一些共享数据。 检查正在使用的类中的静态成员变量,这意味着一个测试设置一个值,导致后续测试失败。

您还可以调试unit testing。 根据您正在使用的框架,您应该能够将框架工具作为调试启动应用程序运行,将路径作为参数传递给已编译的程序集。

在一个测试中完成的某些修改/实例化很可能会影响其他测试。 这表明测试设计不佳,缺乏适当的隔离。

每个人都可能是正确的,一些共享日期正在测试之间进行修改。 但请注意MS Test执行的顺序 。 简单地在测试之间暂停并不是解决方案。 每个测试都在一个单独的线程上在它自己的测试类实例中执行。

根据其他答复。 听起来你有一个单例或一个导致交互的全局变量。

我使用的其他unit testing框架努力确保测试产生相同的结果,无论测试是单独运行还是作为“全部运行”替代方案的一部分运行。 目标是防止一个测试由于副作用而对另一个测试产生影响,例如(例如)让一个测试在另一个测试不期望的配置中离开类的静态状态。 VSunit testing框架似乎没有提供这种隔离。 我有2个建议,以尽量减少问题所暗示的问题类型。 首先,如果类具有状态(除了静态方法之外还有其他任何东西),则使用非静态类优先于静态类。 创建此类的单个实例,并使其保留静态类中保留的状态信息。 其次,如果你确实选择静态类和静态,请使用静态方法将静态状态设置回“空”(例如,将所有静态属性设置为null / zero /等的方法)。 在每个unit testing结束时调用它以撤消测试对静态状态施加的任何影响。 (诚​​然,这不仅仅是优雅,但如果适度进行则可行)。 或者做我打算做的事情 – 找到一个unit testing框架,提供跨测试的隔离。

虽然我的问题最终成为一个线程问题,但我也遇到了这个问题。 在我的情况下,我伪造了HttpContext对象,因为测试依赖于它的存在。 但是,我在ClassInitialize方法中设置了这个,认为这将用于以下每个方法:

[ClassInitialize] public static void ClassInit(TestContext testContext) { HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null)); } 

但是,事实certificate,类中的每个测试方法都在一个单独的线程中运行。 因此,我必须将此代码添加到依赖它来解决问题的每个测试方法中。

 [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

我在这里遇到了类似的问题,我是如何解决它的:

  1. 在第一个测试中复制第二个测试的代码(在它之后)。
  2. 尝试测试第一个测试。 第一个测试可能会失败,然后您可以调试第一个测试(一步一步)以找到导致问题的静态/共享变量或逻辑。