Подтвердить что ты не робот

MSTest, выполняющий все мои тесты, одновременно ломает тесты - что делать

Хорошо, это раздражает.

MSTest выполняет все мои тесты одновременно, что приводит к сбою некоторых из них. Нет, это не потому, что мои тесты хрупки и восприимчивы к порядку сборки, а потому, что это демонстрационный проект, в котором я использую базу данных объектов Db4o, запущенную из файла.

Итак, у меня есть пара тестов DataAccess, проверяющих, что мои репозитории работают правильно и бум, MSTest взрывается. Поскольку он пытается запустить все свои тесты одновременно, он получает ошибку, когда тест пытается получить доступ к файлу базы данных, в то время как другие тесты используют его.

Может кто-нибудь подумать об этом быстро? Я не хочу останавливать MSTest (хорошо, я делаю только одну историю), и я уверен, что не хочу запускать полномасштабную службу базы данных, поэтому я сделаю любой способ заставить MSTest не запускать одновременно или трюки с помощью открытие файлов.

У кого-нибудь есть идеи?

4b9b3361

Ответ 1

Вы можете попробовать использовать Monitor и войти в TestInitialize и выйти из TestCleanup. Если ваши тестовые классы зависят от внешнего файла, вам нужно будет использовать один объект блокировки для всех них.

public static class LockClass
{
    public static object LockObject = new object();
}

...

[TestInitialize]
public void TestSetup()
{
     Monitor.Enter(LockClass.LockObject);
}

[TestCleanup]
public void TestCleanup()
{
     Monitor.Exit(LockClass.LockObject);
}

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

Ответ 2

Я попытался использовать блокировки таким образом. Однако я столкнулся с тем, что VS2010 выполняет не выполнение тестов параллельно по умолчанию, но выполняет их последовательно в одном потоке. (однако параллельное выполнение можно было включить, но это не помешало бы проблеме полностью)

То, что я нахожу очень тревожным, заключается в том, что секвенциальное выполнение будет происходить в произвольном порядке, даже в тестовых классах!

Так, например, порядок выполнения может выглядеть следующим образом:

  • Класс A - TestInitialize: Lock будет установлен
  • Класс A - TestMethod1: выполнит, OK
  • Класс B - TestInitialize: будет установлен Lock = > Тема закрыта = > Complete UnitTests будет заблокирован! Причина в том, что нет других Threads, которые продолжали бы выполнять методы класса A. Таким образом, Montor.Exit() никогда не будет достигнуто.

Я не понимаю, почему M $делает это. Другие рамки UnitTest (например, JUnit) выполняют методы тестирования по классам. В противном случае будет чередование метода SetUp/TearDown, который может вызвать описанный хаос...

Есть ли кто-нибудь, кто знает, как предотвратить MSTest, прыгая между тестовыми классами? (В настоящее время я использую тестовый бегун Resharpers, который ведет себя так, как ожидалось, выполняя все методы тестирования одного класса перед тем, как продолжить следующий класс)