3 ноября 2010 г.

Boundary Value Testing


Вступление

Boundary Value Testing (техника анализа граничных значений) наиболее известная и простая техника тест дизайна, призванная  помогать рядовому тестировщику выбирать наиболее эффективные значения для тестирования. Эта техника применима на всех уровнях тестирования - unit, integration, system, and system-integration test levels.

Подход

Шаги использования техники анализа граничных значений:

  1. Определите диапазон значений (как правило это класс эквивалентности).
  2. Определите границы диапазонов.
  3. На каждую границу создайте 3 тест кейса - один, проверяющий значение границы, второй на значение ниже границы и третий на значение выше границы.
"выше" и "ниже" границы значения относительные. Например, если мы говорим о границе 6$, то значение "ниже" будет 5$, а значение "выше" 7$. А если мы говорим о границе 6.00$, то значение "ниже" будет 5.99$, а значение "выше" 6.01$.

Примечание: значение "ниже" или "выше" границы может быть другим классом эквивалентности. В этом случае нет смысла создавать дубликаты тест кейсов.

Опять же, будем разбирать эту технику тест дизайна на примерах.


Пример 1. Одна сущность

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

  • 0–16 : Не нанимать
  • 16–18 : Можем нанять только на part time
  • 18–55 : Можем нанять на full time
  • 55–99 : Не нанимать
Представим, что наш девелопер написал такой код по этим требованиям:

      If (applicantAge >= 0 && applicantAge <=16)
                hireStatus="NO";
      If (applicantAge >= 16 && applicantAge <=18)
                hireStatus="PART";
      If (applicantAge >= 18 && applicantAge <=55)
                hireStatus="FULL";
      If (applicantAge >= 55 && applicantAge <=99)
                hireStatus="NO";
Хотя если попробовать предварительно оценить границы диапазонов требований, то сразу видна ошибка - диапазоны пересекаются, накладываются. На самом то деле имелось ввиду:

  • 0–15 : Не нанимать
  • 16–17 : Можем нанять только на part time
  • 18–54 : Можем нанять на full time
  • 55–99 : Не нанимать
Что по поводу значений -3 или 101? Мы можем только догадываться как они будут влиять на нашу программу, но угадывание требований плохая практика :) 

Код для наших требований в итоге должен быть таким:

      If (applicantAge >= 0 && applicantAge <=15)
                hireStatus="NO";
      If (applicantAge >= 16 && applicantAge <=17)
                hireStatus="PART";
      If (applicantAge >= 18 && applicantAge <=54)
                hireStatus="FULL";
      If (applicantAge >= 55 && applicantAge <=99)
                hireStatus="NO";

Следуюя технике граничных значений, значения, на которые мы должны составить тест кейсы, в этом случае будут {-1, 0, 1}, {15, 16, 17}, {17, 18, 19}, {54, 55, 56}, и {98, 99, 100}(не забудьте удалить дубликаты значений :)). Негативные тест кейсы со значения вроде {-42, 1001, FRED, %$#@} могут тоже быть составлены, в зависимости от реализации этого компонента и требований.

Пример 2. Несколько сущностей

Представим, что мы пишем софт для компании, занимающейся ипотечным кредитованием, где кредит выдается под залог имущества. А конкретней - наша компания выдает кредиты только под залог квартиры или дома. Наша задача протестировать форму ввода, которая решает можно выдавать кредит или нет. Требования следующие:
  1. Кредит выдается, если у человека доход составляет от 1,000$ до 83,333$.
  2. Заложить можно до 5 квартир/домов включительно.
Это и будут наши сущности:
  1. Доход. Доход мы будем тестировать на следующих значениях - {$999, $1,000, $1,001} "нижней границы" и {$83,332, $83,333, $83,334} "верхней" границы.
  2. Кол-во квартир/домов для залога. Т.к. заложить 0 и меньше домов нельзя, также как 6 и больше, это и будут наши границы - {0, 1, 2} "нижней границы" и {4, 5, 6} "верхней" границы.
Итого мы получим следующие тест кейсы:
Доход в месяц Кол-во Жилья Результат
$1,000 1 Valid
$83,333 1 Valid
$1,000 5 Valid
$83,333 5 Valid
$1,000 0 Invalid
$1,000 6 Invalid
$83,333 0 Invalid
$83,333 6 Invalid
$999 1 Invalid
$83,334 1 Invalid
$999 5 Invalid
$83,334 5 Invalid

Ну вот собственно и всё, значения готовы для составления тест кейсов.

Этот пост является вольным переводом Chapter 4 из книги "A Practitioner'S Guide To Software Test Design" by Lee Copeland.

18 комментариев:

  1. Спасибо, познавательно!

    ОтветитьУдалить
  2. пожалуйста, приятно чувствовать себя полезным :)

    ОтветитьУдалить
  3. "Если говорим о границе 6.00$, то значение "ниже" будет 4.99$, а значение "выше" 5.01$ и т.п."

    похоже опечатка? граница 5$ ...

    ОтветитьУдалить
  4. Да, опечатка. Спасибо, исправил.

    ОтветитьУдалить
  5. Супер) примеры оч радуют.

    ОтветитьУдалить
  6. Анонимный1 окт. 2013 г., 9:49:00

    Возможно, вам будет приятно узнать, что ваши статьи все еще актуальны, полезны и приятно читаются :)

    ОтветитьУдалить
  7. Этот комментарий был удален автором.

    ОтветитьУдалить
  8. А если верхняя граница не указана, то проводить тестирование значений "ниже", "выше" и значения нижней границы и всё? например классы эквивалентности: 1-10, 11-20, 21 и выше

    ОтветитьУдалить
    Ответы
    1. Всегда есть какие то разумные границы. Допустим если мы говорим о возрасте, то можно нагуглить максимальный зафиксированный возраст человека(что мне лень), ну или ограничиться значением 150 :D

      Удалить
  9. Спасибо большое! Очень просто, понятно, и самое главное - не отходя от Lee Copeland*да! Молодец!!!

    ОтветитьУдалить
  10. А прочему в табличке не все граничные значения? Например, $1,001, $83,332
    Кол-во Жилья: 2, 4

    ОтветитьУдалить
  11. А возможно такое тестирование применять, когда не два столбца данных, а допустим 4, или в таком случае лучше использовать какой то другой вариант тестирования ?

    ОтветитьУдалить
  12. А прочему в табличке не все граничные значения? Например, $1,001, $83,332
    Кол-во Жилья: 2, 4
    Тоже было бы интересно узнать :)

    ОтветитьУдалить
  13. А прочему в табличке не все граничные значения? Например, $1,001, $83,332
    Кол-во Жилья: 2, 4
    Тоже было бы интересно узнать :)

    ОтветитьУдалить
    Ответы
    1. В книге Lee Copeland дается разъяснение по этому поводу: наружные приграничные точки совмещают в себе также и внутренние приграничные точки. Поэтому внутренние точки не были включены в тесты. Только вот непонятно, почему этот принцип не работал в случае одной сущности.

      Удалить
  14. Тоже интересно:)

    ОтветитьУдалить
  15. А почему не проверяются пары 1000 - 4 b 83,333-4?

    ОтветитьУдалить