【问题标题】:SQL Server UnitTest Execution OrderSQL Server UnitTest 执行顺序
【发布时间】:2014-11-12 08:31:06
【问题描述】:

如何配置SQL Server单元测试的执行顺序?

所以例如我有这个结构

UnitTests          -- Main Project
  - FooSchema      -- Test Class
     - SprocFoo1   -- Individual Unit Tests / Test Methods 
     - SprocFoo2
  - BarSchema
     - SprocBar1
     - SprocBar2

测试运行有时是这样的:

 -- Test Initialiaze for TestClass FooSchema
    -- Pre-Test   -- for SprocFoo1
    -- Test       -- for SprocFoo1
    -- Post-Test  -- for SprocFoo1
    -- Pre-Test   -- for SprocFoo2
    -- Test       -- for SprocFoo2
    -- Post-Test  -- for SprocFoo2
 -- Test Cleanup for TestClass FooSchema
 -- Test Initialiaze for TestClass BarSchema
    -- Pre-Test   -- for SprocBar1
    -- Test       -- for SprocBar1
    -- Post-Test  -- for SprocBar1
    -- Pre-Test   -- for SprocBar2
    -- Test       -- for SprocBar2
    -- Post-Test  -- for SprocBar2
 -- Test Cleanup for TestClass BarSchema

有时像这样:

 -- Test Initialiaze for TestClass BarSchema
    -- Pre-Test   -- for SprocBar1
    -- Test       -- for SprocBar1
    -- Post-Test  -- for SprocBar1
    -- Pre-Test   -- for SprocBar2
    -- Test       -- for SprocBar2
    -- Post-Test  -- for SprocBar2
 -- Test Cleanup for TestClass BarSchema
 -- Test Initialiaze for TestClass FooSchema
    -- Pre-Test   -- for SprocFoo1
    -- Test       -- for SprocFoo1
    -- Post-Test  -- for SprocFoo1
    -- Pre-Test   -- for SprocFoo2
    -- Test       -- for SprocFoo2
    -- Post-Test  -- for SprocFoo2
 -- Test Cleanup for TestClass FooSchema

如何设置 FooSchema 始终首先运行?

【问题讨论】:

    标签: unit-testing sql-server-2008-r2 test-class


    【解决方案1】:

    我不关注这个特定的主题(SQL Server),但单元测试的重点是单元测试应该始终独立于它自己:也就是说,没有任何依赖关系(或至少尽可能少)。 因此,我相信您不能更改单元测试的运行顺序,仅仅是因为一开始就不需要这样做。

    因此,如果您的 BarSchema 单元测试依赖于 FooSchema 单元测试,您可能最好重做您的 BarSchema 单元测试。

    【讨论】:

      【解决方案2】:

      SQL Server 单元测试是常见的 MSUnit 测试类。

      第一个选项是使用 MSUnit 有序测试。它是 Visual Studio 中的一个特殊项目,其设计器允许您指定 SQL Server 测试方法(或任何其他 MSUnit 测试)的确切顺序。

      您可以右键单击您的 Visual Studio 测试项目并通过两次单击添加有序测试。

      如果您希望设计人员维护测试的顺序,并且如果您希望保持测试类隔离,那么有序测试是很好的选择,这样更易​​于维护。

      如果您不喜欢有序测试并且想要更多控制,那么您可以使用“MSUnit 测试嵌套”并将所有 MSUnit 测试包含在根容器测试类中:

      [TestClass]
      public class RootContainer
      {
          [TestClass]
          public class NestedFooSchemaTestClass
          {
              [ClassInitialize()]
              public static void ClassInit(TestContext context)
              {
                  Debug.WriteLine("-- Test Initialize for TestClass FooSchema");
              }
      
              [TestInitialize()]
              public void TestInitialize()
              {
                  Debug.WriteLine("  -- Pre-Test");
              }
      
              [TestMethod]
              public void Test1InClass()
              {
                  Debug.WriteLine("  -- Test");
                  Assert.AreEqual(true, true);
              }
      
              [TestMethod]
              public void Test2InClass()
              {
                  Debug.WriteLine("  -- Test");
                  Assert.AreEqual(true, true);
              }
      
              [TestCleanup()]
              public void TestCleanup()
              {
                  Debug.WriteLine("  -- Post-Test");
              }
      
              [ClassCleanup()]
              public static void ClassCleanup()
              {
                  Debug.WriteLine("-- Test Cleanup for TestClass FooSchema");
              }
          }
      
          [TestClass]
          public class NestedBarSchemaTestClass
          {
              [ClassInitialize()]
              public void ClassInit(TestContext context)
              {
                  Debug.WriteLine("-- Test Initialize for TestClass BarSchema");
              }
      
              [TestInitialize()]
              public void TestInitialize()
              {
                  Debug.WriteLine("  -- Pre-Test");
              }
      
              [TestMethod]
              public void Test1InClass()
              {
                  Debug.WriteLine("  -- Test");
                  Assert.AreEqual(true, true);
              }
      
              [TestCleanup()]
              public void TestCleanup()
              {
                  Debug.WriteLine("  -- Post-Test");
              }
      
              [ClassCleanup()]
              public void ClassCleanup()
              {
                  Debug.WriteLine("-- Test Cleanup for TestClass BarSchema");
              }
          }
      }
      

      当你运行这段代码时,你会得到:

      -- Test Initialize for TestClass FooSchema
         -- Pre-Test
         -- Test
         -- Post-Test
         -- Pre-Test
         -- Test
         -- Post-Test
      -- Test Initialize for TestClass BarSchema
         -- Pre-Test
         -- Test
         -- Post-Test
      -- Test Cleanup for TestClass FooSchema
      -- Test Cleanup for TestClass BarSchema
      

      订单几乎如您所愿。唯一的区别是类的测试清理最终将作为批处理运行。这是因为测试类在所有测试完成运行后被批量卸载,这就是为什么无法控制执行清理的确切时间的原因。这是故意的,因为测试应该是孤立的

      如果您仍希望完全控制执行,另一种方法是通过使用 MSTest 命令行实用程序的自定义脚本运行测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-04
        • 2010-09-10
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多