SQL Server UnitTest执行顺序



如何配置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始终首先运行?

我不喜欢这个特定的主题(SQL Server),但单元测试的全部意义在于,单元测试应该始终独立:也就是说,没有任何依赖关系(或者至少尽可能少)。正因为如此,我相信你不能改变单元测试的运行顺序,因为这在一开始就没有必要。

因此,如果你的BarSchema单元测试依赖于FooSchema单元测试,你可能会更好地重做你的BarSchema单元测试。

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命令行实用程序的自定义脚本运行测试。

最新更新