Архитектурные тесты: NetArchTest, ArchUnitNET
↑ 7.5 Нагрузочное и продвинутое тестирование · ← Предыдущая · → Следующая
Зачем это на собесе
Как автоматически удерживать архитектурные правила в большой команде.
Объяснение
Архитектурные тесты проверяют структуру кода: зависимости между слоями, имена, наследование, доступность.
public class ArchitectureTests
{
private static readonly Assembly Domain = typeof(Order).Assembly;
private static readonly Assembly Infrastructure = typeof(AppDbContext).Assembly;
[Fact]
public void Domain_should_not_depend_on_infrastructure()
{
var result = Types.InAssembly(Domain).ShouldNot().HaveDependencyOn("Orders.Infrastructure").GetResult();
Assert.True(result.IsSuccessful, string.Join(", ", result.FailingTypeNames ?? []));
}
[Fact]
public void Handlers_should_be_sealed_and_named_Handler()
{
var result = Types.InAssembly(typeof(Program).Assembly).That().ImplementInterface(typeof(IRequestHandler<,>))
.Should().BeSealed().And().HaveNameEndingWith("Handler").GetResult();
Assert.True(result.IsSuccessful);
}
}Что типично проверять:
- Направление зависимостей (Clean Architecture: Domain не зависит ни от чего).
- Отсутствие циклических зависимостей между модулями монолита.
- Контроллеры не обращаются к репозиториям напрямую.
- Соглашения именования и модификаторы (
internalпо умолчанию). - Запрет использования устаревших API.
Библиотеки: NetArchTest.Rules, ArchUnitNET; в модульных монолитах — проверка границ модулей.
Нюансы и подводные камни
- Слишком детальные правила замедляют команду и вызывают «обход» правил.
- Тесты дополняют, но не заменяют ревью.
- Анализаторы Roslyn (
Microsoft.CodeAnalysis) проверяют правила на этапе компиляции. - Правила должны быть согласованы командой и задокументированы (ADR).
Практика
- Добавьте тест «Domain не зависит от Infrastructure».
- Запретите циклические зависимости между модулями.
- Реализуйте правило, что публичные типы модуля находятся только в контракте.
Вопросы с ответами
Зачем архитектурные тесты?
Автоматически предотвращают нарушение договорённостей о структуре кода, которые иначе размываются со временем.
Чем архитектурные тесты отличаются от анализаторов?
Тесты запускаются в CI и проверяют скомпилированные сборки; анализаторы работают в компиляторе и IDE.