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

Есть ли способ запуска модульных тестов последовательно с 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
      }
   }

}

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

4b9b3361

Ответ 1

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

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

Ответ 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"