Почему [AssemblyInitialize] и [AssemblyCleanup] вызываются дважды в одной сборке тестового проекта? - PullRequest
9 голосов
/ 27 октября 2010

Я думал, что вся цель этих атрибутов - запускать их только один раз за сборку.У меня есть простой класс следующим образом:

[TestClass]
public class AssemblyIntegrationTestSetup
{
    public AssemblyIntegrationTestSetup() { }
    public TestContext TestContext { get; set; }

    [AssemblyInitialize]
    public static void SetupIntegrationTests(TestContext context)
    {
         WindowsServiceService.Instance.StartService("Distributed Transaction Coordinator");
    }

    [AssemblyCleanup]
    public static void TeardownIntegrationTests()
    {
          WindowsServiceService.Instance.StopService("Distributed Transaction Coordinator");
    }

}

Однако, когда я запускаю набор тестов, методы Initialize и Cleanup уровня сборки выполняются дважды.Вот подробности о моем environemnt:

  1. Все тестовые классы находятся в одном проекте / сборке.
  2. У меня есть интеграция и модульные тесты, разделенные пространством имен.
  3. Для интеграционных тестов я использую MSTextExtensions для обеспечения отката транзакций базы данных.
  4. Я также запускаю / останавливаю службу DTC для MS SQL Server, которая требуется для возможности отката.Я хотел сделать это один раз за запуск набора тестов (и лучший компромисс, который я нашел, состоял в том, чтобы использовать атрибуты уровня сборки).Код будет работать, но он выполняется дважды.
  5. Если это имеет значение, в некоторых моих тестах я также использую Microsoft Moles Framework.

Наблюдаемое поведение аналогично:

AssemblyInitialize         

Class1.TestInitialize
Class1.TestMethod1
Class1.TestCleanup

AssemblyInitalize         <-- //This shouldn't be happening right?

Class2.TestInitialize
Class2.TestMethod1
Class2.TestCleanup

Class2.TestInitialize
Class2.TestMethod2
Class2.TestCleanup

Class5.TestInitialize
Class5.TestMethod1
Class5.TestCleanup

Class7.TestInitialize
Class7.TestMethod1
Class7.TestCleanup

//More random bouncing around then...

AssemblyCleanup 
AssemblyCleanup           <-- //This shouldn't be happening right?

Ответы [ 3 ]

7 голосов
/ 27 октября 2010

Из статьи библиотеки MSDN:

Важно

Этот атрибут не должен использоваться на Модульные тесты ASP.NET, то есть любой тест с атрибутом [HostType ("ASP.NET")]. Из-за безгражданства IIS и ASP.NET, метод, украшенный этот атрибут можно назвать больше чем один раз за тестовый прогон.


Есть несколько ручек, которые можно настроить в тестовом бегунке Я бы просто решил проблему со счетчиком:

private int InitCount;

[AssemblyInitialize]
public static void SetupIntegrationTests(TestContext context)
{
     if (InitCount++ == 0) {
         WindowsServiceService.Instance.StartService("Distributed Transaction Coordinator");
     }
}

[AssemblyCleanup]
public static void TeardownIntegrationTests()
{
      if (--InitCount == 0) {
          WindowsServiceService.Instance.StopService("Distributed Transaction Coordinator");
      }
}
1 голос
/ 23 января 2014

Ну, этот ответ опаздывает на миллионы лет, основываясь на исходной проблеме, но ...

Я обнаружил, что если тестовый агент (QTAgent32.exe) падает или умирает до завершения всей последовательности, тогда AssemblyInitialize (и, возможно, ClassInitialize и TestInitialize) будет вызван снова. Например, поместите это в функцию [AssemblyCleanup], и вы увидите, как происходит поведение:

Process p = AutotestShared.RunProcess("cmd", "/c taskkill /t /f /im QTAgent32.exe", true);
p.WaitForExit();

Итак, мораль этой истории такова: проверьте свои функции очистки, чтобы увидеть, есть ли какие-либо сбои / повреждения. Сбои во время очистки не отображаются в отчете об испытаниях, потому что утверждения прохождения / неудачи уже выполнены. Но проблемы, которые он вызывает, могут проявляться другими способами.

0 голосов
/ 05 сентября 2018

В моем случае это было неправильное поведение процесса QTAgent32.exe, из-за которого [AssemblyInitialize] выполнялся дважды. Перезапуск хост-машины, на которой был собран и выполнен мой код, решил эту проблему для меня.

...