Есть ли какой-нибудь инструмент покрытия «утверждения» (для 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) и создавать отчет о том, какие поля/переменные/что-то еще не были (прямо и/или косвенно) покрыты утверждением?

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


person Danilo Tommasina    schedule 11.05.2011    source источник
comment
Итак… вы ищете какой-нибудь инструмент для охвата потока информации? Это было бы действительно полезно, хотя я не знаю ни одного случайного. Иметь +1.   -  person Donal Fellows    schedule 11.05.2011
comment
да, так как я ленивый ;) Я бы хотел что-то, что говорит мне, эй, ты забыл проверить значение поля XY в классе YZ.   -  person Danilo Tommasina    schedule 11.05.2011


Ответы (3)


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

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

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

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

person Don Roby    schedule 11.05.2011
comment
Если здесь есть что-то, заслуживающее понижения, я был бы признателен, если бы знал, что это такое. - person Don Roby; 11.05.2011
comment
может быть, у вас здесь есть личные враги? Возразить не нашел, поэтому минус считаю тоже несправедливым. Я исправлю это своим голосом. - person Ingo; 11.05.2011
comment
Проголосовал, спасибо за информацию, это выглядит уже очень интересно и идет в направлении того, что я искал. Большое спасибо. Я по-прежнему не буду отмечать его как ответ, просто чтобы посмотреть, какой ответ все еще будет поступать. - person Danilo Tommasina; 12.05.2011

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

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

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

person Ira Baxter    schedule 11.05.2011
comment
Спасибо за информативный вклад, я думаю, мой вопрос все еще слишком расплывчатый ... Его не следует ограничивать «утверждениями», моя терминология заключалась в том, чтобы сказать, что фактические значения сверяются с ожидаемым значением. Инструмент должен предоставлять полезную информацию о внутренних состояниях/полях/возвращаемых значениях, которые были «использованы» в тесте, но чьи фактические значения не были проверены на соответствие ожидаемому значению. pppf... звучит довольно сложно, надеюсь понятно... - person Danilo Tommasina; 12.05.2011
comment
Если вас интересует только то, какие состояния/поля/значения использовались в тесте, вам нужен охват данных. ... Все инструменты тестового покрытия сложны; вы хотите извлечь информацию о том, что происходит, не нарушая код и не прилагая больших усилий. По сути, вам нужны инструменты для сбора интересующих данных; эта проверка должна иметь умеренную стоимость, чтобы запустить и не нарушить работу программы, и что-то должно интерпретировать результаты. Нет, я не думаю, что вы найдете такой инструмент в готовом виде. Это просто пожелание или принципиальное требование для вашей задачи? - person Ira Baxter; 12.05.2011
comment
Пожелание, идея пришла при написании юнит-теста и проверке его покрытия по количеству выполненных строчек кода. Немного поискав, я не нашел ничего, соответствующего моей идее, и мне просто интересно, сделал ли кто-нибудь уже эту работу ;) Спасибо за отзыв. - person Danilo Tommasina; 13.05.2011

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

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

person John Kane    schedule 11.05.2011