Подтвердить что ты не робот

Разница между выражением и принятием решения

Утверждение считается, что каждый оператор в коде выполняется хотя бы один раз.
Утверждение/ответвление веток, как говорят, проверяет, что каждая ветвь/выход решений проверена, то есть все утверждения в обеих ветвях false/true будут выполнены.
Но разве это не то же самое? В охвате Statement мне нужно выполнить все заявления, поэтому я предполагаю, что это можно сделать только путем запуска всех возможных способов. Я знаю, что здесь что-то не хватает.

4b9b3361

Ответ 1

Если тесты имеют полное покрытие ветки, то мы можем сказать, что оно также имеет полное покрытие заявления, но не наоборот.

100% покрытие ветки => 100% покрытие заявления

100% покрытие заявления не подразумевает 100% покрытие ветки

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

if(a){
   if(b){
     bool statement1 = true;
   }
}

a = true, b = true обеспечит 100% покрытие выписки, но не покрытие ветки

enter image description here

В покрытии ветки нам нужно покрыть все ребра, которые мы пропустили в покрытии оператора, показанном в виде красных линий на изображении выше.

Ответ 2

Ответ Павла не совсем прав, по крайней мере, я так думаю (согласно определениям ISTQB). Там довольно значительная разница между выражением, решением/ветвью и охватом условий. Я буду использовать образец из другого ответа, но немного изменился, поэтому я могу показать все три примера тестового покрытия. Написанные здесь тесты дают 100% -ное покрытие для каждого типа.

if(a || b)) {
    test1 = true;
}
else {
    if(c) {
      test2 = true
    }
}

Здесь мы имеем два утверждения: если (a || b) и if (c), чтобы полностью объяснить эти различия покрытия:

  • отчет оператора должен проверять каждое утверждение хотя бы один раз, поэтому нам нужно всего два теста:
    • a = true b = false - это дает нам путь, если (a || b) true → test1 = true
    • a = false, b = false и c = true - это дает нам путь: if (a || b) false → else → if (c) → test2 = true.

Таким образом мы выполнили каждое утверждение.

  1. отрасль/решение нуждается в еще одном тесте:

    • a = false, b = false, c = false - это приводит нас к этой секунде, если мы выполняем ложную ветвь из этого оператора, которая не была выполнена в оболочке оператора

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

  2. охват состояния нуждается в другом тесте:

    • a = false, b = true - ведет по тому же пути, что и первый тест, но выполняет другое решение в инструкции OR (a || b), чтобы пройти через него.

Таким образом, мы протестировали все условия, что означает, что мы прошли все пути (ветки) и вызвали его с каждым условием, которое мы могли бы - сначала утверждение "если" было истинным в первом тесте из-за того, что оно было вызвано = true, и в последний тест, потому что b = true вызвал его. Конечно, кто-то может утверждать, что этот случай с a = true и b = true также должен быть проверен, но когда мы проверим, как работает "или", мы можем видеть, что он не нужен, а также переменная c может иметь любое значение как в этих тестах он не оценивается.

По крайней мере, я это интерпретировал. Если кому-то все еще интересно:)

РЕДАКТОР. В большинстве источников, которые я нашел в последнее время, термины покрытия решения/ветки эквивалентны, и термин, который я описывал как покрытие для принятия решений, на самом деле является условием покрытия, следовательно, обновление ответа.

Ответ 3

У вас может быть выражение вроде:

if(a || b || (c && d && !e)) {
    test1 = true;
} else {
    test2 = false;
}

Если в вашем покрытии кода указано, что строки test1 и test2 попадают, тогда у вас есть охват операторов, но для получения полного охвата веток вам нужно будет проверить, когда true, когда a является ложным, но b истинно, когда a и b являются ложными, но c и d являются истинными, а e - ложными и т.д.

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

Ответ 4

Хороший вопрос Объяснение, которое я часто использую, состоит в том, что оператор if без ветки else по-прежнему содержит невидимый "пустой" оператор else:

  • Простое покрытие операторов просто настаивает на том, что все операторы, которые на самом деле существуют, действительно выполняются.

  • Покрытие ветки настаивает на том, что выполняются даже невидимые ветки else.

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

Пример кода:

if (passwordEnteredOK()) {
    enterSystem();
} 
/* Invisible else part 
else {
  // do nothing
}
*/

При покрытии выписки вы просто проверяете, что с правильным паролем вы можете использовать систему. В зоне покрытия ветки вы также проверяете, что с неверным паролем вы не войдете в систему.