在单元测试之前运行脚本

时间:2014-09-17 07:37:53

标签: sql-server unit-testing visual-studio-2012 sql-server-data-tools

SQL Server单元测试中的Test Initialize脚本在每个测试方法之前运行 和测试每种测试方法后清理运行。

所以例如我有这个结构

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

我怎样才能添加一个在项目开始时运行的脚本,以及一个将在项目最后运行的脚本?

所以它会像这样运行

 -- Pre MasterUnitTest
 -- 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
 -- Post MasterUnitTest

2 个答案:

答案 0 :(得分:2)

Visual Studio设计人员生成的SQL数据库单元测试实际上是常见的MSUnit测试类。

如果要执行某些设置(Pre MasterUnitTest)和拆卸(Post MasterUnitTest)逻辑,您可以重新构建由Visual Studio生成的测试,并将它们嵌套在将运行设置和拆除逻辑的类中。这是一个例子:

[TestClass]
public class NestedUnitTests
{
    [ClassInitialize()]
    public static void ClassInit(TestContext context) {
        Debug.WriteLine("Init before all individual Test Classes");
    }

    [TestMethod]
    public void Init()
    { }

    [TestClass]
    public class NestedFooSchemaTestClass
    {
        [TestMethod]
        public void Test1InClass()
        {
            Debug.WriteLine("Test Class Foo Schema - Method 1");
            Assert.AreEqual(true, true);
        }
    }

    [TestClass]
    public class NestedBarSchemaTestClass
    {
        [TestMethod]
        public void Test2InClass()
        {
            Debug.WriteLine("Test Class Foo Bar - Method 2");
            Assert.AreEqual(true, true);
        }
    }

    [ClassCleanup()]
    public static void ClassCleanup() {
        Debug.WriteLine("Clean after all Test Classes executed");
    }
}

当我使用TestRunner运行时,我得到:

Init before all individual Test Classes
Test Class Foo Schema - Method 1
Test Class Foo Bar - Method 2
Clean after all Test Classes executed

注意:使用此方法唯一无法实现的是在另一个类初始化之前执行类清理(例如,在类的初始化之前对类的Foo进行类清理)。所有类的测试清理将在最后运行。这是因为测试类在所有测试完成运行后由运行时批量卸载,这是故意的,因为测试应该是隔离

如果要完全控制执行,另一种方法是通过使用MSTest命令行utitilites的自定义脚本运行测试。这样你就可以运行一个预脚本(或预测试),然后是你的主要测试dll,最后是一个Post-script(或后测试)。

这是一个链接,其中包含有关如何从命令行使用MSTest的更多信息:

http://msdn.microsoft.com/en-us/library/jj155804.aspx

答案 1 :(得分:1)

没有理由运行特殊的主前/后测试 - 您可以尝试实现它创建有序测试:

您可以使用有序测试以特定顺序运行SQL Server单元测试。有关详细信息,请参阅如何:创建有序测试(Visual Studio 2012)。 {{3 }}“