본문 바로가기

Test14

외부 API를 사용하는 테스트 코드 개발을 하다 보면 외부 서버의 API를 이용하는 경우가 매우 많다. 혹은 외부 라이브러리를 테스트해야 하는 일도 생긴다. 현재 나는 회원 인증을 위한 코드를 작성하는데, 해당 테스트 코드를 어떻게 작성해야 하는지 고민 중이다. 첫 번째 고민은 다음과 같다. 테스트 코드를 실행함에 있어 실제 외부 API 호출을 진행할 수 없다. 비용적인 문제와 테스트 코드의 검증 시간적인 문제가 발생한다. private val vonageClient: VonageClient fun verify(verifyRequest: VerifyReq): VonageVerifyResult { runCatching { vonageClient.verifyClient.verify(createVerifyRequest(verifyRequest).. 2023. 7. 19.
IntelliJ Test 목록 전체 테스트 진행 시 IDE 내부에서 어떤 테스트가 성공했는지 다음과 같은 화면을 원할 때가 있다. 이를 위해선 다음과 같은 설정이 필요하다. Ctrl + Alt + S를 통해 설정창을 열어준다. Build 시 Gradle이 아닌 IntelliJ IDEA로 변경해 주면 원하는 테스트 목록이 출력될 것이다. 또한 테스트 속도도 더 빠르기 때문에 이를 추천한다. 2023. 7. 4.
테스트 범위와 종류 기능 테스트 기능 테스트는 사용자 입장에서 시스템이 제공하는 기능이 올바르게 동작하는지 확인한다. 이는 QA들이 하는 테스트와 동일한 것으로 보인다. 이 테스트의 전제조건은 매우 크다. 그림 기준으로 나열하자면 1. 정상적으로 동작하는 프런트엔드 코드가 필요하다. 2. 인프라가 정상적으로 구동된 상태여야 한다. 3. 데이터베이스도 연동되어야 한다. 4. 실제 클라이언트 환경도 필요하다. 5. 실제 클라이언트와 벡엔드 코드가 합쳐져 빌드되어서 웹 애플리케이션 서버를 구동시켜야 한다. 이렇게 기능 테스트는 사용자의 환경부터 시작해서 데이터베이스나 외부 서비스를 이용한다면 해당 외부 API 서버까지 모든 구성 요소를 하나로 엮어서 진행한다. 이는 끝에서 끝까지 올바른지 검사하기 때문에 End to end라고도.. 2022. 12. 15.
테스트 가능한 설계 최근 데이터베이스 설계부터 애플리케이션 아키텍처, 도메인 설계, API, API 문서화, 사용자 유즈 케이스, 배포 전략, 서버 설정, 서버 튜닝, JVM 옵션 등등 정말 A~Z까지 혼자 다 하려니 일이 미친 듯이 많았다. 아직 Elasticsearch, kibana로 실제 데이터 분석 및 통계하고 로깅도 해야 하고, 스트레스 테스트도 남아있는 걸 보면 죽을 맛이긴 하다. batch도 필요할 것 같은데, 공부해본 거 다 써먹는 중이다. 사실 요즘 거의 미친 듯이 테스트 케이스를 재작성 중이다. 이는 기존 TDD를 몰랐을 때와 공부해가는 과정에서 생각보다 TDD로 개발하는 과정 자체가 기존 방식보다 더 효율적이고 생산적이라는 생각이 들었고, 마치 DMZ 망처럼 안전장치가 생긴 것처럼 자신감을 더 가지게 된.. 2022. 12. 15.
Spy 테스트에서 대역은 중요한 역할을 맡아준다. Spy 객체는 기존의 함수나 메서드를 가로채고 원래의 기능을 수행하면서 특정 정보를 수집할 수 있는 기능을 제공한다. 예를 들어, 어떤 함수가 언제, 몇 번 호출되었는지를 기록할 수 있다. 비슷하게 Mock 객체는 원래의 기능을 구현하지 않고 특정 상황에 대해 정해진 반응 수행하는 기능을 제공한다. 스파이를 사용해보자 회원가입에 성공할 시 이메일로 회원 가입 안내 메일을 발송한다. 이를 검증하기위한 테스트 골격은 다음과 같다. //given //when userRegister.register("id", "pw", "email@tistory.com"); //then email@tistory.com으로 발송되었는지 확인 그런데 이메일 발송 여부를 어떻게 확인해야 할.. 2022. 12. 14.
Junit 5 Junit 5 설정부터 기초 내용까지 간단히 정리하자. JUnit Platform : 테스팅 프레임워크를 구동하기 위한 런처와 테스트 엔진을 위한 API를 제공한다. JUnit Jupiter : JUnit 5를 위한 테스트 API와 실행 엔진을 제공한다. JUnit Vintage : JUnit3과 JUnit4로 작성된 테스트를 JUnit 5 플랫폼에서 실행하기 위한 모듈을 제공한다. Gradle 인 경우 test 태스크에 JUnit 5 플랫폼을 사용하도록 설정해야 하고 testImplementation을 사용해 junit-jupiter 의존성을 추가하면 된다. dependencies { testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' } t.. 2022. 12. 12.
테스트 코드에 작성 순서가 있다고? 막상 TDD를 읽고 적용시킨다고 생각하여 회사 코드를 머릿속으로 생각해보았는데, 뭐부터 해야 하지?라는 의문점이 강하게 들었다. 이 의문점을 해소시켜보자. 우선 테스트 주도 개발에서 테스트 코드를 작성할 때 따르는 규칙? 권장되는 규칙이 있다고 한다. 1. 쉬운 경우에서 어려운 경우로 진행 2. 예외적인 경우에서 정상인 경우로 진행 초반에 복잡한 테스트부터 추가하게 되면 해당 테스트를 통과시키기 위해 한 번에 구현해야 할 코드가 많아진다. 현재 복잡한 테스트를 먼저 하고 있다고 판단할 수 있는 좋은 상황은 바로 막혔을 때이다. 쉬운 테스트는 아주 빠르게 생각하고 테스트를 통과하기 위한 코드가 빠르게 나올 수밖에 없다. 그런데 복잡한 테스트는 해당 테스트를 통과하기 위해 진행해야 할 절차가 많아질 수밖에 .. 2022. 12. 10.
TDD init 개발 방법론을 배우는 데 있어서 실습만큼 좋은 게 없는 것 같다. 나는 java, Kotlin을 사용할 것이고 우선적으로 java를 기준으로 작성한 다음 Kotlin으로 변경할 것이다. 이는 현재 Kotlin을 배우는 입장으로써 좋은 기초 코드가 될 것 같기 때문이다. JUnit5를 기준으로 사용한다. 이는 현재 자주 사용하는 스프링 부트의 기본 테스트 설정과 같고 기존 JUnit4를 기준으로 공부하고 싶지 않기 때문이다. 이러한 프레임워크나 사용방법에 대해선 따로 정리를 할 것이며 일단은 예제 + ChatGPT로 사용방법만 빠르게 이해하면서 진행하자. 이번 주말을 녹일 수 있는 좋은 공부 거리이다. TDD TDD는 개발의 시작을 테스트부터 시작한다고 한다. 구현 -> 테스트로 이어지는 흐름이 아니라 테.. 2022. 12. 10.
TDD 시작 Better late than never. 나의 과거의 개발 방식을 뒤돌아 보면 다음과 같다. 1. 요구사항을 파악한다. 도메인 전문가 와 직접적인 대화를 통해 모든 요구사항을 듣고 분석하여 정리한다. 2. 서버의 아키텍처를 생각한다. 3. 서비스 성격에 맞는 데이터베이스를 선택 및 설계를 한다. 4. 각 도메인에 필요한 부가 기능 및 외부 모듈을 검토한다. 5. 실제 비즈니스 로직을 작성한다. 이후 나는 요구사항대로 클래스를 만들고 인터페이스를 도출할 수 있는지 고민하고 필드의 타입을 고민하고 해당 클래스가 어떤 행위를 할지 생각하여 메서드를 만들어 기초적인 틀을 잡는다. 이 과정은 어떤 부분은 문서화를 진행하고 어떤 부분은 머릿속에서 생각하면서 진행된다. 이후 실제 코드를 작성한다. 기능 구현이 완료.. 2022. 12. 10.
JUnit 급한 불인 테스트 관련 지식을 우선적으로 습득해야겠다! JUnit이 하나의 테스트 클래스를 가져와 수행하는 방식 1. 테스트 클래스에서 @Test가 붙은 public이고 void형이며 파라미터가 없는 테스트 메서드를 전부 찾는다. 2. 테스트 클래스의 오브젝트를 하나 만든다. 3. @BeforeEach가 붙은 메서드가 있으면 실행한다. 4. @Test가 붙은 메서드를 하나 호출하고 테스트 결과를 저장해둔다. 5. @AfterEach가 붙은 메서드가 있으면 실행한다. 6. 나머지 테스트를 반복하면서 2~5번을 실행 7. 테스트 결과를 종합하여 리턴한다. 기억 : 새로운 테스트 메서드를 실행할 때마다 테스트 클래스 오브젝트를 새로 만든다는 점 이는 각 테스트가 서로 영향을 주지 않고 독립적으로 실행됨을 확실.. 2022. 11. 8.