ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아키텍처 테스트. ArchUnit
    BackEnd/Tests 2022. 2. 19. 10:32
    반응형

      ArchUnit이란 애플리케이션의 아키텍처를 테스트할 수 있는 오픈 소스 라이브러리입니다. 패키지, 클래스, 레이어, 슬라이스 간의 의존성을 확인할 수 있는 기능을 제공합니다.

     

    Architecture Test Use Cases

    • A 라는 패키지가 B (또는 C, D) 패키지에서만 사용 되고 있는지 확인.
    • *Serivce라는 이름의 클래스들이 *Controller 또는 *Service라는 이름의 클래스에서만 참조하고 있는지 확인.
    • *Service라는 이름의 클래스들이 ..service.. 라는 패키지에 들어있는지 확인.
    • A라는 애노테이션을 선언한 메소드만 특정 패키지 또는 특정 애노테이션을 가진 클래스를 호출하고 있는지 확인.
    • 특정한 스타일의 아키텍처를 따르고 있는지 확인.

     

    ArchUnit Installation

    pom.xml

    <dependency>
        <groupId>com.tngtech.archunit</groupId>
        <artifactId>archunit-junit5</artifactId>
        <version>0.22.0</version>
        <scope>test</scope>
    </dependency>

    build.grade

    dependencies {
        testImplementation 'com.tngtech.archunit:archunit-junit5:0.22.0'
    }

     

    ArchUnit 주요 사용법

    @Test
    public void Services_should_only_be_accessed_by_Controllers() {
        // 특정 패키지에 해당하는 클래스들을 바이트코드를 통해 읽어 들입니다.
        JavaClasses importedClasses = new ClassFileImporter().importPackages("com.mycompany.myapp");
    
        // 규칙을 정의합니다. (service 패키지 안에 있는 클래스들은 오직 controller, service 패키지에서만 참조되어야 합니다.)
        ArchRule myRule = classes()
            .that().resideInAPackage("..service..")
            .should().onlyBeAccessed().byAnyPackage("..controller..", "..service..");
    
        // 읽어 들인 클래스들이 규칙을 따르는지 확인합니다. 
        myRule.check(importedClasses);
    }

     

    JUnit 5 Extensions 

    • @AnalyzeClasses: 클래스를 읽어 들여서 확인할 패키지를 설정합니다.
    • @ArchTest: 확인할 규칙을 정의합니다.
    @AnalyzeClasses(packagesOf = App.class)
    public class ArchClassTests {
    
        @ArchTest
        // Controller는 Service와 Repository에 접근할 수 있다.
        ArchRule controllerClassRule = classes().that().haveSimpleNameEndingWith("Controller")
                .should().accessClassesThat().haveSimpleNameEndingWith("Service")
                .orShould().accessClassesThat().haveSimpleNameEndingWith("Repository");
    
        @ArchTest
        // Repository는 Service에 접근할 수 없다.
        ArchRule repositoryClassRule = noClasses().that().haveSimpleNameEndingWith("Repository")
                .should().accessClassesThat().haveSimpleNameEndingWith("Service");
    
        @ArchTest
        // Study*로 시작하는 클래스는 ..study.. 패키지에 있어야 한다.(단, enum 클래스와 Entity.class는 제외)
        ArchRule studyClassesRule = classes().that().haveSimpleNameStartingWith("Study")
                .and().areNotEnums()
                .and().areNotAnnotatedWith(Entity.class)
                .should().resideInAnyPackage("..study..");
    
    }

     

    [참고정보]

     

    반응형

    'BackEnd > Tests' 카테고리의 다른 글

    기타 테스트. ETC  (0) 2022.02.19
    운영 이슈 테스트. Chaos Monkey  (0) 2022.02.19
    성능 테스트. nGrinder  (0) 2022.02.15
    성능 테스트. JMeter  (0) 2022.02.14

    댓글

Designed by Tistory.