Существует ли какой-либо инструмент покрытия ‘assertion’ (для Java)?

#java #code-coverage

#java #покрытие кода

Вопрос:

Прежде чем этот вопрос будет помечен как дублирующий, пожалуйста, прочтите его. 😉 Уже есть несколько вопросов об инструментах покрытия и тому подобном, однако это немного отличается от обычных (я надеюсь).

Согласно википедии, существует несколько разновидностей ‘покрытия’, которые влияют на несколько различных аспектов термина ‘покрытие’.

Вот небольшой пример:

 public class Dummy {
    public int a = 0;
    public int b = 0;
    public int c = 0;

    public void doSomething() {
        a  = 5;

        b  = 5;

        c = b   5;
    }
}

public class DummyTest {

    @Test
    public void testDoSomething() {
        Dummy dummy = new Dummy();

        dummy.doSomething();

        assertEquals( 10, dummy.c );
    }
}
  

Как вы можете видеть, тест будет иметь покрытие в 100% строк, утверждение о значении поля ‘c’ будет охватывать это поле и косвенно также будет охватывать поле ‘b’, однако для поля ‘a’ нет покрытия утверждением.
Это означает, что тест покрывает 100% строк кода и гарантирует, что c содержит ожидаемое значение и, скорее всего, также b содержит правильное, однако a вообще не утверждается и может иметь совершенно неправильное значение.

Итак … теперь вопрос: существует ли инструмент, способный анализировать код (java) и создавать отчет о том, какие поля / переменные / что угодно не были (прямо и / или косвенно) охвачены утверждением?

(хорошо, при использовании getters вместо общедоступных полей вы увидите, что getA () не вызывается, но это не тот ответ, который я хотел бы услышать ;))

Комментарии:

1. Итак… вы ищете какой-нибудь инструмент для покрытия информационного потока? Это действительно было бы полезно, хотя я не знаю ни одного навскидку. Есть 1.

2. да, поскольку я ленивый 😉 Я хотел бы что-нибудь, что говорило бы мне, эй, ты забыл проверить значение поля XY в классе YZ.

Ответ №1:

Как вы можете видеть, тест будет иметь покрытие в 100% строк, утверждение о значении поля ‘c’ будет охватывать это поле и косвенно также будет охватывать поле ‘b’, однако для поля ‘a’ нет покрытия утверждением. Это означает, что тест покрывает 100% строк кода и гарантирует, что c содержит ожидаемое значение и, скорее всего, также b содержит правильное, однако a вообще не утверждается и может иметь совершенно неправильное значение.

Ну, «покрытие», к сожалению, означает разные вещи для разных людей… Этот тест действительно выполняет 100% строк кода, но он не проверяет их все.

То, что вы ищете, хорошо обрабатывается с помощью тестирования мутаций.

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

Комментарии:

1. Если здесь есть что-то, заслуживающее понижения, я был бы признателен за информацию о том, что это такое.

2. возможно, у вас здесь есть какие-нибудь личные враги? Я не нашел ничего, что можно было бы возразить, поэтому я считаю, что понижение также несправедливо. Я исправлю это своим повышением.

3. Проголосовал за, спасибо за информацию, это выглядит уже очень интересно и идет в направлении того, что я искал. Большое спасибо. Я все равно не буду отмечать это как ответ, просто чтобы посмотреть, какие входные данные все равно поступят.

Ответ №2:

Существуют сотни определений «тестового покрытия», из которых инструменты COTS в лучшем случае обрабатывают лишь очень немногие. (Моя компания создает инструменты тестового покрытия, чтобы мы отслеживали подобные вещи). Смотрите эту лекцию о тестовом покрытии для интересного обзора.

Самое близкое определение, которое я слышал, — это определение для покрытия данных; в зависимости от вашего определения:-{ оно сообщает вам, что каждый элемент данных был записан и прочитан во время выполнения. В лекции говорится о проверке того, что каждая запись и каждое чтение выполнялись как особый случай.

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

Комментарии:

1. Спасибо за информативный ввод, я думаю, мой вопрос все еще слишком расплывчатый… Это не должно быть ограничено ‘assertions’, это была моя терминология, чтобы сказать, что фактические значения проверяются на соответствие ожидаемому значению. Инструмент должен предоставлять полезную информацию о внутренних состояниях / полях / возвращаемых значениях, которые были «использованы» в тесте, но фактические значения которых не были проверены на соответствие ожидаемому значению. pppf … звучит довольно сложно, надеюсь, это понятно…

2. Если вас беспокоит только то, какие состояния / поля / значения были «использованы» в тесте, тогда вам нужен охват данными. … Все инструменты покрытия тестов сложны; вы хотите извлечь информацию о том, что происходит, не нарушая код и не затрачивая много усилий. По сути, вам нужны инструменты для сбора интересующих данных; это дополнение должно быть недорогим для запуска и не нарушать функцию программы, и что-то должно интерпретировать результаты. Нет, я не думаю, что вы найдете такой инструмент в готовом виде. Это просто пожелание или фундаментальное требование для вашей задачи?

3. Это желание, идея пришла во время написания модульного теста и проверки его покрытия с точки зрения выполняемых строк кода. После небольшого поиска я не нашел ничего, соответствующего моей идее, и мне просто интересно, выполнил ли кто-нибудь уже эту работу 😉 Спасибо за отзыв.

Ответ №3:

в Java есть утверждения, если это то, что вы ищете.

Чтобы увидеть, какой объем кода был покрыт, существуют инструменты, которые вы можете использовать, вот несколько примеров: cobertura
clover