pwd

테스트

자바 생태계의 테스트 도구들

테스트

테스트 역할

테스트 도중 버그와 이슈를 발견하여 해결한다: 작은 테스트 단위에서 발견할수록 빠르게 대처 가능, 반면 프로덕션에서 발견하면 비용이 크게 증가

코드가 기대하는 방식으로 동작하도록 보장한다: 새 변경사항이 기존 코드의 동작을 손상시키는지 확인할 수 있다

협업 환경에서 안전망 역할 수행

테스트 자체가 하나의 docs로 사용되어 다양한 상황(scenario)에서 기능이나 메서드가 어떻게 동작하는지 보여준다

테스트 종류

단위 테스트 (unit test)

테스트의 최소 단위로 가장 작은 단위의 코드 동작을 확인하는 테스트

다른 레이어/컴포넌트와 독립되어 테스트를 수행한다

테스트 도구: junit, testng, mockito, assertj 등

통합 테스트 (integration test)

모듈 간의 인터페이스와 통합된 시스템의 동작을 확인하는 테스트

여러 모듈/컴포넌트가 함께 동작할 때 정상적으로 상호작용하는지 검증한다

테스트 도구: spring boot test, arquillian, testcontainers 등

end-to-end test

시스템 전체가 사용자 관점(사용자 시나리오)에서 정상적으로 동작하는지 확인하는 테스트

코드가 프로덕션에서 사용할 수 있는지 검증한다

테스트 도구: selenium, jmeter, rest-assured 등

e2e vs integration

  e2e integration
목적 전체 시스템의 사용자 시나리오 검증(사용자 관점에서의 시스템 동작) 모듈 간 상호작용 검증(모듈 간 인터페이스와 데이터 흐름)
범위 ui, 네트워크, 백엔드, 외부 시스템(db, message queue 등) 두 개 이상의 모듈 또는 컴포넌트(백엔드 모듈과 외부 시스템 등)
실행 환경 실제 환경 또는 그와 유사한 환경 개발 환경 또는 통합 환경
예시 사용자 로그인부터 결제까지의 전체 흐름 테스트(로그인 → 상품 검색 → 주문 → 결제) 사용자 인증 모듈과 데이터베이스 테스트

인수 테스트 (acceptance test)

시스템이 비즈니스 요구사항을 충족하는지 확인하는 테스트

사용자 스토리 또는 시나리오를 기반으로 최종 사용자의 관점에서 테스트를 수행한다

테스트 도구: cucumber, jbehave 등

회귀 테스트 (regression test)

새로운 코드 변경이 기존 기능에 영향을 미치지 않는지 확인하는 테스트

이전에 테스트된 모든 기능을 다시 테스트한다

테스트 도구: junit, testng, selenium 등

성능 테스트 (performance test)

시스템의 성능(응답 시간, 처리량, 안정성)을 평가하는 테스트 - e.g) 동시 사용자 1000명이 접속할 때의 응답 시간 측정

부하 테스트, 스트레스 테스트, 스파이크 테스트 등이 있다

테스트 도구: jmeter, gatling, loadrunner 등

보안 테스트 (security test)

시스템의 보안 취약점을 식별하고 보안 요구사항을 충족하는지 확인하는 테스트 - e.g) 로그인 기능에 대한 brute force 공격 테스트

인증, 권한, 데이터 암호화, sql injection 등을 테스트한다

테스트 도구: owasp zap, burp suite, nessus 등

스모크 테스트 (smoke test)

주요 기능이 정상적으로 동작하는지 확인하는 테스트 - e.g) 빌드 후 주요 api 엔드포인트 테스트

핵심 기능만을 대상으로 한 간단한 테스트를 수행한다

테스트 도구: junit, testng 등

알파/베타 테스트 (alpha/beta test)

실제 사용자 환경에서 시스템을 테스트한다 - e.g) 베타 버전 앱을 출시하고 사용자 피드백을 수집한다

알파 테스트: 개발 팀 내부 또는 제한된 사용자 그룹이 수행하는 테스트

베타 테스트: 외부 사용자 그룹이 수행하는 테스트

테스트 도구: 사용자 피드백, 로드 분석 도구 등

비기능 테스트 (non-functional test)

시스템의 비기능적 요구사항(성능, 보안, 사용성, 호환성 등)을 검증하는 테스트 - e.g) 다양한 브라우저에서 웹 애플리케이션 호환성 테스트

테스트 도구: jmeter, owasp zap, browserstack 등

회복 테스트 (recovery test)

시스템 장애 발생 후 정상적으로 복구되는지 확인하는 테스트 - e.g) 데이터베이스 장애 후 복구 프로세스 테스트

데이터 손실, 시스템 재시작, 백업 복구 등의 애플리케이션의 복구 동작을 검증한다

테스트 도구: 모니터링 도구, 백업 도구 등

테스트 핵심

testing with various input, condition, scenario: 다양한 입력값, 조건, 시나리오로 테스트하여 메서드/기능의 행동을 엄격히 제한함으로써 사이드 이펙트를 방지한다

test converage: 가능한 프로덕션 코드 블록의 모든 부분을 테스트할 수 있도록 테스트 코드를 작성한다

test edge case: 테스트 대상의 메서드/기능의 경계값을 테스트한다

개발자와 테스트 프레임워크의 역할

대략적인 테스트 처리 과정

  1. 테스트 준비
  2. test input 제공
  3. 테스트 실행
  4. 기대하는 결과 값 제공
  5. 결과 확인
  6. 실행 결과 알림

개발자가 실제로 관여하는 부분 : 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: 마이크로서비스 아키텍처를 위한 통합 테스트를 쉽게 작성할 수 있도록 도와주는 테스트 프레임워크

테스트 더블, mock 도구

mockito, easymock

wiremock: http 기반 서비스의 모의 객체 생성 도구

mockwebserver: http 서버를 모의하여 api 호출을 테스트하는 도구로 wiremock보다 더 많은 기능을 제공한다

행위 주도 개발 도구

cucumber: bdd 스타일의 테스트를 작성할 수 있는 도구

jbehave: cucumber와 유사하지만 자바 기반으로 더 많은 유연성을 제공하는 제공하는 bdd 테스트 프레임워크

spock: groovy 기반 bdd 스타일 테스트 프레임워크

성능 테스트 도구

jmeter: 웹 애플리케이션 성능 측정 도구(부하 테스트, 스트레스 테스트 등)

gatling: scala 기반 성능 테스트 도구

보안 테스트 도구

owasp zap: 웹 애플리케이션의 보안 취약점을 찾기 위한 도구

selenium: 웹 애플리케이션의 보안 테스트를 자동화할 수 있는 도구

ui 테스트 도구

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 프로토콜을 지원하며 테스트 환경에서 이메일 전송 및 수신을 시뮬레이션할 수 있다