如何配置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始终先运行?
答案 0 :(得分:1)
我不参与这个特定的主题(SQL Server),但是单元测试的重点在于单元测试应该始终站在它自己的位置:即没有任何依赖性(或者至少尽可能小)。 因此我相信你不能改变单元测试运行的顺序,因为这不应该是首先必须的。
因此,如果您的BarSchema单元测试依赖于FooSchema单元测试,您可能更好地重做BarSchema单元测试。
答案 1 :(得分:0)
SQL Server单元测试是常见的MSUnit测试类。
第一个选项是使用MSUnit 有序测试。它是Visual Studio中的一个特殊项目,它允许您指定SQL Server测试方法(或任何其他MSUnit测试)的确切顺序。
您可以右键单击Visual Studio测试项目,并通过两次单击添加订购测试。
如果您希望设计人员维持测试顺序,并且您希望保持测试类隔离,则可以进行有序测试,这样更易于维护。
如果您不喜欢Ordered Tests并希望获得更多控制权,那么您可以使用" 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命令行utitilites的自定义脚本运行测试。