Можете ли вы автоматически перезапускать тесты в TestCleanup

#c# #mstest

#c# #mstest

Вопрос:

У нас есть куча тестов на моей работе, которые иногда терпят неудачу, если нагрузка на наш сервер CI становится слишком высокой или время ожидания вызова API внешней службы (GoogleDocs и т. Д.) истекает. Есть ли способ, которым я мог бы настроить код TestCleanup, чтобы тесты можно было запускать повторно, и если они проходят, они не отображаются как сбои в файлах .trx?

Мы используем VS2013 / .Net 4.5 MSTest, и результаты в конечном итоге поступают в Jenkins. Что я хотел бы иметь возможность сделать, так это обнаружить, что что-то не удается из-за регулирования или загрузки, добавить код задержки и повторить попытку снова. Возможно ли это?

Ответ №1:

Я столкнулся с аналогичной проблемой. Иногда тест завершается неудачно из-за внешнего ресурса, завершая весь прогон. Я пытался найти простое решение вашей проблемы, но после долгих исследований я этого не сделал — после того, как тест провалился, вы не можете изменить его результат в том же прогоне.

Моим окончательным решением было написать внешний скрипт (даже не обязательно на C #), который запускает тесты с использованием VSTest.console.exe или MSTest.exe , анализирует полученный trx, а затем решает, какие тесты следует выполнить повторно. Это не очень сложная задача, поскольку извлечь имена и ошибки неудачных тестов из trx легко с помощью любой приличной xml-библиотеки.

Ответ №2:

Так вы можете извлечь имена неудачных случаев.

   System.Xml.Linq.XDocument xDoc = XDocument.Load("full/path/to/trx");
  System.Xml.Linq.XNamespace defaultNs = "http://microsoft.com/schemas/VisualStudio/TeamTest/2010";

  List<System.Xml.Linq.XElement> UnitTestResultNode = (from data in xDoc.Descendants(defaultNs   "Results")
                                                                 select data).Descendants(defaultNs   "UnitTestResult").ToList();
  var failedset = (from src in UnitTestResultNode
                             where src.Attribute("outcome").Value == "Failed"
                             select new { src.Attribute("testName").Value }).ToList();
 

после того, как вы получите неудачные случаи, вы можете перейти к агенту тестирования VSTest.