테스트 도중 버그와 이슈를 발견하여 해결한다: 작은 테스트 단위에서 발견할수록 빠르게 대처 가능, 반면 프로덕션에서 발견하면 비용이 크게 증가
코드가 기대하는 방식으로 동작하도록 보장한다: 새 변경사항이 기존 코드의 동작을 손상시키는지 확인할 수 있다
협업 환경에서 안전망 역할 수행
테스트 자체가 하나의 docs로 사용되어 다양한 상황(scenario)에서 기능이나 메서드가 어떻게 동작하는지 보여준다
테스트의 최소 단위로 가장 작은 단위의 코드 동작을 확인하는 테스트
다른 레이어/컴포넌트와 독립되어 테스트를 수행한다
테스트 도구: junit, testng, mockito, assertj 등
모듈 간의 인터페이스와 통합된 시스템의 동작을 확인하는 테스트
여러 모듈/컴포넌트가 함께 동작할 때 정상적으로 상호작용하는지 검증한다
테스트 도구: spring boot test, arquillian, testcontainers 등
시스템 전체가 사용자 관점(사용자 시나리오)에서 정상적으로 동작하는지 확인하는 테스트
코드가 프로덕션에서 사용할 수 있는지 검증한다
테스트 도구: selenium, jmeter, rest-assured 등
e2e vs integration
e2e | integration | |
---|---|---|
목적 | 전체 시스템의 사용자 시나리오 검증(사용자 관점에서의 시스템 동작) | 모듈 간 상호작용 검증(모듈 간 인터페이스와 데이터 흐름) |
범위 | ui, 네트워크, 백엔드, 외부 시스템(db, message queue 등) | 두 개 이상의 모듈 또는 컴포넌트(백엔드 모듈과 외부 시스템 등) |
실행 환경 | 실제 환경 또는 그와 유사한 환경 | 개발 환경 또는 통합 환경 |
예시 | 사용자 로그인부터 결제까지의 전체 흐름 테스트(로그인 → 상품 검색 → 주문 → 결제) | 사용자 인증 모듈과 데이터베이스 테스트 |
시스템이 비즈니스 요구사항을 충족하는지 확인하는 테스트
사용자 스토리 또는 시나리오를 기반으로 최종 사용자의 관점에서 테스트를 수행한다
테스트 도구: cucumber, jbehave 등
새로운 코드 변경이 기존 기능에 영향을 미치지 않는지 확인하는 테스트
이전에 테스트된 모든 기능을 다시 테스트한다
테스트 도구: junit, testng, selenium 등
시스템의 성능(응답 시간, 처리량, 안정성)을 평가하는 테스트 - e.g) 동시 사용자 1000명이 접속할 때의 응답 시간 측정
부하 테스트, 스트레스 테스트, 스파이크 테스트 등이 있다
테스트 도구: jmeter, gatling, loadrunner 등
시스템의 보안 취약점을 식별하고 보안 요구사항을 충족하는지 확인하는 테스트 - e.g) 로그인 기능에 대한 brute force 공격 테스트
인증, 권한, 데이터 암호화, sql injection 등을 테스트한다
테스트 도구: owasp zap, burp suite, nessus 등
주요 기능이 정상적으로 동작하는지 확인하는 테스트 - e.g) 빌드 후 주요 api 엔드포인트 테스트
핵심 기능만을 대상으로 한 간단한 테스트를 수행한다
테스트 도구: junit, testng 등
실제 사용자 환경에서 시스템을 테스트한다 - e.g) 베타 버전 앱을 출시하고 사용자 피드백을 수집한다
알파 테스트: 개발 팀 내부 또는 제한된 사용자 그룹이 수행하는 테스트
베타 테스트: 외부 사용자 그룹이 수행하는 테스트
테스트 도구: 사용자 피드백, 로드 분석 도구 등
시스템의 비기능적 요구사항(성능, 보안, 사용성, 호환성 등)을 검증하는 테스트 - e.g) 다양한 브라우저에서 웹 애플리케이션 호환성 테스트
테스트 도구: jmeter, owasp zap, browserstack 등
시스템 장애 발생 후 정상적으로 복구되는지 확인하는 테스트 - e.g) 데이터베이스 장애 후 복구 프로세스 테스트
데이터 손실, 시스템 재시작, 백업 복구 등의 애플리케이션의 복구 동작을 검증한다
테스트 도구: 모니터링 도구, 백업 도구 등
testing with various input, condition, scenario: 다양한 입력값, 조건, 시나리오로 테스트하여 메서드/기능의 행동을 엄격히 제한함으로써 사이드 이펙트를 방지한다
test converage: 가능한 프로덕션 코드 블록의 모든 부분을 테스트할 수 있도록 테스트 코드를 작성한다
test edge case: 테스트 대상의 메서드/기능의 경계값을 테스트한다
대략적인 테스트 처리 과정
개발자가 실제로 관여하는 부분 : 1,2,4
테스트 프레임워크가 관여하는 부분 : 3,5,6
junit5: 가장 널리 사용되는 자바의 단위 테스트 프레임워크
testng: junit보다 더 많은 기능(병렬 테스트, 그룹화, 의존성 테스트 등)을 제공하는 테스트 프레임워크
mockito: 단위 테스트에서 모의 객체를 생성하고 관리하기 위해 사용하는 라이브러리
easymock: mockito와 유사한 모의 객체 생성 라이브러리
powermock: mockito나 easymock으로 테스트하기 어려운 정적 메서드, 생성자, private 메서드 등을 테스트하기 위한 라이브러리
spring boot test: 스프링 부트에서 제공하는 통합 테스트 지원, 스프링 컨텍스트를 로드하여 테스트를 수행할 수 있다
rest-assured: restful api 테스트를 쉽게 작성할 수 있도록 도와주는 라이브러리
microshed testing: 마이크로서비스 아키텍처를 위한 통합 테스트를 쉽게 작성할 수 있도록 도와주는 테스트 프레임워크
mockito, easymock
wiremock: http 기반 서비스의 모의 객체 생성 도구
mockwebserver: http 서버를 모의하여 api 호출을 테스트하는 도구로 wiremock보다 더 많은 기능을 제공한다
cucumber: bdd 스타일의 테스트를 작성할 수 있는 도구
jbehave: cucumber와 유사하지만 자바 기반으로 더 많은 유연성을 제공하는 제공하는 bdd 테스트 프레임워크
spock: groovy 기반 bdd 스타일 테스트 프레임워크
jmeter: 웹 애플리케이션 성능 측정 도구(부하 테스트, 스트레스 테스트 등)
gatling: scala 기반 성능 테스트 도구
owasp zap: 웹 애플리케이션의 보안 취약점을 찾기 위한 도구
selenium: 웹 애플리케이션의 보안 테스트를 자동화할 수 있는 도구
selenium: 웹 애플리케이션의 ui 테스트를 자동화하는 데 가장 널리 사용되는 도구
selenide: 웹 애플리케이션의 ui 테스트를 쉽게 작성할 수 있도록 도와주는 라이브러리로 selenium을 기반으로 하며 더 간결하고 가독성이 높은 api를 제공한다
testfx: javafx 애플리케이션의 ui 테스트를 위한 도구
jacoco: 자바 코드 커버리지 측정 도구
cobertura: jacoco와 유사한 코드 커버리지 도구
테스트 검증 라이브러리는 테스트의 예상 결과를 검증하는 데 사용되며 기존의 junit이나 testng에서 제공하는 assertion보다 풍부하고 가독성 높은 기능을 제공한다
assertj: junit이나 testng에서 제공하는 assertion보다 직관적이고 유연한 방식으로 검증 코드를 작성할 수 있게 해주는 라이브러리
hamcrest: matcher 기반 assertion을 제공하는 라이브러리, junit과 함께 사용하며 복잡한 조건을 검증하는 데 유용하다
truth: assertj와 유사한 플루언트 api를 제공하는 구글에서 개발한 라이브러리
jsonpath: json 데이터에서 특정 값을 추출하거나 검증하기 위한 라이브러리
jsonassert: json 데이터를 비교하고 검증하기 위한 라이브러리
rest-assured assertions: restful api 테스트에 특화된 assertion 제공
awaitility: 비동기 코드의 테스트를 수행하는 라이브러리
테스트 인프라스트럭처는 실제 프로덕션 환경과 유사한 테스트를 수행할 수 있도록 테스트 환경을 구성하고 관리하기 위해 사용된다
testcontainers: 도커 컨테이너를 사용하여 테스트에 필요한 외부 서비스(db, message queue, cache 등)을 실행한다. junit과 통합되어 테스트 라이프사이클을 관리한다
embedded kafka: kafka를 테스트 환경에서 사용할 수 있도록 임베디드 버전을 제공한다
localstack: aws 서비스(s3, sqs, dynamodb 등)를 로컬에서 테스트할 수 있도록 도커 컨테이너로 제공한다
greenmail: 이메일 관련 기능을 테스트하기 위한 임베디드 이메일 서버로 stmp, pop3, iamp 프로토콜을 지원하며 테스트 환경에서 이메일 전송 및 수신을 시뮬레이션할 수 있다