В книге «Тестирование программного обеспечения. Основы» мной подробно описан двадцать один метод проектирования тестов. В данной статье мы сосредоточимся на самом сложном из них — методе причинно-следственного графа. Данный метод имеет собственные нотации, которые используются для визуализации причинно-следственных связей между входными данными и ожидаемыми результатами. Несмотря на сложность его практического применения знание этого метода расширяет понимание подходов к тестированию.
Граф – это способ визуального представления некоторой системы или процесса в виде сети, состоящей из узлов и связей между ними.
Причинно-следственный граф – метод для создания тестов, основанный на анализе взаимосвязей между различными факторами в программе использующий графическое моделирование причинно-следственных связей.
Англоязычное именование метода «Cause-Effect graphing». Основная идея метода заключается в выявлении причинно-следственных связей между входными данными (причинами) и ожидаемым поведением программы (следствиями). Следствия также называют эффектами, т.е. подав некие входные данные в программу мы достигаем определённого эффекта (результата). Под входными данными в данном случае подразумеваются определённые данные, переданные в программу, соблюдение определённых условий в программе или события, произошедшие в программе. Данный метод используется для проектирования тестов на основании спецификации требований.
Алгоритм проектирования тест-кейсов по данному методу:
- С целью облегчения процесса проектирования тестов, спецификация требований разбивается на отдельные небольшие логические (функциональные) блоки.
- Определяются входные условия (причины) и поведение программы (следствия).
- Каждой причине и следствию присваивается свой идентификатор и составляется список причин и следствий.
- Составляется причинно-следственный граф. Составляется от руки или в подходящей программе.
- На основании причинно-следственного графа формируется таблица принятия решений.
- На основании таблицы принятия решений создаются тест-кейсы.
Рассмотрим базовые обозначения, которые используются для построения причинно-следственного графа. В ходе рассмотрения мы будем употреблять следующие понятия:
- Причина (обозначается как «П») выполняется/не выполняется это означает, что данное входное условие должно сработать или не сработать. К примеру, нажатие на кнопку «Сложения» – это причина. Причина – это событие, которое должно произойти в программе или условие, которое должно выполниться в программе, чтобы в программе произошло определённое действие (наступило следствие).
- Следствие (обозначается как «С») выполняется/не выполняется это означает, что в программе должно произойти или не произойти определённое действие, достигнут определённый результат. К примеру, числа сложились, и программа вывела результат сложения – это следствие. Следствия – это то, что получим в программе после срабатывания определённых условий (причин).
Рассмотрим сокращённые записи сказанного, которые мы далее будем использовать:
- П = 1 – причина выполняется. П = 0 – причина не выполняется.
- С = 1 – следствие выполняется, С = 0 – следствие не выполняется.
Чтобы окончательно понять суть рассмотрим сокращённую запись на примере. Есть требование к программе:
- Если нажали на кнопку «Сложить», то программа складывает числа и выводит результат, иначе программа не складывает числа и не выводит результат.
Вот так это будет выглядеть в причинно-следственной формулировке:
- Если причина выполняется (нажали на кнопку «Сложить»), то следствие также выполняется (программа складывает числа и выводит результат), в противном случае следствие не выполняется (программа не складывает числа и не выводит результат).
Так выглядит сокращённая причинно-следственная формулировка:
- Если П = 1, то С = 1, иначе С = 0.
Надеюсь, принцип понятен. Далее будем оперировать сокращёнными записями. Кстати, не привязывайтесь к программе сложения, она была указана для примера и рассказывая далее о причинах и следствиях под ними ничего конкретного не будет подразумеваться. Конкретику будем рассматривать на примерах. Также хочу обратить ваше внимание на то, что причин и следствий может быть множество и в этом случае они будут обозначаться как П1, П2, П3, С1, С2, С3 и т.д. Начинаем описание базовых визуальных обозначений, которые используются для построения графов и которые помогут нам создавать графы.
Функция «тождество» – показывает, что если П1 = 1, то С1 = 1, если П = 0, то С = 0:
Функция «НЕ» — показывает, что если П1 = 1, то С1 = 0, если П = 0, то С = 1:
Функция «ИЛИ» — показывает, что если П1 = 1 или П2 = 1, то С1 = 1, если П1 = 1 и П2 = 1, то С1 = 1, если П1 = 0 и П2 = 0, то С1 = 0:
Функция «И» — показывает, что если П1 = 1 и П2 = 1, то С1 = 1, если П1 = 0 или П2 = 0, то С1 = 0:
Ограничение «исключение» — показывает, что П1 и П2 могут быть оба равны 0 или только один из них, может быть равен 1. Допустимые случаи: П1 = 0 и П2 = 0; П1 = 1 и П2 = 0; П1 = 0 и П2 = 1:
Ограничение «только один» — показывает, что П1 и П2 не могут быть одновременно равны 0 или 1. Один из них обязательно должен быть равен 1, а остальные равны 0. Допустимые случаи: П1 = 1 и П2 = 0; П1 = 0 и П2 = 1:
Ограничение «включение» — показывает, что П1 и П2 не могут быть одновременно равны 0. Минимум один из них обязательно должен быть равен 1. В то же время они могут быть равны все 1 или несколько из них могут быть равны 1, если их больше двух элементов. Допустимые случаи: П1 = 1 и П2 = 0; П1 = 0 и П2 = 1; П1 = 1 и П2 = 1:
Ограничение «требуется» — показывает, что если П1 = 1, то и П2 должно быть равно 1. Нельзя чтобы П1 = 1, а П2 = 0:
Ограничение «маски» (скрытия) для следствий – показывает, что если С1 = 1, то С2 должно быть равно 0:
Обозначения элементов разобрали. Пора приступать к рассмотрению примеров. Данный метод проектирования тестов не прост, поэтому будем рассматривать его на относительно простых примерах. За основу возьмём программу для сложения чисел:
У программы есть спецификация требований. Предположим, что, изучив требования мы логически разбили требования на небольшие блоки, чтобы удобнее было проектировать тесты. Первый блок требований:
Проанализировав требования нам необходимо определить причины и следствия, не забывая их сразу нумеровать. Начнём со следствий, чтобы легче было понять.
Следствия:
- С1. Появление основной формы программы.
- С2. Появление формы, предупреждающей о закрытии.
- С3. Наличие надписи на форме предупреждения «Вы собираетесь выйти…»
- С4. Наличие кнопок на форме предупреждения: «Да», «Нет», «Закрытие формы».
- С5. Отображение кнопки программы на панели задач операционной системы при развёрнутой программе.
- С6. Отображение кнопки программы на панели задач операционной системы при свёрнутой программе.
Причины:
- П1. Запустить программу.
- П2. Выйти из программы через кнопку закрытия программы.
- П3. Свернуть программу.
Для всех следствий мы определили все возможные причины (условия для следствий). Теперь строим причинно-следственный граф. Для начала размещаем все причины и следствия без связей:
В данном случае разместили причины слева, а следствия справа. Далее создаём связи с учётом того какое следствие от каких причин зависит, также требуется учесть все функции и ограничения. Получили следующий граф:
Рассмотрим все связи, которые отображены на причинно-следственном графе. Отталкиваться будем от следствий:
- Проверка появления основной формы программы (С1). Для этого необходимо запустить программу (П1). Других условий нет, поэтому построена единственная связь от П1 до С1.
- Проверка появления формы предупреждающей о закрытии программы (С2). Для этого программа должна быть запущена (П1) и требуется выйти из программы через кнопку закрытия программы (П2), поэтому между связями П1 и П2 идущими к С2 указана функция «И». Также имеется ограничение (Т) указывающее, что для П2 обязательно должна отработать причина П1, т.е. для того, чтобы выйти из программы она должна быть запущена.
- Проверка наличия надписи на форме предупреждения «Вы собираетесь выйти…» (С3). Для этого программа должна быть запущена (П1) и требуется выйти из программы через кнопку закрытия программы (П2), чтобы появилась форма, предупреждающая о закрытии, на которой имеется надпись, поэтому между связями П1 и П2 идущими к С3 указана функция «И». Также имеется ограничение (Т) указывающее, что для П2 обязательно должна отработать причина П1.
- Проверка наличия кнопок на форме предупреждения (С4). Для этого программа должна быть запущена (П1) и требуется выйти из программы через кнопку закрытия программы (П2), чтобы появилась форма, предупреждающая о закрытии, на которой имеются кнопки, поэтому между связями П1 и П2 идущими к С4 указана функция «И». Также имеется ограничение (Т) указывающее, что для П2 обязательно должна отработать причина П1.
- Отображение кнопки программы на панели задач операционной системы при развёрнутой программе (С5). Для этого необходимо запустить программу (П1). Других условий нет, поэтому одна связь от П1 до С5.
- Отображение кнопки программы на панели задач операционной системы при свёрнутой программе (С6). Для этого программа должна быть запущена (П1) и необходимо свернуть программу (П3), поэтому между связями П1 и П3 идущими к С6 указана функция «И». Также имеется ограничение (Т) указывающее, что для П3 обязательно должна отработать причина П1, т.е. для того, чтобы свернуть программу она должна быть запущена.
После составления причинно-следственного графа составляется таблица принятия решений:
Есть небольшая особенность заполнения нумерованных столбцов. Их заполнять удобнее отталкиваясь от следствий. Сейчас рассмотрим с вами заполнение нескольких столбцов.
- Столбец №1. Первое следствие (действие) – это появление основной формы программы (С1). Ставим напротив этого следствия 1, т.е. в данном случае проверять будем, что оно выполняется. Чтобы это следствие выполнилось необходимо, чтобы запустили программу (П1), соответственно, ставим напротив этой причины 1. Остальные данные в данном столбце заполняем нулями, так как другие следствия не проверяем и для следствия С1 не требуется выполнения других причин.
- Столбец №6. В данном случае будет проверяться следствие С6 – отображение кнопки программы на панели задач, когда программа свёрнута. Чтобы это следствие проверить необходимо свернуть программу, а значит напротив причины П3 устанавливаем 1 в этом столбце, а также необходимо обязательное условие, чтобы программа была запущена (вспомните на графе ограничение Т), а это означает, что напротив причины П1 также устанавливаем 1 в этом столбце. Напротив других следствий и причин устанавливаем 0.
По аналогии заполняются данные и в других нумерованных столбцах. По итогу у нас получится 6 нумерованных столбцов. На основании полученной таблицы создаются тест-кейсы. Рассмотрим пример тест-кейса по нумерованному столбцу 6:
Номер тест-кейса: | 86 | |
Название: | Отображение кнопки программы на панели задач операционной системы при свёрнутой программе. | |
Предусловия: | ||
Шаги | Ожидаемый результат | |
1 | Запустить программу сложения чисел с помощью ярлыка располагающегося на рабочем столе компьютера. | Программа запустилась. Отображается основная форма программы. |
2 | Навести курсор компьютерной мыши на кнопку сворачивания окна программы и нажать левую кнопку мыши. | Программа свернулась в панель задач операционной системы. Кнопка программы отображается на панели задач. |
Обратите внимание, что в шаге 1 тест-кейса учтена причина П1 в шаге 2 учтена причина П3, а заголовок учёл следствие С6. Таким образом составляются остальные тест-кейсы, что является последним шагом методики причинно-следственного графа.
Хочу обратить внимание, что рассмотренная таблица принятия решений может быть записана в сокращённом варианте. Однако сокращённый вариант трудно читать, так как в этом случае надо много данных держать в голове или постоянно обращаться к составленному списку причин и следствий и причинно-следственному графу, но вы должны о данном варианте знать:
Мы с вами пошагово рассмотрели метод причинно-следственного графа для проектирования тестов. Обратите внимание, что мы рассмотрели малую часть спецификации требований программы. Для создания тестов на основании всей спецификации требований необходимо всю спецификацию требований разбить на небольшие части и по отдельности на каждую часть создать тест-кейсы через прорисовку графов, так мы упростим процесс создания тестов. Если спецификацию требований не разбивать на мелкие составляющие, то выявить все причины и следствия и попробовать создать один большой граф будет проблематично. Мы получим нечитаемый граф, из которого также проблематично будет составить таблицу принятия решений, а соответственно и тест-кейсы.