Инструмент анализа зависимостей - обновление тестовых случаев регрессии

Проблема

Это довольно распространенная проблема, я бы хотел подумать. Добавление нового кода приводит к регрессу - существующие тестовые примеры устаревают. Зависимости внутри кода означают, что даже если вы знаете, как исправить эту конкретную регрессию, косвенная регрессия может иметь место еще в n местах в обоих направлениях - афферентном и эфферентном.

Требование

У меня есть магазин с SVN, Maven + Nexus, Sonar, Jenkins и JIRA, QC, QTP. В целом, хорошая среда CI.

С каждой новой сборкой у меня будут новые случаи регресса. Я хочу найти зависимости пакетов Java в обоих направлениях и правильно обновить тестовые примеры, чтобы охватить все типы регрессии - прямые и косвенные. Это большая проблема, поскольку мой охват модульными тестами даже не приближается к 50%, а автоматизация интеграционных тестов не успевает за развитием.

Мои параметры

  1. SONAR
  2. Google CodePRo
  3. JArchitect
  4. Jtest (был обсужден с поставщиком Parasoft. У них нет для этого инструмента)
  5. Используйте существующую среду, скажем, с подключаемым модулем Atlassian.
  6. Kalisitck (демонстрационная версия поставщика - хороший инструмент - требует обучения и затрат)
  7. Coverity (например, Kalistick - время обучения и сложная установка. Очень дорогая лицензия.
  8. Любой другой с открытым исходным кодом / платный?

JArchitect, SONAR и CodePro предоставят вам простую матрицу вроде this или this. Что удовлетворяет половину моих требований, сообщая мне, какие классы user и used by затронуты. Я хочу сделать еще один шаг и попросить инструмент сообщить мне, какие соответствующие тестовые примеры затронуты, и нужно ли мне обновить и / или выполнить их, чтобы покрыть риски регресса.

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

Короткий вопрос

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



Я уже читал раздел часто задаваемых вопросов по static-analysis., несколько потоков вроде рекомендаций по инструменту статического анализа для Java?, https://stackoverflow.com/questions/3716203/automatic-code-quality-and-architecture-quality-static-code-analysis и Чем привлекают метрики кода? и многие связанные метрики, но они не отвечают на мой конкретный вопрос.


person Community    schedule 09.11.2012    source источник
comment
Лучше спросить об этом на programmers.stackexchange.com.   -  person Ted Hopp    schedule 09.11.2012
comment
@TedHopp, но это не совсем вопрос программирования. это больше связано с советами экспертов и предложениями по методологии, подходу и опыту. Вы все еще думаете, что это нужно переместить? Пока все связанные вопросы на SO?   -  person Pulak Agrawal    schedule 09.11.2012
comment
Непонятно, идет ли речь о методологиях или инструментах. Если вы хотите узнать об инструментах программирования, то SO - подходящее место. Если речь идет о методологиях разработки, то программисты - лучшее место.   -  person Ted Hopp    schedule 09.11.2012
comment
@TedHopp отредактирован, чтобы сделать его подходящим для SO   -  person Pulak Agrawal    schedule 09.11.2012
comment
Я думаю, что эта статья на SCAM2012 была о решении Google проблемы, которую вы представляете. research.google.com/pubs/pub38275.html Если да, то тот факт, что это исследовательская статья о собственном решении - довольно плохая новость для вас: вы можете не найти готового решения.   -  person Pascal Cuoq    schedule 11.11.2012
comment
@PascalCuoq 1 за это ... довольно проницательные статьи о SCAM2012   -  person Pulak Agrawal    schedule 14.11.2012
comment
Вопрос @PascalCuoq обновлен.   -  person Pulak Agrawal    schedule 14.11.2012
comment
Вы не совсем понимаете, чем хотите заниматься. Я предполагаю, что вы хотите понять, какая часть кода проверяется какими регрессионными тестами, поэтому при внесении изменений в код вы можете определить, какие тесты требуют внимания? ([Паскаль может быть удивлен, что] я еще не читал газету SCAM; только так много часов в день).   -  person Ira Baxter    schedule 03.01.2013
comment
@IraBaxter, твое предположение верное. Я думал, что довольно ясно объяснил   -  person Pulak Agrawal    schedule 03.01.2013


Ответы (7)


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

person wrm    schedule 03.01.2013
comment
Спасибо за идею - сейчас оценим эту комбинацию. Но когда вы говорите если ваши тесты находятся в определенных пакетах ..., вы имеете в виду только модульные тесты? Поскольку я больше смотрю на интеграционные / функциональные тесты - person Pulak Agrawal; 04.01.2013
comment
Я сказал это, потому что вы можете утверждать только зависимости от пакета к пакету, а не от класса к классу (что может потребоваться, если ваши тесты, например, находятся только в одном пакете (что, вероятно, не так)) - person wrm; 04.01.2013
comment
Jdepend - это хорошо, и я даже запустил его из плагина Jenkins, но все же эта интеграция для меня не лучшее решение. Вы внесли свой вклад в мое понимание самой проблемы, даже если я не получил окончательного ответа. Спасибо - person Pulak Agrawal; 09.01.2013

Я сам большой поклонник Sonar, так как он у вас уже запущен и работает в вашей среде CI, это было бы моим предложением. Я не совсем уверен, что матрица цикла зависимостей Sonar еще не делает то, что вы хотите, или, скорее, то, что вы хотите в дополнение к этому.

person Mikkel Løkke    schedule 04.01.2013
comment
спасибо Миккель. Я обновил вопрос, чтобы было понятнее. Эта функция выполняет половину моей работы, сообщая мне зависимости, но не соответствующие тестовые примеры. Хммм ... позволяет нам сказать, что SONAR интегрирован с QC, а затем этот Dependency Cycle Matrix дал мне гиперссылку на соответствующий тестовый пример. - person Pulak Agrawal; 04.01.2013
comment
Вы внесли свой вклад в мое понимание самой проблемы, даже если я не получил окончательного ответа. Спасибо - person Pulak Agrawal; 09.01.2013

Вы можете найти зависимости на уровне класса с помощью Classycle-Dependency Checker. И раздел - Проверка зависимости классов в руководстве может помочь в вашем случае. Однако обычно с помощью инструмента статического анализа мы анализируем либо базу исходного кода (например: Project-> src directory), либо тестовую базу кода (например, Project-> test directory), но не то и другое вместе. Но в вашем случае кажется, что вы тоже хотите выяснить зависимости между исходным и тестовым кодом. Таким образом, выполнение соответствующего инструмента анализа зависимостей путем предоставления входного пути в качестве родительского пути для src и test (например, корневой каталог проекта) может быть тем, что вам нужно (например: использование зависимостей выяснить -> если источник X изменяется, что это изменение влияет на зависимые классы в тестах).

person Bhanuka Withana    schedule 05.01.2013
comment
Вы внесли свой вклад в мое понимание самой проблемы, даже если я не получил окончательного ответа. Спасибо - person Pulak Agrawal; 09.01.2013

Лучший инструмент, который вы можете найти для решения своей проблемы, - это на самом деле не инструмент, а практика. Я настоятельно рекомендую вам прочитать о разработке через тестирование (см. книгу Лассе Коскела) и «Спецификация на примере» (см. Книги Гойко Адзича, они великолепны).

Использование этих практик коренным образом изменит две вещи:

  1. У вас будет тестовое покрытие, близкое к 100%
  2. Тесты станут первоклассными гражданами и станут центральным элементом вашего кода.

Причина, по которой я считаю это актуальным для вашего вопроса, заключается в том, что ваш сценарий намекает на прямо противоположную роль тестов: люди будут вносить изменения в код, а затем подумают: «О, нет ... теперь мне нужно выяснить что я сломал в тех проклятых испытаниях ».

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

person Community    schedule 07.01.2013
comment
Я знаю TDD-XP-agile :) - стратегическое решение и долгосрочную цель CI. То, что я хочу прямо сейчас, - это решение-в-обычном-водопадном-проекте-с-ограниченным-бюджетным-и-медленно-меняющимся-FS-компанией. - person Pulak Agrawal; 07.01.2013
comment
Вы внесли свой вклад в мое понимание самой проблемы, даже если я не получил окончательного ответа. Спасибо - person Pulak Agrawal; 09.01.2013

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

Прежде всего, необходимо рассмотреть в чем проблема с постоянным запуском всех тестов? Вот что CI означает. Если вы не можете запустить все свои модульные тесты за 15 минут и все ваши интеграционные / стресс-тесты за ночь, устраните любую проблему, которая вызывает это, возможно, купив какое-то оборудование.

В противном случае единственное, что может отследить потенциальную регрессию теста, - это анализ покрытия (например, http://www.eclemma.org/ < / а>). Учитывая даже базовый объектно-ориентированный дизайн, не говоря уже о внедрении зависимостей, статических пакетах или зависимостях классов, они в лучшем случае бессмысленны и, вероятно, активно вводят в заблуждение с точки зрения того, какие изменения могут привести к сбою тестов. И это игнорирует случай, когда проблема в том, что A должен звонить B, а не в этом случае. Однако перекрестные ссылки на измененные файлы с вызываемыми файлами, и если нет пересечения, возможно, не повторять тест, возможно, безопасно - оставшиеся сбои будут такими как некоторый код, добавляющий обработчик событий там, где его раньше не было.

Я не думаю, что для этого есть бесплатный инструмент, но он должен быть скриптовым из Jenkins / Emma / Git. Или воспользуйтесь одним из интегрированных решений, например Kalistick. Но я бы скептически относился к тому, что это могло бы эффективно превзойти человеческое суждение, основанное на общении с командой разработчиков относительно того, что они пытаются делать.

Кстати, простой инструмент, который действительно нужен миру Java, но не существует, это расширение для junit, которое запускает набор тестов в порядке зависимости и останавливается при первой ошибке. . Это немного поможет разработчику сосредоточиться на наиболее вероятном источнике регрессии.

person soru    schedule 04.01.2013
comment
По поводу вашего последнего абзаца. Он существует. Он называется TestNG и является заменой junit вместо расширения. Подробнее см. this. Он не останавливается, но пропускает зависимые тесты, если предыдущий тест терпит неудачу. - person Hilikus; 04.01.2013
comment
Я имел в виду совсем не это - вы должны указать «зависимость» на тестовом уровне как аннотацию. Это просто окольный способ написания набора тестов. Я говорил о том, что проанализировало стиль кода jdepend и пришло к выводу, что CurrencyValueTest должен запускаться перед DerivativeTest. - person soru; 04.01.2013
comment
@soru хороший способ задать вопрос; ваше понимание правильное. Но это основано на предположении, что мои тесты (модульные и интеграционные) полностью написаны И автоматизированы с помощью Selenium / QTP и т.д., что неверно в моем случае. Это означает, что мой магазин еще не является чистым CI, по крайней мере, не тестовой частью. Я обновил вопрос, чтобы отразить это сейчас. Спасибо - person Pulak Agrawal; 07.01.2013
comment
Учитывая ручное тестирование, я не думаю, что проблема может быть решена с помощью инструмента, потому что инструмент не знает, что находится в ручных тестах. - person soru; 07.01.2013
comment
На самом деле это может быть, как я уже упоминал, Kalistick и Coverity. - person Pulak Agrawal; 08.01.2013
comment
А, я вижу, они работают, принимая покрытие кода ручного теста по мере его выполнения. Это делает отслеживание зависимостей избыточным - либо код был вызван во время теста, либо нет. - person soru; 08.01.2013
comment
Вы внесли свой вклад в мое понимание самой проблемы, даже если я не получил окончательного ответа. Спасибо - person Pulak Agrawal; 09.01.2013

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

Большинство инструментов тестового покрытия создают явный набор местоположений, в которых выполняется текущий тест; вот в чем суть «охвата». Если вы организуете запуск теста для выполнения по одному модульному тесту за раз, а затем сделаете снимок данных о покрытии, то вы будете знать для каждого теста, какой код он охватывает.

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

Есть несколько практических проблем с выполнением этой работы.

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

Существуют инструменты тестового покрытия, которые записывают данные покрытия в легко фиксируемой форме и могут выполнять вычисления. Определить изменения кода сложнее; вы можете использовать diff, но перемещенный код несколько запутает проблему. Вы можете найти инструменты сравнения, которые сравнивают структуры кода, которые идентифицируют такие шаги, чтобы вы могли получить более точные ответы.

Если у вас есть срезы исходного кода, вы можете вычислить, насколько проверенный вывод (обратный срез) зависит на входе; Очевидно, что весь код в этом фрагменте влияет на тест. Плохая новость в том, что такие слайсеры достать непросто.

person Community    schedule 09.01.2013
comment
спасибо .. вы хорошо сформулировали теоретическое решение, поэтому я награждаю вас наградой. Хотя это, конечно, не прямой ответ для меня, поэтому не принимаю как единое целое. Все присутствующие внесли свой вклад в мое понимание самой проблемы, даже если у меня нет окончательного ответа. Спасибо всем - person Pulak Agrawal; 09.01.2013

Некоторые инструменты, которые могут помочь. Обратите внимание, что не все они интегрируются с CI.

iPlasma - отличный инструмент.

CodePro - это подключаемый модуль Eclipse, который помогает в обнаружении кода и проблемы проектирования (например, дублированный код, классы, нарушающие инкапсуляцию, или методы, помещенные в неправильный класс). (Теперь приобретено Google)

Relief - это инструмент, визуализирующий следующие параметры проектов Java: размер пакета, то есть количество классов и интерфейсов в нем. содержит тип визуализируемого элемента (пакеты и классы представлены в виде блоков, интерфейсы, а поля типов - в виде сфер). насколько тяжелый используется предмет (представлен как сила тяжести, то есть расстояние до центра); количество зависимостей (представлено как глубина).

Stan4j - это коммерческий инструмент, который стоит пару сотен долларов. Он нацелен только на проекты Java, очень близок к (или немного лучше отчетов, чем? Не уверен) Sonar. Имеет хорошую интеграцию с Eclipse.

Анализ зависимостей Intellij

Насколько я понял из вашей проблемы, вам необходимо отслеживать две объектно-ориентированные метрики - Эфферентная связь (Ca) и Эфферентная связь (Ce) . Благодаря этому вы можете сузить круг до требуемых пакетов. Вы можете изучить возможность написания плагина eclipse, который при каждой сборке может выделять необходимые классы на основе показателей Ca, Ce.

person Community    schedule 07.01.2013
comment
Вы внесли свой вклад в мое понимание самой проблемы, даже если я не получил окончательного ответа. Спасибо - person Pulak Agrawal; 09.01.2013