Экзамен ISTQB базовый уровень: Решаем задачи. Как определить тестовое покрытие и посчитать количество тестов, необходимых для полного покрытия кода

В случае тестирования белого ящика, силлабус v4 (рабочая программа для студентов) ISQB предлагает строить тестовые сценарии, ориентируясь на тестовое покрытие:

  • Statement coverage — покрытие операторов в коде;
  • Branch coverage — покрытие веток;

При этом в самом силлабусе нет подробных объяснений тому, как посчитать количество тестов, необходимое для обеспечения 100% покрытия кода. А задачи на экзамене есть!

Вот задача из одного из примеров экзаменационных билетов:
Given the following code, which is true:

IF A > B
THEN C = A – B
ELSE C = A + B
ENDIF
Read D
IF C = D
Then Print “Error”
ENDIF

a) 1 test for statement coverage, 3 for branch coverage
b) 2 tests for statement coverage, 2 for branch coverage
c) 2 tests for statement coverage. 3 for branch coverage
d) 3 tests for statement coverage, 3 for branch coverage
e) 3 tests for statement coverage, 2 for branch coverage
Предполагается, что мы смотрим в код, понимаем структуру кода, условия и зависимости, которые есть в этом коде и проектируем на основе этого тесты.

В разделах, связанных с тестированием белого ящика, силлабус дает нам следующую информацию о Statement Coverage и Branch Coverage.
4.3.1. Тестирование операторов и покрытие операторов

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

100%-ное покрытие операторовдостигается, когда все исполняемые операторы в коде были выполнены хотя бы один раз в т. ч. выполняются операторы с дефектами.

Однако, тестирование операторов не во всех случаях позволяет обнаружить дефекты. Например, не обнаружаться дефекты, зависящие от данных. Кроме того, 100%-ное покрытие операторов не гарантирует, что вся логика принятия решений протестирована, поскольку, например, могут использоваться не все ветки в коде.

4.3.2. Тестирование веток и покрытие веток

Ветка - это передача управления между двумя узлами в графе потока управления, которая показывает возможные последовательности исполнения операторов.
Каждая такая передача управления может быть либо безусловной, либо условной.
При тестировании веток единицей измерения тестового покрытия является ветка. Цель такого тестирования - разработать тест-кейсы, которые проверяют ветки в коде, пока не будет достигнут желаемый уровень тестового покрытия.
Тестовое покрытие в этом случае измеряется как процентное соотновшение выполненых веток к общему количеству веток в коде.
100% покрытие веток достигается тогда, когда все ветки кода, безусловные и условные, проверяются тест-кейсами.
Условные ветки обычно соответствуют:
  • истинному или ложному результату решения «if... else»,
  • результату работы оператора switch/case
  • решению выйти или продолжить работу в цикле.
Однако, тестирование веток не во всех случаях позволяет обнаружить дефекты.
Например, не обнаружатся дефекты, требующие выполнения определенного пути в коде.
Все это значит, что любой тест-кейс, обеспечивающий 100%-ное покрытие веток, также обеспечивает 100%-ное покрытие операторов (но не наоборот).
Не слишком-то понятно! Кроме того вводится дополнительное понятие пути, которое не имеет объяснения в этой версии силлабуса.

Если немного покопаться в разных источниках, то мы встретим такие виды покрытий.

  • Statement coverage — покрытие операторов в коде;
  • Decision coverage — покрытие решений;
  • Branch coverage — покрытие веток;
  • Path coverage - покрытие путей.

Давайте разберемся поподробнее.
Statement coverage — покрытие операторов в коде.
Оператор - наименьшая неделимая единица выполнения.
В приведенном выше примере это, например, C = A – B или Print “Error”.

Decision coverage — покрытие решений.
Решение - это точка/узел программы, в котором программа имеет два или более альтернативных маршрута.
В примере выше это IF A > B и IF C = D

Branch coverage — покрытие веток.
Ветка - это альтернативный маршрут, выходящий из точки решения.
Покрытие веток измеряет покрытие как условных, так и безусловных веток.

Path coverage - покрытие путей.
Путь - это маршрут из условно “начальной” точки программы до условно “конечной”. В нашем примере “начальная” точка программы это IF A > B, а “конечная” - последний ENDIF.
Теперь на выбранном примере давайте посчитаем сколько тестов потребуется для достижения 100% Statement Coverage и Branch Coverage, а так же дополнительно посчитаем Path Coverage.

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

Statement Coverage (покрытие операторов)

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

Первый путь, покрывающий часть узлов блок-схемы: 1B-3D-E-4F-5H-6I

Но остался еще один не покрытый узел 2 и нам понадобится еще один путь: 1А-2С-E-4F-5H-6I

Таким образом двумя путями т.е. двумя тестами мы покрыли все узлы блок-схамы т.е. обеспечили 100% покрытие операторов.

Branch Coverage (покрытие веток)

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

Первый путь, покрывающий часть ребер блок-схемы: 1B-3D-E-4F-5H-6I.

Таким образом мы покрыли ребра B, D, E, F, H, I, но ребра A, C и G остались непокрытыми.

Для того, чтобы их покрыть нам нужен еще один путь (тест): 1А-2С-E-4F-G.

Таким образом, двумя тестами мы покрыли все ребра блок-схемы т.е. обеспечили 100% покрытие веток.

И для нашей задачи

Given the following code, which is true:
IF A > B
THEN C = A – B
ELSE C = A + B
ENDIF
Read D
IF C = D
Then Print “Error”
ENDIF

a) 1 test for statement coverage, 3 for branch coverage
b) 2 tests for statement coverage, 2 for branch coverage
c) 2 tests for statement coverage. 3 for branch coverage
d) 3 tests for statement coverage, 3 for branch coverage
e) 3 tests for statement coverage, 2 for branch coverage

Правильным ответом будет b): 2 теста для 100% покрытия операторов и 2 теста для 100% покрытия веток.

Path Coverage (покрытие путей)

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

Начальная точка блок-схемы - 1, конечная - последний ENDIF. По сути нам нужно посчитать сколько существует различных путей, чтобы попасть из начальной точки в конечную. Таких путей будет 4.

1B-3D-E-4F-5H-6I
1B-3D-E-4F-G
1A-2C-E-4F-5H-6I
1A-2C-E-4F-G

То есть для обеспечения 100% покрытия путей нам необходимо 4 теста.

Задача решена!