2010-09-22 2 views
4

Я искал какое-то решение для разработчиков программного обеспечения, которые тратят слишком много времени на регрессионные проблемы с тестированием единицы (около 30% времени в моем случае !!!), т. Е. Занимаются модульными тестами, которые не выполняются на изо дня в день.Как преодолеть проблемы регрессии тестового теста ...?

После одно решение я знаком, который анализирует, какой из последних изменений кода вызвало определенный тест к сбою:

Unit Test Regression Analysis Tool

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

С благодарностью на продвинутом этапе

+2

Являются ли тесты неудачными из-за изменений, которые приводят к нарушению производственного кода, или потому, что тесты слишком чувствительны? –

+1

@ Jon Хорошая точка. В частности, не следует проверять детали реализации устройства, но только одну функциональность. Это распространенная ошибка. –

ответ

2

Часто проверяйте часто.

Если вы этого не сделаете, я предлагаю использовать инструмент Continuous Integration и попросить/потребовать от разработчиков запустить автоматические тесты до. По крайней мере, подмножество тестов. Если запуск всех тестов занимает слишком много времени, используйте инструменты CI, которые генерируют сборку (включая запуск всех автоматических тестов) для каждой фиксации, поэтому вы можете легко увидеть, какая фиксация нарушила сборку.

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

+0

Привет, Извините за поздний ответ - я не был в офисе. Спасибо за ваши ответы. – SpeeDev

+0

Привет, Извините за поздний ответ - я не был в офисе. Спасибо за ваши ответы. 3. Да. Тесты довольно уникальны. Конечно, есть код инфраструктуры, который будет работать в большинстве тестов, но в основном - мы не дублируем тесты. 4. Мы часто тестируем, но это не всегда помогает. Прежде всего, существуют сборки, в которых большие переменные устанавливаются в исходный элемент управления, а во-вторых, бывают случаи, когда сборка нестабильна, а компиляция не выполняется в течение нескольких дней, а затем я получаю уведомление о том, что тест не удалось через неделю после того, как он действительно потерпел неудачу. – SpeeDev

+0

5. Что касается запуска автоматических тестов перед каждой фиксацией - нереалистично в моих (и я верю в большинстве случаев) ситуаций, так как для запуска всех тестов интеграции требуется очень много времени для запуска, и даже если мы будем запускать его, тест не работает на моей машине. Мне все еще нужно выяснить, что, если изменения кода привели к сбою в модульном тесте, - но вы правы, что это должно быть проще. – SpeeDev

3

У вас есть наше сочувствие. Похоже, у вас есть синдром хрупкого теста. В идеале одно изменение единичного теста должно только разорвать один тест - и это должно быть реальной проблемой. Как я сказал, «в идеале». Но этот тип поведения распространен и поддается лечению.

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

Anywho, несколько других вещей, которые я видел, что причиной этого:

  • Юнит-тесты, как правило, не должны зависеть от более чем класс и метод их тестирования. Посмотрите на зависимости, которые закрались. Убедитесь, что вы используете инъекцию зависимостей, чтобы упростить тестирование.
  • Действительно ли это уникальные тесты? Или они испытывают одно и то же снова и снова? Если они всегда будут терпеть неудачу вместе, почему бы просто не удалить все, кроме одного?
  • Многие люди предпочитают интеграцию по модульным тестам, так как они получают больше средств для их доллара. Но при этом одно изменение может ломать множество тестов. Может быть, вы пишете интеграционные тесты?
  • Возможно, все они проходят через обычный код настройки для множества тестов, что приводит к их разрыву в унисон. Возможно, это может быть издевательствовано, чтобы изолировать поведение.
+0

Yup. Нет простого ответа. Напишите лучшие тесты. –

+0

Hi, Извините за поздний ответ - я не работал. 1. Я написал «единичные тесты», но как модульные тесты, так и интеграционные тесты. На деле интеграционные тесты - это те, которые обычно терпят неудачу. 2. Что касается «причудливых инструментов, которые отслеживают, какие тесты терпят неудачу чаще всего» - инструмент, который я опубликовал, не отслеживает, какие тесты терпят неудачу больше всего, но обнаруживает изменения кода, которые привели к сбою теста устройства (смотрите фильм в ссылку выше, если вы хотите лучше понять, как это работает).Это единственное, что я нашел в Интернете, но, конечно, я открыт для других типов решений и методологий. – SpeeDev

+0

Любые другие предложения будут назначены. Большое спасибо – SpeeDev

2
  1. Что касается работы подмножество наиболее вероятного испытания на провал - так как он, как правило, не удается из-за других членов команды (по крайней мере, в моем случае), мне нужно, чтобы просить других, чтобы запустить мой тест - который мог бы быть «политически проблематичным» в некоторых средах разработки;). Любые другие предложения будут назначены. Большое спасибо - SpeeDev 30 сентября '10 в 23:18

Если вы должны «спросить другие», чтобы запустить ваш тест то, что предполагает серьезные проблемы с тестовой инфраструктурой. Все тесты (независимо от того, кто их написал) должны запускаться автоматически. Ответственность за устранение неудачного теста должна заключаться в том, что лицо, совершившее изменение, не является автором теста.