Границы приемочных испытаний

мое приложение, среди прочего, использует некоторые поисковые роботы для чтения информации, предоставленной удаленным xml-потоком другим приложением (мы не несем ответственности за это). Просканированные данные позже отображаются пользователю. XML-файл может содержать простые данные и ссылки, которым мы следуем, если нам нужны дополнительные данные.

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

Я рассуждал о приемочных испытаниях, и именно об этом этот вопрос. Прямо сейчас для каждого приемочного теста мы предоставляем встроенный http-сервер, который обслуживает некоторые тестовые данные, специфичные для теста. Затем мы запускаем наше приложение, сканируем тестовые данные и проверяем критерии теста. Хотя этот подход имеет преимущество тестирования всей системы от начала до конца, он также имеет побочный эффект значительного увеличения времени сборки каждый раз, когда мы добавляем новый приемочный тест.

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

Я хотел бы услышать некоторые мысли от кого-то еще. :-)

Спасибо!


person TheImplementer    schedule 01.05.2014    source источник


Ответы (2)


Приемочные тесты, как правило, выполняются медленно, требуют дополнительной настройки и, как правило, гораздо более хрупкие, чем модульные или интеграционные тесты. Если вы поищите в Интернете «тестовую пирамиду», вы найдете много информации об этом. Общее мнение состоит в том, что у вас должны быть тесты на уровне модуля, интеграции и приемки. Большинство тестов представляют собой модульные тесты, и лишь несколько приемочных тестов выполняют комплексные действия. Часто команды разработчиков настраивают свои ci-серверы только для запуска длительных приемочных тестов во время ночных процессов сборки, чтобы они не влияли на производительность тестовых прогонов модульных тестов.

person Andrew    schedule 02.05.2014

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

Ваша команда создает продукт, и ваша компания хочет получить от этого наилучшее соотношение цены и качества.

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

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

Пусть P(bug | test) обозначает вероятность bug при условии, что вы запускаете test, пусть C(test) обозначает стоимость выполнения теста, а C(bug) обозначает стоимость ошибки.

Если вы сосредоточитесь на конкретной ошибке*, вы хотите свести к минимуму следующее:

P(bug | test_1)*C(bug) + C(test_1) ... P(bug | test_n)*C(bug) + C(test_n)

Где ваш набор состоит из n тестов.

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

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

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

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

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

Последняя вещь. Хорошо строить с учетом устойчивости к сбоям — это снизит для вас стоимость ошибок.

person velocipedist    schedule 06.05.2014