Есть ли способ запустить модульные тесты последовательно с MSTests? - PullRequest
32 голосов
/ 09 октября 2009

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

Сбой модульных тестов VSTS при тестировании бизнес-объектов и подсистем, которые не являются поточно-ориентированными. Это нормально для них, чтобы не быть потокобезопасными, вот как приложение использует их.

Но подход MS-тестов «один поток на TestMethod» убивает нас. Мне пришлось реализовать блокировки объектов во многих классах модульных тестов, просто чтобы убедиться, что тесты выполняются один за другим (меня не интересует порядок, но я не могу иметь два метода тестирования, поражающие один и тот же объект в в то же время).

Код выглядит так:

[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
      }
   }

}

Есть ли лучший / более элегантный способ последовательного запуска теста?

Ответы [ 6 ]

27 голосов
/ 09 октября 2009

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

Тест> Новый тест> Упорядоченный тест

image New Test">

Ordered Test

19 голосов
/ 09 октября 2009

Существует понятие "Упорядоченный тест", в котором вы можете перечислять тесты в последовательности. Он больше ориентирован на обеспечение определенного последовательного порядка, но я не понимаю, как это было бы возможно, если бы B не ждал завершения A.

Кроме того, к сожалению, ваши тесты мешают друг другу. Существуют методы Setup / TearDown, которые можно использовать для каждого теста, так что в конце концов можно будет изолировать тесты друг от друга.

18 голосов
/ 13 марта 2015

Вы можете использовать Плейлист

щелкните правой кнопкой мыши на методе тестирования -> Добавить в список воспроизведения -> Новый список воспроизведения

затем вы можете указать порядок исполнения enter image description here

13 голосов
/ 05 июня 2014

Вы можете специально требовать мьютекс для каждого выполнения теста, либо в конкретных тестах, которые вы хотите сериализовать, либо для всех тестов в классе (независимо от того, используется ли общая строка мьютекса).

Для всего класса теста вы можете использовать атрибуты 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();
}

Чтобы было ясно, что это не особенность тестов, ЛЮБАЯ структура блокировки должна работать. Я использую систему мьютекс в этом случае: https://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx

8 голосов
/ 09 октября 2009

Я наконец-то использовал заказанный метод испытаний. Хорошо работает.

Однако у меня было чертовски много времени, чтобы заставить его работать со сборкой NAnt. Для запуска only упорядоченный список тестов в сборке требует использования ключей / testmetadata и / testlist в блоке вызова MSTest. Документация на них отрывочна, чтобы использовать вид описания. Я гуглюсь повсюду за примерами "MSTest / testmetadata / testlist" безрезультатно.

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

  1. Отредактируйте файл тестовых метаданных (с расширением .vsmdi) и добавьте новый список. к списку тестов (первый узел в дереве слева панель. Дайте ему желаемое имя, например, «SequentialTests».
  2. Если вы использовали ключ / testcontainer для вызова MSTest, удалите его.
  3. Добавить переключатель для MSTest -> / testmetadata:
  4. Добавить переключатель для MSTEst / testlist: SequentialTests (или любое другое имя, которое вы использовали)

Затем MSTest запускает только те тесты, которые перечислены в созданном вами списке тестов.

Если у кого-то есть лучший метод, я бы хотел услышать об этом!

2 голосов
/ 21 ноября 2014

Я использовал заказанные тесты, а также легко настраивал их на jenkins, просто используйте команду

MSTest /testcontainer:"orderedtestfilename.orderedtest "/resultsfile:"testresults.trx"

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