2014-09-18 3 views
3

Как настроить порядок выполнения тестов SQL Server Unit?Порядок выполнения SQL Server UnitTest

Так, например, у меня есть эта структура

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 всегда работает первым?

ответ

1

Я не занимаюсь этой конкретной темой (SQL Server), но весь смысл unittesting заключается в том, что unittest всегда должен стоять на своем собственном: то есть без каких-либо зависимостей (или, по крайней мере, минимально возможных). Из-за этого я считаю, что вы не можете изменить порядок, в котором запускаете unittests, просто потому, что в первую очередь это не обязательно.

Так что, если ваши объекты BarSchema unittests имеют зависимость от unittests FooSchema, вам, вероятно, лучше переделать unittests в BarSchema.

0

Тесты блока 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 

Порядок почти такой, какой вы хотите. Единственное различие заключается в том, что Test Cleanup для классов будет работать как пакет в конце. Это связано с тем, что тестовые классы разгружаются по массе после завершения всех тестов, и поэтому невозможно контролировать точное время выполнения Cleanup. Это преднамеренно, так как предполагается, что испытания должны быть .

Если вам по-прежнему нужен полный контроль над исполнением, альтернативный подход состоял бы в том, чтобы запустить ваши тесты с помощью специального скрипта, который использует утилиты командной строки MSTest.

Смежные вопросы