Отладка тестирования NUnit

Я работаю над библиотекой геометрии. Есть более 200 модульных тестов.

Там особенно упорный тест, который терпит неудачу, когда я выбираю "Запустить все", но тест проходит, когда я запускаю этот тест по отдельности или использую отладчик на нем. Я действительно верю, что проблема возникла, когда я перешел от визуальной студии '13 к изданию '15.

Теперь некоторые заметки о библиотеке геометрии:

Объекты неизменяемы.

У тестов нет общих объектов между ними.

Итак, мой вопрос: Каковы возможные причины этого нечетного поведения?

Edit:

[Test()]
public void Plane_IntersectionWithPlane_IdenticalPlane()
{
     Plane testPlane = new Plane(new Direction(Point.MakePointWithInches(2, -1, 1)), 
                                               Point.MakePointWithInches(2, 1, 2));
     Line found = (testPlane.Intersection(testPlane));

     Line expected = new Line(new Direction(Point.MakePointWithInches(0, -1, -1)), 
                                            Point.MakePointWithInches(2, 1, 2));
     Assert.IsTrue(found.Equals(expected));
}

Ответы

Ответ 1

Попробуйте следующее:

Откройте графический интерфейс Nunit. Перед тем, как запустить тестовое изменение, выполните указанные выше настройки:

введите описание изображения здесь

Это помогло мне разобраться в моих проблемах.

BTW: какую версию NUNIT вы используете? Если вы не знаете, что такое Nunit GUI, вы, вероятно, не загрузили Nunit отдельно. Вы можете получить установку отсюда:

http://www.nunit.org/index.php?p=download

Ответ 2

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

  • Статическое строительство объекта/разрушение
  • Проблемы с синхронизацией
  • Проблемы с установкой/очисткой макета

Я нашел лучший подход для отслеживания проблемы, следуя подходу, подобному тому, который предложил @Matthew Strawbridge в комментариях. Я добавляю атрибуты Ignore к Tests/TestFixtures для удаления тестов до тех пор, пока запуск не начнет работать, а затем начнет добавлять их обратно до тех пор, пока он не сломается снова, сужая проблему.

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

Глядя на код между тестами, которые выходят из строя/могут вызвать отказ, можно помочь вам сузить взаимодействие. Разумеется, причина ошибки/отказа в тестах также может помочь...

Выбор "Run-all" запускает все тесты в предсказуемом порядке, поэтому тесты обычно запускаются одинаково каждый раз. Если вы выберете партию тестов, то возможно, что бегун может выбрать запуск их в другом порядке, основываясь на вашем порядке выбора, что может быть связано с тем, что при тестировании вы испытываете различное поведение, а не используете run-all.

Ответ 3

Из того, что я вижу в тестовом сценарии, расходящееся поведение странно, но сбой теста - это вполне допустимый результат:

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

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

Извините, что разместил это как ответ, а не комментарий - отсутствующий представитель.

Ответ 4

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

Сначала вы можете запустить этот тестовый файл в отдельном домене приложения, чтобы подтвердить поведение перед запуском поиска статической переменной. Прости, что я никогда не пытался создать новый appdomain в nunit. Но один из ответов здесь дает подсказку о том, как создать новый appdomain для тестового примера - Запустить единичные тесты в разных приложениях с помощью NUnit

Ответ 5

Если этот тест проходит изолированно, но не работает при выполнении других тестов, то очень вероятно, что у вас есть какое-то общее состояние в ваших классах.

Если вы скажете, что все наши объекты неизменяемы, то сначала я предпочел бы посмотреть на реализацию

Line Intersection (Plane plane);

Вы ожидаете, что этот метод вернет строку, которая считается такой же, как и ваша "ожидаемая" строка, поэтому, вероятно, Intersection возвращает строку на основе некоторого общего состояния.

Не могли бы вы показать нам реализацию пересечения?