MSTest V2 Выполнить юнит-тесты последовательно -> [DoNotParallelize] - PullRequest
0 голосов
/ 29 января 2020

У меня есть вопрос о последовательном запуске UnitTests. К сожалению, в сценарии невозможно запустить их параллельно или смоделировать базу данных. Проект написан на NET core 3.1, и UnitTests необходимо выполнить операции с базой данных до и после запуска Unittest.

После прочтения https://www.meziantou.net/mstest-v2-execute-tests-in-parallel.htm и множества других статей о последовательном UnitTesting я придумал это (упрощенно):

BaseClass:

namespace XY.Test
{
    [TestClass]
    public class BaseTest: TimerModel
    {
        private static readonly DbCreator Creator = new DbCreator();
        public static readonly DbConnectionManager ConnectionManager = new DbConnectionManager();

        [TestInitialize]
        public void BaseTestInitialize()
        {
            CreateTestData();
        }

        [TestCleanup]
        public void BaseTestCleanup()
        {
            RemoveTestData();
        }

        public void CreateTestData()
        {
            RemoveTestData();
            Creator.ExecuteSqlFromScript(ConnectionManager, @"Resources\CreateTestData.sql");
        }

        public void RemoveTestData()
        {
            Creator.ExecuteSqlFromScript(ConnectionManager, @"Resources\EmptyTestDataTables.sql");
        }
    }
}

TestClass:

[assembly: Parallelize(Workers = 0, Scope = ExecutionScope.ClassLevel)] //<-- Also tried out Workers = 1 and Scope = ExecutionScope.MethodLevel
namespace XY.Test.Models
{
    [TestClass]
    public class TerminalConfigModelTest: BaseTest
    {
        [TestMethod]
        [DoNotParallelize]
        public void TestMethod1()
        {
            ...
        }

        [TestMethod]
        [DoNotParallelize]
        public void TestMethod2()
        {
            ...
        }
    }
}

По какой-то причине, независимо от того, что я делаю, юнит-тесты выполняются параллельно. Что мне нужно изменить, чтобы они выполнялись последовательно?

Когда я выполняю все тесты в классе теста, TestInitialize базового класса вызывается дважды перед запуском TestCleanup. Это приводит к сбою метода CreateTestData, так как индексы предотвращают двойную вставку тестовых данных.

Что бы я ожидал:

  • TestInitialize1 называется
  • TestMethod1 выполняется
  • TestCleanup1 называется
  • TestInitialize2 вызывается
  • Испытан TestMethod2
  • Вызывается TestCleanup2
  • ...

Что происходит:

  • TestInitialize1 is вызываемый
  • Испытывается TestMethod1
  • Вызывается TestInitialize2 до вызова TestCleanup1
  • Сбой выполнения TestMethod2

Не понимаю ли я параметр [DoNotParallelize]?

...