MSTest, выполняющий все мои тесты, одновременно ломает тесты - что делать
Хорошо, это раздражает.
MSTest выполняет все мои тесты одновременно, что приводит к сбою некоторых из них. Нет, это не потому, что мои тесты хрупки и восприимчивы к порядку сборки, а потому, что это демонстрационный проект, в котором я использую базу данных объектов Db4o, запущенную из файла.
Итак, у меня есть пара тестов DataAccess, проверяющих, что мои репозитории работают правильно и бум, MSTest взрывается. Поскольку он пытается запустить все свои тесты одновременно, он получает ошибку, когда тест пытается получить доступ к файлу базы данных, в то время как другие тесты используют его.
Может кто-нибудь подумать об этом быстро? Я не хочу останавливать MSTest (хорошо, я делаю только одну историю), и я уверен, что не хочу запускать полномасштабную службу базы данных, поэтому я сделаю любой способ заставить MSTest не запускать одновременно или трюки с помощью открытие файлов.
У кого-нибудь есть идеи?
Ответы
Ответ 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, который ведет себя так, как ожидалось, выполняя все методы тестирования одного класса перед тем, как продолжить следующий класс)
Ответ 3
Используйте упорядоченный тест
http://msdn.microsoft.com/en-us/library/ms182630(v=VS.90).aspx