У меня есть метод проверки пароля:
/**
* Checks if the given password is valid.
*
* @param password The password to validate.
* @return {@code true} if the password is valid, {@code false} otherwise.
*/
public static boolean validatePassword(String password) {
int len = password.length();
if (len < 8 || len > 20)
return false;
boolean hasLetters = false;
boolean hasDigits = false;
for (int i=0; i<len; i++) {
if (!Character.isLetterOrDigit(password.charAt(i)))
return false;
hasDigits = hasDigits || Character.isDigit(password.charAt(i));
hasLetters = hasLetters || Character.isLetter(password.charAt(i));
}
return hasDigits && hasLetters;
}
Сосредоточимся на цикломатическом числе сложности: в чем его значение?
Metrics 1.3.6 говорит, что это 7, но я не могу найти семь независимых путей: я нашел только 5! И Википедия не сильно помогла, как я могу использовать эту формулу π - s + 2
?
У меня есть 2 if
, 1 for
и 3 точки выхода, но я застрял: нужно ли мне считать точку входа? Следует ли мне дважды считать первый if
, поскольку он имеет два условия?
РЕДАКТИРОВАТЬ:
Хорошо, теперь я узнал, что Цикломатический номер равен 7. Это означает, что существует 7 независимых путей, и поэтому я смогу найти 7 различных тестовых примеров, если бы я хотел покрыть 100% кода, я прав?
Что ж, я все еще не могу найти последнюю! Я нашел вот такие:
- Действителен: asdf1234
- Слишком коротко: asdf123
- Слишком долго: asdfsgihzasweruihioruldhgobaihgfuiosbhrbgtadfhsdrhuorhguozr
- Недействительный символ: asdf * 123
- Все цифры: 12345678
- Без цифр: asdfghjk
- wtf ???
||
и&&
у вас есть 7 операторов ветвления - person Claudiu   schedule 13.03.2013for
завершается. Один путь входит в цикл, другой - нет. У вас никогда не бывает случая, чтобы циклfor
не выполнялся в вашем коде, потому что вы проверяетеlen < 8
в начале своей функции, но простой автоматический анализ кода не отразит это. - person Claudiu   schedule 13.03.2013for
должны считаться дважды, гдеif
и все остальное считается только один раз? Даже операторif
имеет два пути, но увеличивает ccn только на единицу, и поэтому должен делать иfor
. : | - person kelo   schedule 13.03.2013!isLetterOrDigit
истинно, то мы знаем, что либоisDigit
, либоisLetter
будет истинным. - person matts   schedule 13.03.2013for
не считается дважды. У вас есть шестьif
операторов и одинloop
. - person Claudiu   schedule 13.03.2013