Перейти к содержимому

Фотография

Поиск критичных комбинаций свойств в unit-тестах


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 Artemiy

Artemiy

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Бочков Артем Владимирович

Отправлено 11 марта 2005 - 07:08

Коллеги, прошу вашего совета.

У нас возникла проблема с написанием unit-тестов. У нас есть несколько весьма объемных java-проектов, на которых мы применяем unit-тестирование. Сейчас в самом большом проекте около 800 unit-тестов. Еженочный автоматизированный прогон всех тестов на этом проекте занимает порядка 3 часов.

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

Поясню простым примером. Предположим, что тестируется некий объект, обладающий одним методом и пятью свойствами p1.. p5. В простейшем случае мы пишем, грубо говоря, 5 тестов, в каждом из которых значения четырех свойств жестко фиксированы, а значение одного свойства динамически меняется. При этом в каждом тесте сравнивается только аспекты поведения объекта, связанные с тестируемым свойством. Таким образом мы ПО ОТДЕЛЬНОСТИ тестируем влияние каждого из пяти свойств на поведение объекта.
Все бы хорошо, но в последнее время часто стала возникать ситуация, когда каждое из свойств объекта само по себе работает нормально, НО при реальной эксплуатации находится такая комбинация значений свойств, при которой объект перестает функционировать, как было запланировано.

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

Вопрос: кто как при автоматизированном тестировании решает проблему поиска влияния критичных комбинаций значений свойств на работу объектов? Не писать же десятки одинаковых тестов одного и того же метода, хардкодя каждый раз различные значения незначимых свойств объекта?!

Пока есть идея для всех свойств всех объектов создать справочник, описывающий возможные значения этих свойств. Далее, тест, проверяющий работу метода в объекте, пользуясь reflection, по справочнику перебирает все комбинации значений свойств, "по идее" не влияющих на работу метода. При этом значения ключевых (влияющих на работу метода) свойств задаются при создании теста разработчиком.
  • 0

#2 PavelB

PavelB

    Постоянный участник

  • Members
  • PipPipPip
  • 169 сообщений
  • Город:Санкт-Петербург

Отправлено 11 марта 2005 - 08:42

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

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

Более конкретно я вряд ли что скажу, но идея случайного выбора мне кажется в данном случае разумной.
  • 0

#3 dlg99

dlg99

    Специалист

  • Members
  • PipPipPipPipPip
  • 609 сообщений
  • ФИО:Andrey Yegorov
  • Город:Redmond, WA

Отправлено 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 и использовать ее.
  • 0
Andrey Yegorov. Изображение

#4 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 14 марта 2005 - 06:34

Артемий, Вам однозначно нужно начинать осваивать тестирование на основе моделей вообще и UniTesK в частности. Не надо без нужды уменьшать количество тестовых комбинаций, нужно просто уметь генерировать их автоматически.

На каком языке реализация?
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#5 Artemiy

Artemiy

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Бочков Артем Владимирович

Отправлено 14 марта 2005 - 15:18

Артемий, Вам однозначно нужно начинать осваивать тестирование на основе моделей

Спасибо за совет, Алексей. Обязательно ознакомлюсь с указанной технологией.
Реализация у нас на Java.

Всем остальным отозвавшимся также спасибо!
  • 0

#6 Green

Green

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 233 сообщений
  • ФИО:Гринкевич Сергей
  • Город:Москва

Отправлено 15 марта 2005 - 13:57

Мы пробовали "прикрутить" к процессу Parasoft .Test для .НЕТа.

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

Но у него другая проблема. Для создания юнит тестов тул использует пользовательский интерфейс с контролами и не позволяет "писать" тесты в IDE. В результате на подготовку тестов уходит значительно больше времени. Да и сам процесс достаточно нудный.
  • 0
Гринкевич Сергей

#7 barancev

barancev

    Администратор

  • Admin
  • PipPipPipPipPipPip
  • 6 871 сообщений
  • ФИО:Алексей Баранцев
  • Город:Россия, Москва


Отправлено 15 марта 2005 - 14:53

Мы пробовали "прикрутить" к процессу Parasoft .Test для .НЕТа.

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

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

Чтобы тестировать системы с состоянием с строить разумные тестовые последовательности, нужна можель. Кстати, немногие знают, что инструменты Parasoft поддерживают model based testing. Но низенько-низенько :)
  • 0
Алексей Баранцев
Тренинги для тестировщиков (тестирование производительности, защищенности, тест-дизайн, автоматизация):
Линейка тренингов по Selenium

#8 Green

Green

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 233 сообщений
  • ФИО:Гринкевич Сергей
  • Город:Москва

Отправлено 16 марта 2005 - 10:46

Мы пробовали "прикрутить" к процессу Parasoft .Test для .НЕТа.

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

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

Чтобы тестировать системы с состоянием с строить разумные тестовые последовательности, нужна можель. Кстати, немногие знают, что инструменты Parasoft поддерживают model based testing. Но низенько-низенько :)

Алексей, Я уже понял, на что ты намекаешь.
:lol:
  • 0
Гринкевич Сергей


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных