Определение того, какие тесты охватывают строку кода - PullRequest
7 голосов
/ 07 июля 2010

Есть ли способ определить набор модульных тестов, которые потенциально могут выполнить данную строку кода?Другими словами, можете ли вы автоматически определить не только , покрыта ли данная строка, но и фактический набор тестов, которые ее покрывают?

Рассмотрим большую кодовую базу, скажем, с единицей 50Ктесты.Очевидно, что их запуск может занять ДЛИННОЕ время - часы, если не дни.Работая в такой кодовой базе, вы хотели бы иметь возможность выполнить некоторые подмножества всех модульных тестов, включая только те, которые покрывают строку (или строки), к которой вы только что прикоснулись.Конечно, вы могли бы найти некоторые вручную и запустить их, но я ищу способ сделать это быстрее и более всесторонне.

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

Итак:

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

  2. Есть ли уже инструмент, который может это сделать?Или это обычное дело с именем, с которым я не сталкивался?Будем признательны за указатели на инструменты в мире Java или на общие исследования по этому вопросу.

Ответы [ 4 ]

2 голосов
/ 21 мая 2012

JetBrains dotCover также теперь имеет эту функцию для кода .NET.Доступ к нему можно получить из меню dotCover с параметром «Показать тесты покрытия» или нажатием Ctrl + Alt + K.

2 голосов
/ 07 июля 2010

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

1 голос
/ 07 июля 2010

Следующая презентация обсуждает, как вычислить программный фрагмент, выполненный модульным тестом. Он отвечает на вопрос: «Можете ли вы определить тестовое покрытие без выполнения программы?» и в основном делает набросок идеи, которую вы описали ... с дополнительным трудом для его реализации.

Вы могли бы заметить, что вычисление фрагмента программы не является вычислительно дешевой задачей. Я предполагаю, что вычисление среза (символьное вычисление) обычно медленнее, чем выполнение модульного теста, поэтому я не уверен, что вы сэкономите время, занимаясь этим. И срез является консервативным приближением затронутой части программы, поэтому ответ, который вы получите, будет включать части программы, которые фактически не выполняются.

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

Моя компания создает семейство инструментов тестирования покрытия . Наш следующий выпуск этих инструментов будет иметь возможность инкрементного регрессионного тестирования.

0 голосов
/ 03 ноября 2015

Это функция, предоставляемая инструментом JMockit Coverage (для Java), хотя она показывает тесты, которые сделал , покрывающие заданную строку производственного кода в последнем запуске, а не тесты, которые потенциально могутвыполнить заданную строку кода ".

Как правило, однако, у вас будет сборка проекта Jenkins (или что-то еще), где выполняются все тесты и генерируется отчет о покрытии HTML.Тогда нужно просто изучить отчет, чтобы увидеть, какие тесты в настоящее время охватывают заданную строку кода.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...