MSTest, выполняя все мои тесты одновременно, ломает тесты - что делать - PullRequest
23 голосов
/ 31 марта 2009

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

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

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

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

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

Ответы [ 3 ]

33 голосов
/ 31 марта 2009

Возможно, вы захотите попробовать 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);
}

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

5 голосов
/ 17 мая 2010

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

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

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

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

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

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

2 голосов
/ 02 ноября 2011

Использовать заказанный тест

http://msdn.microsoft.com/en-us/library/ms182630(v=VS.90).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...