Поиск критичных комбинаций свойств в unit-тестах
#1
Отправлено 11 марта 2005 - 07:08
У нас возникла проблема с написанием unit-тестов. У нас есть несколько весьма объемных java-проектов, на которых мы применяем unit-тестирование. Сейчас в самом большом проекте около 800 unit-тестов. Еженочный автоматизированный прогон всех тестов на этом проекте занимает порядка 3 часов.
Проблема заключается в том, что unit-тестируя объекты, мы не можем протестировать влияние комбинаций свойств этого объекта на его работу.
Поясню простым примером. Предположим, что тестируется некий объект, обладающий одним методом и пятью свойствами p1.. p5. В простейшем случае мы пишем, грубо говоря, 5 тестов, в каждом из которых значения четырех свойств жестко фиксированы, а значение одного свойства динамически меняется. При этом в каждом тесте сравнивается только аспекты поведения объекта, связанные с тестируемым свойством. Таким образом мы ПО ОТДЕЛЬНОСТИ тестируем влияние каждого из пяти свойств на поведение объекта.
Все бы хорошо, но в последнее время часто стала возникать ситуация, когда каждое из свойств объекта само по себе работает нормально, НО при реальной эксплуатации находится такая комбинация значений свойств, при которой объект перестает функционировать, как было запланировано.
Хуже бывает, когда у метода есть пол дюжины методов и дюжина свойств. При этом, если из спецификации не следует, что какие-либо свойств могут оказывать влияние на работу метода, мы, как правило в тесте на работу этого метода всегда используем фиксированные значения не влияющих свойств.
Вопрос: кто как при автоматизированном тестировании решает проблему поиска влияния критичных комбинаций значений свойств на работу объектов? Не писать же десятки одинаковых тестов одного и того же метода, хардкодя каждый раз различные значения незначимых свойств объекта?!
Пока есть идея для всех свойств всех объектов создать справочник, описывающий возможные значения этих свойств. Далее, тест, проверяющий работу метода в объекте, пользуясь reflection, по справочнику перебирает все комбинации значений свойств, "по идее" не влияющих на работу метода. При этом значения ключевых (влияющих на работу метода) свойств задаются при создании теста разработчиком.
#2
Отправлено 11 марта 2005 - 08:42
Каким брать распределение для случайного выбора, можно решить отдельно для каждого свойства. Например, подобрать распределение, наиболее соответствующее реальной ситуации. И затем моделировать это распределение. Но для этого нужна статистика значений. В простейшем случае, можно просто равномерное распределение взять.
Более конкретно я вряд ли что скажу, но идея случайного выбора мне кажется в данном случае разумной.
#3
Отправлено 11 марта 2005 - 14:57
http://www.pnsqc.org...s/pnsqc2004.pdf
читать "James Bach, Pairwise testing: a best practice that isn't".
Почитать что-нибудь еще на эту тему.
В _моей_ практике метод показал себя с хорошей стороны :)
В итоге тесты вместо
assertTrue test_obj.getResult( 1, 2, ,3, 4, 5 ) assertTrue test_obj.getResult( 1, 2, ,2, 3, 1 )
выглядят так:
var opts = [ [1, ,2 ,3] , [ 2, 3, ,4] , [4, ,6, 8, 9, 0] , [4, ,6, 8, 9, 0] [1, ,2 ,3] , [ 2, 3, ,4] ] var comb_generartor = new pairwise_generator( opts ) /* or, even: if( is_smoke_test_run ) comb_generartor = new pairwise_generator( opts ) else comb_generartor = new all_combinations_generator( opts ) */ var combination; var expected_result; for(; comb_generartor.next(); ) { combination = comb_generartor.get_combination(); expected_result = get_expected_result( combination ) assertTrue compare( test_obj.getResult( combination ), expected_result ) }
самая сложная часть - get_expected_result()
Тут можно построить мини-модель AUT и использовать ее.
#4
Отправлено 14 марта 2005 - 06:34
На каком языке реализация?
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#5
Отправлено 14 марта 2005 - 15:18
Спасибо за совет, Алексей. Обязательно ознакомлюсь с указанной технологией.Артемий, Вам однозначно нужно начинать осваивать тестирование на основе моделей
Реализация у нас на Java.
Всем остальным отозвавшимся также спасибо!
#6
Отправлено 15 марта 2005 - 13:57
Этот тул может автоматически генерить большой список случайных и заранее определеннных чисел для выполнения юнит тестов. Помимо этого можно подключить внешную базу данных.
Но у него другая проблема. Для создания юнит тестов тул использует пользовательский интерфейс с контролами и не позволяет "писать" тесты в IDE. В результате на подготовку тестов уходит значительно больше времени. Да и сам процесс достаточно нудный.
#7
Отправлено 15 марта 2005 - 14:53
Тестирование систем с состоянием не по зубам ни одному инструменту, который генерирует отдельные тест-кейсы, в том числе и Parasoft не справляется с этим.Мы пробовали "прикрутить" к процессу Parasoft .Test для .НЕТа.
Этот тул может автоматически генерить большой список случайных и заранее определеннных чисел для выполнения юнит тестов. Помимо этого можно подключить внешную базу данных.
Чтобы тестировать системы с состоянием с строить разумные тестовые последовательности, нужна можель. Кстати, немногие знают, что инструменты Parasoft поддерживают model based testing. Но низенько-низенько :)
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium
#8
Отправлено 16 марта 2005 - 10:46
Алексей, Я уже понял, на что ты намекаешь.Тестирование систем с состоянием не по зубам ни одному инструменту, который генерирует отдельные тест-кейсы, в том числе и Parasoft не справляется с этим.Мы пробовали "прикрутить" к процессу Parasoft .Test для .НЕТа.
Этот тул может автоматически генерить большой список случайных и заранее определеннных чисел для выполнения юнит тестов. Помимо этого можно подключить внешную базу данных.
Чтобы тестировать системы с состоянием с строить разумные тестовые последовательности, нужна можель. Кстати, немногие знают, что инструменты Parasoft поддерживают model based testing. Но низенько-низенько :)
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных