JaCoCo указывает на пропущенную ветвь в совпадениях/находках RegEx, состоящих из двух частей, которые, как доказано, покJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 JaCoCo указывает на пропущенную ветвь в совпадениях/находках RegEx, состоящих из двух частей, которые, как доказано, пок

Сообщение Anonymous »

У меня есть следующий метод проверки электронной почты, который проверяет адрес электронной почты на основе двух условий: (1) основной формат должен быть действительным, (2) UUID не может появляться где-либо в строке. Имеется 2 регулярных выражения, и общее состояние их добавления в список ошибок следующее:

Код: Выделить всё

if (!matcher.matches() || uuidMatcher.find())
.

Код: Выделить всё

public void validate(String email, String emailName, List errorMessages) {
if (!StringUtils.isBlank(email)) {
// 1. Main Email Format
String regex = "^[A-Za-z0-9._+-]+@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*\\.[A-Za-z]{2,}$";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(email);

// 2. UUID cannot appear anywhere
String uuidRegex = "\\w{8}-\\w{4}-\\w{4}-\\w{4}-\\w{12}";
Pattern uuidPattern = Pattern.compile(uuidRegex);
Matcher uuidMatcher = uuidPattern.matcher(email);

// This is for testing/debugging only: Print each scenario
if (matcher.matches() && uuidMatcher.find())
System.out.println("Satisfied (1): matcher.matches & uuidMatcher.find");
else if (!matcher.matches() && uuidMatcher.find())
System.out.println("Satisfied (2): !matcher.matches & uuidMatcher.find");
else if (matcher.matches() && !uuidMatcher.find())
System.out.println("Satisfied (3): matcher.matches & !uuidMatcher.find");
else
System.out.println("Satisfied (4): !matcher.matches & !uuidMatcher.find");

// Add to errorMessage depending on: !matcher.matches() || uuidMatcher.find()
if (!matcher.matches() || uuidMatcher.find()) {
errorMessages.add(emailName + " is invalid");
}
}
}
Следующие 3 метода тестирования охватывают все эти сценарии. Метод проверки №1 предназначен для всех действительных, №2 — для всех недействительных, а №3 проверяет обязательный метод вверху (о котором нам пока не стоит беспокоиться).

Код: Выделить всё

@Test
public void testValidateEmailTrue() throws Exception {
List emails = new ArrayList();
emails.add("123@test.com");
emails.add("test@test.com");
emails.add("test@123.com");
emails.add("test.bob@test.co.in");
emails.add("test1@test.me.org");
emails.add("test_bob@test.com");
emails.add("test-bob@test.com");
emails.add("test-bob@abc.def.ghi.com");
emails.add("test+bob@abc.def.ghi.com");
emails.add("abcd1234-abcd-abcd-abcd-abcd1234567@test.com");

for (String email : emails)mail {
service.validate(email, "email", errorMessages);
}

assertTrue(errorMessages.isEmpty());
}

@Test
public void testValidateEmailFalse() throws Exception {
List emails = new ArrayList();
emails.add("@test.com");
emails.add("test&test.com");
emails.add("test#@test.me.org");
emails.add("test@abc..com");
emails.add("test%bob@abc.def.ghi.com");
emails.add("abcd1234-abcd-abcd-abcd-abcd12345678@test.com");
emails.add("%abcd1234-abcd-abcd-abcd-abcd12345678@test.com");
emails.add("abcd1234-abcd-abcd-abcd-abcd123456789@test.com");

for (String email : emails) {
service.validate(email, "email", errorMessages);
}

assertFalse(errorMessages.isEmpty());
}

@Test
public void testValidateEmailNullOrEmpty() throws Exception {
service.validate(null, "email", errorMessages);
service.validate("", "email", errorMessages);
assertTrue(errorMessages.isEmpty());
}
Когда я выполняю все методы тестирования, я вижу, что каждый 1 из 4 сценариев охватывается между jUnit #1 и #2. Всего имеется 18 выходных данных метода тестирования №1/№2: 10 из №1 (все они охватывают сценарий 3), а затем 8 из №2 (они охватывают сценарии 4, 1 и 2):

Код: Выделить всё

Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (3): matcher.matches & !uuidMatcher.find
Satisfied (4): !matcher.matches & !uuidMatcher.find
Satisfied (4): !matcher.matches & !uuidMatcher.find
Satisfied (4): !matcher.matches & !uuidMatcher.find
Satisfied (4): !matcher.matches & !uuidMatcher.find
Satisfied (4): !matcher.matches & !uuidMatcher.find
Satisfied (1): matcher.matches & uuidMatcher.find
Satisfied (2): !matcher.matches & uuidMatcher.find
Satisfied (1): matcher.matches & uuidMatcher.find
Но что бы я ни делал, JaCoCo сообщает мне в итоговом отчете, что сценарий (3) — это пропущенная ветвь:
Изображение

Если у меня есть просто метод тестирования № 1 и закомментируйте № 2, тогда он показывает Сценарий (3) охвачен, но все остальные — нет (наоборот):
Только с методом тестирования №1 (№2 удален):
Изображение
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»