Есть ли способ запуска модульных тестов последовательно с MSTests?
Я работаю в приложении, которое в основном однопоточное, однопользовательское.
Существует несколько рабочих потоков здесь и там, и они используют только потокобезопасные объекты и классы. Модульные тесты фактически тестируют те, у которых есть несколько потоков (явно созданных для тестов), и они отлично проверяют.
Тестирование модулей VSTS не выполняется при тестировании бизнес-объектов и подсистем, которые не являются потокобезопасными. Это нормально для них, чтобы они не были потокобезопасными, так как приложение их использует.
Но метод "один поток на тестMethod" тестов MS убивает нас. Я должен был реализовать блокировки объектов во многих классах unit test, чтобы гарантировать, что тесты запускаются один за другим (я действительно не забочусь о порядке, но я не могу использовать два метода тестирования, ударяющих один и тот же объект в то же время).
Код выглядит следующим образом:
[TestClass]
public class TestSomeObject
{
static object turnStile = new object();
...
[TestMethod]
public void T01_TestThis()
{
lock(turnStile)
{
.. actual test code
}
}
[TestMethod]
public void T02_TestThat()
{
lock(turnStile)
{
-- actual test code
}
}
}
Есть ли лучший/более элегантный способ сделать тестовый запуск последовательно?
Ответы
Ответ 1
Существует понятие "упорядоченного теста", в котором вы можете последовательно перечислить тесты. Он больше ориентирован на обеспечение определенного последовательного порядка, но я не вижу, как это возможно, если B не ждет завершения A.
Кроме того, к сожалению, ваши тесты мешают друг другу. Существуют методы Setup/TearDown, которые могут использоваться для каждого теста, чтобы в конце концов было возможно изолировать тесты друг от друга.
Ответ 2
Используйте Упорядоченный тест.
Тест > Новый тест > Упорядоченный тест
![Test > New Test]()
![Упорядоченный тест]()
Ответ 3
вы можете использовать Список воспроизведения
щелкните правой кнопкой мыши по методу тестирования → Добавить в плейлист → Новый плейлист
вы можете указать порядок выполнения
![enter image description here]()
Ответ 4
Для каждого теста можно специально запросить мьютекс, либо в конкретных тестах, которые вы хотите сериализовать, либо для всех тестов в классе (независимо от того, что имеет общую строку мьютекса).
Для всего тестового класса вы можете использовать атрибуты TestInitialize и TestCleanup, например:
private readonly Mutex testMutex = new Mutex(true, "MySpecificTestScenarioUniqueMutexString");
[TestInitialize]
public void Initialize()
{
testMutex.WaitOne(TimeSpan.FromSeconds(1));
}
[TestCleanup]
public void Cleanup() {
testMutex.ReleaseMutex();
}
Чтобы быть ясным, это не является особенностью тестов, ЛЮБАЯ блокирующая структура должна работать. В этом случае я использую предоставленные системой Mutexes:
https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx
Ответ 5
Наконец, я использовал метод упорядоченного теста. Он работает хорошо.
Однако, у меня было время, когда он работал с сборкой NAnt.
Запуск только упорядоченного списка тестов в сборке требует использования переключателей /testmetadata и/testlist в блоке вызова MSTest.
Документация по ним является отрывочной, чтобы использовать своеобразное описание. Я google повсюду для примеров "MSTest/testmetadata/testlist" не имеет никакого эффекта.
Трюк прост, однако, и я вынужден вернуть его сообществу, если кто-то другой столкнется с тем же вопросом.
- Отредактируйте файл тестовых метаданных (с расширением .vsmdi) и добавьте новый список
к списку тестов (первый node в дереве слева
панель. Дайте ему имя, которое вы хотите, например "SequentialTests".
- Если вы использовали переключатель /testcontainer для вызова MSTest, удалите его.
- Добавить переключатель для MSTest
- > /testmetadata:
- Добавить переключатель для MSTEst /testlist: SequentialTests (или любое другое имя, которое вы использовали)
Затем MSTest запускает только те тесты, которые указаны в списке тестов, который вы создали.
Если у кого-то есть лучший метод, я хотел бы услышать об этом!
Ответ 6
Я использовал упорядоченные тесты, также легко настраивал их на jenkins, просто используя команду
MSTest/testcontainer: "orderedtestfilename.orderedtest" /resultsfile: "testresults.trx"