-
아키텍처 테스트. ArchUnitBackEnd/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.."); }
[참고정보]
- https://blogs.oracle.com/javamagazine/unit-test-your-architecture-with-archunit
- https://www.archunit.org/userguide/html/000_Index.html
- Moduliths
반응형'BackEnd > Tests' 카테고리의 다른 글
기타 테스트. ETC (0) 2022.02.19 운영 이슈 테스트. Chaos Monkey (0) 2022.02.19 성능 테스트. nGrinder (0) 2022.02.15 성능 테스트. JMeter (0) 2022.02.14