Тестирование в Visual Studio выполняется индивидуально, неудачно в наборе - PullRequest
16 голосов
/ 30 декабря 2008

Когда я запускаю свои тесты в Visual Studio по отдельности, все они проходят без проблем. Однако, когда я запускаю их все сразу, некоторые проходят, а некоторые терпят неудачу. Я попытался поставить паузу в 1 секунду между каждым методом теста, но безуспешно.

Есть идеи? Заранее спасибо за помощь ...

Ответы [ 7 ]

8 голосов
/ 30 декабря 2008

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

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

2 голосов
/ 30 декабря 2008

Все, вероятно, правы, некоторые общие даты изменяются между тестами. Но обратите внимание на порядок выполнения MS Test . Простая пауза между тестами не является решением. Каждый тест выполняется в своем собственном экземпляре класса теста в отдельном потоке.

2 голосов
/ 30 декабря 2008

Вполне возможно, что некоторые модификации / реализации, сделанные в одном тесте, влияют на другие. Это указывает на плохую конструкцию теста и отсутствие надлежащей изоляции.

0 голосов
/ 14 августа 2018

Я столкнулся с подобной проблемой здесь, как я решил ее:

  1. Скопируйте код второго теста внутри первого теста (после него).
  2. Попробуйте проверить первый тест. Первый тест, вероятно, потерпит неудачу, и затем вы можете отладить первый тест (шаг за шагом), чтобы найти статическую / разделяемую переменную или логику, которая создает проблему.
0 голосов
/ 22 августа 2014

Я также столкнулся с этой проблемой, хотя моя проблема оказалась поточной. В моем случае я подделывал объект HttpContext, поскольку тесты основывались на его существовании. Однако я устанавливал это в методе ClassInitialize, полагая, что он будет использоваться для каждого метода, как показано ниже:

[ClassInitialize]
public static void ClassInit(TestContext testContext)
{
    HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
}

Однако оказывается, что каждый метод тестирования в классе выполняется в отдельном потоке. Поэтому мне пришлось добавить этот код в каждый метод тестирования, который использовался для решения проблемы.

[TestMethod]
public void TestMethod1()
{
    HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
    ...
}

[TestMethod]
public void TestMethod2()
{
    HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
    ...
}

См. Ссылку для получения дополнительной информации по этому вопросу. http://blogs.msdn.com/b/nnaderi/archive/2007/02/17/explaining-execution-order.aspx

0 голосов
/ 26 июня 2014

Другие платформы модульного тестирования, которые я использовал, усердно работают, чтобы гарантировать, что тест дает идентичные результаты, независимо от того, выполняется ли тест по отдельности или как часть альтернативы «запусти их всех». Цель состоит в том, чтобы предотвратить влияние одного теста на другой из-за побочных эффектов, таких как (например), когда один тест оставляет статическое состояние класса в конфигурации, которую другой тест не ожидает. Среда модульного тестирования VS не обеспечивает такую ​​изоляцию. У меня есть 2 предложения по минимизации проблем, о которых идет речь. Во-первых, используйте нестатический класс в предпочтении статическому классу, если класс имеет состояние (имеет что-то кроме статических методов). Создайте один экземпляр этого класса и сохраните в нем информацию о состоянии, которая хранилась в статическом классе. Во-вторых, если вы решили иметь статический класс (ы) со статическим состоянием, имейте статический метод, который устанавливает статическое состояние обратно в «пустое» (например, метод, который устанавливает все статические свойства в нуль / ноль / и т. Д.). Вызывайте это в конце каждого модульного теста, чтобы отменить любые эффекты, которые тест оказал на статическое состояние. (По общему признанию это менее чем элегантно, но может быть осуществимо, если сделано в умеренности). Или сделайте то, что я планирую сделать, - найдите платформу для модульных тестов, которая обеспечивает изоляцию между тестами.

0 голосов
/ 30 декабря 2008

согласно другим ответам. Похоже, у вас есть одноэлементная или глобальная переменная, которая вызывает взаимодействие.

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