Подтвердить что ты не робот

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

Проблема

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

Требование

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

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

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

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

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

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

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

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



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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

Лучший инструмент, который вы можете найти для своей проблемы, на самом деле не инструмент, а практика. Я настоятельно рекомендую вам прочитать о Test Driven Development (см. книга Лассе Коскела) и Спецификация по примеру (см. Книги Gojko Adzic, они замечательные).

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

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

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

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

Ответ 6

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

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

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

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

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

Интеллектуальный анализ зависимостей

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

Ответ 7

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

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

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

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

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

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

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