Статьи

Проверьте свои зависимости с Degraph

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

Но вместо того, чтобы решить проблему, мы все, вероятно, предпочли бы предотвратить проблему в первую очередь. Поэтому в последней версии Degraph появилась новая функция: DSL для тестирования зависимостей.
Вы можете писать тесты либо в Scala, либо в Java, что бы ни подходило для вашего проекта.
Типичный тест, написанный с помощью ScalaTest, выглядит следующим образом:

1
2
3
4
5
6
7
classpath // analyze everything found in the current classpath
.including("de.schauderhaft.**") // only the classes that start with "de.schauderhaft."
.withSlicing("module", "de.schauderhaft.(*).**") // use the third part of the package name as the module name, and make sure the modules don't have cycles
.withSlicing("layer",
("persistence","de.schauderhaft.legacy.db.**"), // consider everything in the package de.schauderhaft.legacy.db and subpackages as part of the layer "persistence"
"de.schauderhaft.*.(*).**") // for everything else use the fourth part of the package name as the name of the layer
) should be(violationFree) // check for violations (i.e. dependency circles)

Эквивалентный тестовый код в Java и JUnit выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
assertThat(
classpath() // analyze everything found in the current classpath
.including("de.schauderhaft.**") // only the classes that start with "de.schauderhaft."
.withSlicing("module", "de.schauderhaft.(*).**") // use the third part of the package name as the module name, and make sure the modules don't have cycles
.withSlicing("layer",
new NamedPattern("persistence","de.schauderhaft.legacy.db.**"), // consider everything in the package de.schauderhaft.legacy.db and subpackages as part of the layer "persistence"
"de.schauderhaft.*.(*).**") // for everything else use the fourth part of the package name as the name of the layer
),
is(violationFree())
);

Вы также можете ограничить зависимость разных срезов друг от друга. Например:

1
2
3
.withSlicing("module", "de.schauderhaft.(*).**").allow(oneOf("order", "reporting"), "customer", "core")

Означает:

  • материал в de.schauderhaft.order может зависеть от de.schauderhaft.customer и de.schauderhaft.core
  • то же самое верно для de.schauderhaft.reporting
  • de.schauderhaft.customer может зависеть от de.schauderhaft.core
  • все другие зависимости между этими пакетами запрещены
  • пакеты от и до других пакетов разрешены

Если вы также хотите разрешить зависимости между срезом order и reporting срезом, замените oneOf на anyOf .

Если вы хотите запретить зависимости от reporting или order core вы можете заменить allow на allowDirect .

См. Официальную документацию для получения более подробной информации, особенно обо всех вариантах, которые предлагает DSL , необходимом импорте и о том, как настроить Degraph для тестирования.
Я пытаюсь включить Degraph в Maven Central, чтобы упростить использование внутри проектов.
У меня также есть некоторые изменения в тестовом DSL в моем списке дел. И, наконец, я работаю над интерфейсом на основе HTML5. Так что следите за обновлениями.

Ссылка: Проверьте свои зависимости с Degraph от нашего партнера JCG Йенса Шаудера в блоге Schauderhaft .