Я писал ранее о (анти) шаблонах в зависимостях пакетов . И, конечно, постоянный читатель моего блога знает о Degraph , моем частном проекте по визуализации зависимостей пакетов, который может очень помочь, когда вы попытаетесь идентифицировать и исправить такие антипаттерны.
Но вместо того, чтобы решить проблему, мы все, вероятно, предпочли бы предотвратить проблему в первую очередь. Поэтому в последней версии Degraph появилась новая функция: DSL для тестирования зависимостей.
Вы можете писать тесты либо в Scala, либо в Java, что бы ни подходило для вашего проекта.
Типичный тест, написанный с помощью ScalaTest, выглядит следующим образом:
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 выглядит следующим образом:
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()) );
Вы также можете ограничить зависимость разных срезов друг от друга. Например
… .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
- все другие зависимости между этими пакетами запрещены
- пакеты от и до других пакетов разрешены
Если вы также хотите разрешить зависимости между срезом заказа и отчетным срезом, замените oneOf на anyOf.
Если вы хотите запретить зависимости от отчетов или порядка выполнения, вы можете заменить allow на allowDirect.
См. Официальную документацию для получения более подробной информации, особенно обо всех вариантах, которые предлагает DSL , о необходимом импорте и о том, как настроить Degraph для тестирования.
Я пытаюсь включить Degraph в Maven Central, чтобы упростить использование внутри проектов.
У меня также есть некоторые изменения в тестовом DSL в моем списке дел. И, наконец, я работаю над интерфейсом на основе HTML5. Так что следите за обновлениями.
И как всегда: обратная связь, включая запросы функций и запросы на получение данных, приветствуется.