Базовое или сложное покрытие условий

Я пытаюсь разобраться в различиях между этими двумя критериями покрытия и не могу понять, как они различаются. Я думаю, что я не понимаю точно, что такое покрытие решения. В моем учебнике по тестированию программного обеспечения говорится, что покрытие сложных решений может быть дорогостоящим (2n комбинации для n основных условий).

Я бы подумал, что основные условия покрытия будет дороже.

Рассматривать a && b && c && d && e, Насколько я понимаю, в базовом покрытии условий каждая из этих атомарных переменных должна иметь значения ИСТИНА и ЛОЖЬ в тестовом примере, чтобы тестовый случай имел адекватность базового условия - это 32 различных тестовых случая.

Так в чем же состоит фактическая разница и что называется "базовым условием". В приведенном выше примере a основное условие?

Благодарю.

2 ответа

Решение

Что касается терминологии, у меня нет под рукой ни одного источника, в котором бы использовались точные термины "покрытие базовых условий" и "покрытие нескольких условий". В "Тестировании объектно-ориентированных систем" Биндера говорится "покрытие условий" и "покрытие нескольких условий". В "Тестировании программного обеспечения" Everett & McLeod говорится "простое покрытие условий" и "комплексное покрытие условий". Но я уверен, что первый термин в каждом случае - это ваше "покрытие базовых условий", а второй - ваше "покрытие сложных условий". Я буду использовать эти термины ниже.

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

if a && b && c
  # do stuff
else
  # do other stuff
end

есть сложное состояние, a && b && cс тремя основными условиями, a, b а также c, Для полного охвата базовых условий требуется только два контрольных примера: один, где все базовые условия выполняются, а другой - все ложные. Неважно, что базовые условия являются частью сложного состояния.

Обратите внимание, что базовое условие покрытия не является покрытием филиала. Если сложные условия были a && b && !cэти два тестовых примера, приведенные выше, все же обеспечат покрытие базового условия, но не обеспечат покрытие филиала.

Менее агрессивно оптимизированный набор тестовых случаев для охвата базовых условий будет иметь один тестовый случай, в котором все три базовых условия являются ложными, и три тестовых случая с разными базовыми условиями, истинными в каждом. Это все равно будет только четыре из восьми возможных комбинаций основных условий в сложном состоянии. Неудобное чувство, что мы игнорируем остальные четыре, объясняет наличие сложных условий. Это требует проверки для каждой возможной комбинации основных условий в сложном состоянии. В приведенном выше примере вам потребуется восемь тестов, по одному для каждой возможной комбинации возможных значений a, b а также c, чтобы получить полное покрытие условий.

Во-первых, разница между решением и условием.

Условие - это логическое выражение atomar, которое нельзя разбить на более простое логическое выражение. Например: a (если a является логическим)

Решение - это соединение Условий с нулевым или большим количеством булевых операторов. Решение без оператора также является условием. Например: (a or b) and c но также a and b или просто a,

Давайте возьмем простой пример

if(decision)  {
  //branch 1
} else {
  //branch 2
}

Вам нужно два теста, чтобы охватить обе ветви. Это решение о покрытии или филиале. Если решение является условием (т.е. просто a), это также называется базовым условием покрытия, которое представляет собой покрытие двух ветвей одного условия.

decision может быть разбит на условия.

Возьмем для примера

decision = (a or b) and c

Охват решения будет достигнут с

  • а, б, с = 0
  • а, б, в = 1

Но перестановка всех комбинаций его логических подвыражений - это полное покрытие условий или покрытие нескольких условий), которое является составной частью базового покрытия условий:

| a | b | c |
| 0 | 0 | 1 |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 0 | 1 | 0 |
| 1 | 0 | 1 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
| 1 | 1 | 0 |

Это было бы довольно много тестов, но некоторые из них являются избыточными, поскольку некоторые условия покрываются другими. Это отражено в Модифицированном покрытии условий / решений (MC/DC), которое является комбинацией покрытия условий и покрытия функций.

Для MC / DC требуется, чтобы каждое условие влияло на результат независимо. В приведенном выше тесте (все 0 или 1), мы игнорируем тот факт, что значение c не имеет значения, если a и b равны 0, или что значение b не имеет значения, если a и c равны 1.

Поэтому вам следует сесть, использовать свой мозг и подумать, для каких комбинаций общий результат R равен 1 или 0.

  | a | b | c | a or b | c | R |  eq
1 | 0 | 0 | 0 |    0   | 0 | 0 |  A
2 | 0 | 0 | 1 |    0   | 1 | 0 |  B
3 | 0 | 1 | 0 |    1   | 0 | 0 |  A
4 | 0 | 1 | 1 |    1   | 1 | 1 |  C
5 | 1 | 0 | 0 |    1   | 0 | 0 |  A
6 | 1 | 0 | 1 |    1   | 1 | 1 |  D
7 | 1 | 1 | 0 |    1   | 0 | 0 |  A
8 | 1 | 1 | 1 |    1   | 1 | 1 |  D

В последнем столбце показан класс эквивалентности:

  • A: c = 0, результат равен 0, ни a, ни b не влияют
  • B: a,b = 0, результат 0, c не имеет влияния
  • C: b,c = 1, результат 1, a не влияет
  • D: a,c = 1, результат 1, b не влияет

Для B и C совершенно очевидно, что выбрать, но не для A и D. Для каждого вы должны проверить, что произойдет, если я заменю операторы, т. Е. Или -> и, и -> или, как это повлияет результат (под) решения. Если на результат повлияет, у вас есть кандидат - если нет, то нет.

  • A: (0 и / или 0) и / или 0 -> не имеет значения
  • A: (0 и 1) против (0 или 1) -> имеет значение! -> Кандидат
  • A: (1 и 0) против (1 или 0) -> имеет значение! -> Кандидат
  • A: (1 и / или 1) -> не имеет значения
  • D: (1 и 0) против (1 или 0) -> имеет значение -> Кандидат
  • D: (1 и 1) -> не имеет значения

Таким образом, вы получите окончательный набор тестов, как указано выше:

  • a = 0, b = 1, c = 0 -> ложная ветвь (A) ИЛИ a = 1, b = 0, c = 0
  • a = 0, b = 0, c = 1 -> ложная ветвь (B)
  • a = 0, b = 1, c = 1 -> истинная ветвь (C)
  • a = 1, b = 0, c = 1 -> истинная ветвь (D)

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

Что касается терминологии, я не мог найти термин "комплексное покрытие принятия решений". На мой взгляд, "составное решение" будет соединением условий, другими словами: соединением условий.

Другие вопросы по тегам