Архитектурные тесты: NetArchTest, ArchUnitNET

↑ 7.5 Нагрузочное и продвинутое тестирование · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Как автоматически удерживать архитектурные правила в большой команде.

Объяснение

Архитектурные тесты проверяют структуру кода: зависимости между слоями, имена, наследование, доступность.

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).

Практика

  1. Добавьте тест «Domain не зависит от Infrastructure».
  2. Запретите циклические зависимости между модулями.
  3. Реализуйте правило, что публичные типы модуля находятся только в контракте.

Вопросы с ответами

Связанные темы