Мне интересно, не устарели ли измерения покрытия условного кода текущими инструментами для Java после появления Java 8? С Java 8 - х Optional
и Stream
часто мы можем избежать кода ветвь / петлю, что делает его легко получить очень высокое условное покрытие без проверки всех возможных путей выполнения. Давайте сравним старый код Java с кодом Java 8:
До Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
В вышеуказанном методе есть 3 возможных пути выполнения. Чтобы получить 100% условного покрытия, нам нужно создать 3 модульных теста.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
В этом случае ветви скрыты, и нам нужно только 1 тест, чтобы получить 100% охват, и не имеет значения, в каком случае мы будем тестировать. Хотя есть все те же 3 логические ветви, которые должны быть рассмотрены, я считаю. Я думаю, что это делает статистику условного покрытия совершенно ненадежной в наши дни.
Имеет ли смысл измерять условное покрытие для кода Java 8? Существуют ли какие-либо другие инструменты, обнаруживающие проверенный код?
getName
? Похоже, что если user
null, он должен вернуть «unknown». Если user
не ноль и user.getName()
нуль, он должен вернуть «неизвестно». Если user
не ноль и user.getName()
не нуль, он должен вернуть это. Таким образом, вы бы протестировали эти три случая, потому что это контракт getName
. Вы, кажется, делаете это задом наперед. Вы не хотите видеть ветки и писать тесты в соответствии с ними, вы хотите писать свои тесты в соответствии с вашим контрактом и гарантировать, что контракт выполнен. Это когда у вас есть хорошее освещение.