2016-04-12 3 views
1

Давайте рассмотрим мы имеем следующий метод:цикломатическая сложность и основа путь

public void testIt(boolean a, boolean b){ 
    if (a && b){ 
    ... 
    } 
    if (a){ 
    .... 
    } 
} 

цикломатические сложность этого метода = 3. Таким образом, в соответствии с базовым тестированием пути, мы должны иметь 3 теста, чтобы достичь утверждения и принятия решения. Тем не менее, я вижу, что я могу использовать только два теста (true, true) и (false, false) для достижения утверждения и принятия решения. Где моя ошибка?

+0

Фактически, если первое условие не содержит оператор возврата, Cyclomatic complex равен 1; (правда правда). Второе условие «If-Else»? Если это так, Cyclomatic сложность 2; (true, true), (true, false) ... –

+0

@Old Fox Второе условие - нет, если другое. В коде нет, если еще. –

+0

Моя ошибка ... Я снова прочитал ваш вопрос и поставил ответ ... Вы задали хороший вопрос ... –

ответ

1

ответ от @OldFox правильно, только некоторые дополнения:

Где моя ошибка?

CC является верхней границей для покрытия ветви, но нижняя граница для покрытия путей (не то же самое, как и охват линия/заявление, см. Ниже) Поэтому вам нужно до 3 тестов для покрытия всех ветвей/условий и не менее 3 тестов для покрытия всех дорожек.

Вот график вашей функции:

CFG

CC = 6 - 5 + 1 * 2 = согласно definition

Чтобы охватить все отрасли, нужно до 3 (true, true), (false, *)

Чтобы охватить все пути, вам нужно как минимум 3 теста, есть 3 возможных значения ependent paths in graph, поэтому вам нужно всего 3 теста, чтобы охватить все пути.

Возможно, возникла некоторая путаница в отношении количества различных входов, которое равно 4, но не все пути, образованные этими входами, независимы, два из них (когда a ложно) на самом деле одинаковы, поэтому есть только 3 независимые пути

заключение, 3 тестовых примера необходимы и достаточны для обеспечения как ветви, так и путей для вашей функции.

Теперь о покрытии строки/оператора: вам нужно выполнить каждую строку, по крайней мере, одну, для этого вам потребуется только один тест (true, true), но явно этого недостаточно для других типов покрытия.

+0

Для покрытия всех ветвей мне нужны 3 или 2 теста? –

+0

@ JimJim2000 3 теста –

5

Да, вы правы. Сложность цикломатическая является 3 и случаи вы должны проверять, являются:

  1. а является ложным, б - мы не заботимся (я объясню позже ...) -> ничего не произошло

  2. а является правда, б ложно -> только второе условие было выполнено

  3. а и Ь истинны -> как первое и второе условия были выполнены

Если смотреть только Чет в аргументах первый вариант, который я упомянул, имеет 2 разных входа (b true/false), однако в обоих случаях то же самое должно произойти, поэтому я предлагаю вам проверить его только один раз или использовать эквивалент C# test case attribute

+0

Я не понимаю логики. Вы говорите о трех вариантах - или ничего, или обоих, или только о вторых условиях. Однако почему тогда нет варианта, где только первое условие? –

+0

@ JimJim2000 На основе кода, который вы опубликовали, вариант, в котором выполняется только первое условие, не существует. –

+0

Нет, логики нет. Предположим, что код того же метода 'if (a) {...}, если (b) {...}'. CC = 3. Количество тестов? –

Смежные вопросы