테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴
-
11장 - 단위 테스트 안티 패턴테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 8. 18. 00:01
11장에서 다루는 내용 비공개 메서드 단위 테스트 단위 테스트를 하기 위한 비공개 메서드 노출 테스트로 유출된 도메인 지식 구체 클래스 목 정리 비공개 메서드를 테스트해야 하는가? 이 질문은 자주 받는 질문이며 짧게 대답하면 하지 말아야 합니다. 테스트의 원칙 중 하나인 식별할 수 있는 동작만 테스트해야 합니다. 비공개 메서드를 테스트하는 것은 구현 세부사항과 결합되고 리팩터링 내성이 떨어지게 됩니다. 따라서 직접 테스트하지 않고 간접적으로 테스트하는 것이 좋습니다. 비공개 메서드가 덩치가 너무 커진 경우는 오히려 추상화를 통해 별도의 클래스를 추출해야 할 수 있습니다. 물론 정말 정말 특별한 경우라면 리플랙션을 통해 테스트할 수 있다. 책에서는 ORM에서 비공개 생성자를 이용하지만 중요한 로직이라 테스..
-
10장 - 데이터베이스 테스트테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 8. 17. 00:01
10장에서 다루는 내용 데이터베이스 테스트를 위한 전제 조건 데이터베이스 테스트 모범 사례 테스트 데이터 생명 주기 테스트 내 데이터베이스 트랜잭션 관리 데이터베이스 테스트를 위한 전제 조건 목을 사용하지 않으면 테스트하기 힘들 수 있습니다. 데이터베이스를 형상 관리 시스템에 유지 Git과 같은 형상 관리 시스템에 데이터베이스를 저장하는 것이 최선이다. (예시: Flyway) 그렇지 않다면 버그 재현을 위해 과거의 특정 시점으로 되돌리기 어렵다. 참조 데이터도 데이터베이스 스키마다 애플리케이션이 데이터를 수정할 수 있으면 일반 데이터이며, 그렇지 않으면 참조 데이터이다. 애플리케이션이 참조 데이터를 수정하지 못하게 해야한다. 개발자마다 별도의 데이터베이스 인스턴스를 활용 데이터베이스 트랜잭션 관리 트랜잭..
-
9장 - 목 처리에 대한 모범 사례테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 8. 10. 00:01
9장에서 다루는 내용 목의 가치 극대화 하기 목을 스파이로 교체하기 목 처리에 대한 모범 사례 목은 비관리 의존성에만 적용해야 합니다. 다른 부분에 목을 적용하면 깨지기 쉬운 테스트(리팩터링 내성이 없는 테스트)가 됩니다. 목에 관해서 위의 지침만 잘 지키면 70% 이상의 성공을 거둘 수 있습니다. 목의 가치 극대화 하기 최대한 육각형 아키텍처의 바깥쪽에 있는 클래스를 모킹 하라. 내부의 클래스를 모킹 하는 경우에는 구현 세부 사항이 노출될 수 있기 때문이다. 목을 스파이로 대체하기 스파이는 수동으로 작성하는 반면에 목은 프레임워크의 도움을 받아 생성하는 것이 유일한 차이점이다. 스파이 = 실제로 개발자가 작성한 Mock 책에서는 Spy를 직접 인터페이스를 통해 생성하고 내부 메서드에 Assert까지 추..
-
8장 - 통합 테스트를 하는 이유테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 7. 23. 00:01
8장에서 다루는 내용 통합 테스트의 역할 이해 테스트 피라미드의 개념 자세히 살펴보기 가치 있는 통합 테스트 작성 단위 테스트에만 전적으로 의존하면 시스템이 전체적으로 잘 동작하는지 확신할 수 없습니다. 각 부분이 데이터베이스나 메시지 버스 등의 외부 시스템과 어떻게 통합되는지 확인해야 합니다. 예를 들어 다음과 같은 경우가 있을 수 있습니다. 단위 테스트는 통과했지만 Spring Bean Wiring이 되지 않아 애플리케이션이 실행되지 않을 수 있습니다. 통합 테스트란? 간단하게 단위 테스트가 아닌 모든 테스트는 통합 테스트이다. 통합 테스트가 어려운 이유 2가지 관련된 협력자가 많아 테스트가 비대해짐 프로세스 외부 의존성 운영이 필요 빠른 피드백, 유지 보수성을 포기하는 대신 회귀 방지와 리팩토링 내..
-
7장 - 가치 있는 단위 테스트를 위한 리팩터링테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 7. 8. 00:01
7장에서 다루는 내용 네 가지 코드 유형 알아보기 험블 객체 패턴 이해 가치 있는 테스트 작성 리팩터링이 필요한 이유 기반 코드를 리팩터링 하지 않고서는 테스트 코드를 크게 개선할 수 없습니다. 코드의 네 가지 유형 도메인 모델 및 알고리즘 : 노력대비 가장 이로운 테스트 지나치게 복잡한 코드 : 한 가지 예로 덩치가 큰 컨트롤러로 모든 작업을 스스로 하는 컨트롤러 컨트롤러 간단한 코드 지나치게 복잡한 코드가 가장 문제가 되며 단위 테스트하기 어렵지만 테스트를 하지 않는 것은 너무 위험합니다. 지나치게 복잡한 코드의 경우 도메인 모델 및 알고리즘, 또는 컨트롤러로 나누어 리팩터링 해야 합니다. 가장 이상적으로는 지나치게 복잡한 코드가 존재하면 안 됩니다. 험블 객체 패턴을 사용해 지나치게 복잡한 코드 분..
-
6장 - 단위 테스트 스타일테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 7. 7. 00:01
6장에서 다루는 내용 단위 테스트 스타일 비교 함수형 아키텍처와 육각형 아키텍처의 관계 출력 기반 테스트로 전환 단위 테스트 스타일 3가지 테스트 스타일이 존재합니다. . 출력 기반 테스트 - 가장 품질 좋음 상태 기반 테스트- 두 번째로 좋은 선택 통신 기반 테스트- 간헐적 사용 출력 기반 테스트 테스트 대상 시스템(SUT)에 입력을 넣으면 생성되는 출력을 점검하는 방식입니다. 상품할인을 계산하는 클래스가 존재한다고 가정했을 때 상품을 넣으면 할인된 가격이 나와 해당 가격을 검증할 수 있습니다. 여기서 중요한점은 내부 컬렉션에 상품을 추가하거나, 데이터베이스에 저장하지 않습니다. 이 스타일을 함수형 스타일이라고도 하며 부작용이 없는 함수입니다. 상태 기반 테스트 상태기반은 클라이언트가 상품을 추가했을 ..
-
5장 - 목과 테스트 취약성테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 6. 30. 00:01
5장에서 다루는 내용 Mock과 Stub 구분 식별할 수 있는 동작과 구현 세부 사항 정의 목과 테스트 취약성 간의 관계 이해 리팩터링 내성 저하 없이 목 사용하기 테스트에서 Mock을 사용하는 것은 논란의 여지가 있는 주제입니다. 어떤 사람들은 훌륭한 도구라고 생각하며, 다른 사람들은 취약성을 초래한다고 말합니다. 테스트 대역 테스트 대역은 스턴트 대역이라는 개념에서 비롯되었습니다. 제라드 메스자로스에 따르면 테스트 대역은 더미, 스텁, 스파이, 목, 페이크 다섯 가지가 있습니다. 실제로는 목과 스텁의 두 가지 유형으로 나눌 수 있습니다. Mock은 외부로 나가는 상호 작용을 모방하고 검사하는데 도움이 됩니다. Stub은 내부로 들어오는 상호 작용을 모방하는데 도움이 됩니다. 이때 Stub과 상호작용하..
-
4장 - 좋은 단위 테스트의 4대 요소테스트코드(Test Code)/단위테스트 - 생산성과품질을위한 단위테스트원칙과패턴 2023. 6. 29. 00:01
4장에서 다루는 내용 좋은 단위 테스트의 관점 간 차이점 모색 이상적인 테스트 정의 테스트 피라미드 이해 블락박스 테스트 및 화이트박스 테스트 사용 좋은 테스트의 4가지 요소 회귀 방지 리팩터링 내성 빠른 피드백 유지 보수성 회귀 방지 소프트웨어의 버그로 코드를 수정한 후 기능이 의도한 대로 작동하지 않는 경우입니다. 회귀는 귀찮으며, 개발할 기능이 많을수록 새로운 릴리스에서 기능이 하나라도 고장 날 가능성이 높습니다. 테스트 중 실행되는 코드의 양은 많아야 하며, 복잡도, 도메인 유의성도 중요합니다. 복잡한 비즈니스 로직을 나타내는 코드가 보일러플레이트 코드보다 훨씬 더 중요합니다. 중요한 기능에서 발생한 버그가 가장 큰 피해를 입히기 때문입니다. 리팩터링 내성 테스트를 빨간색(실패)으로 바꾸지 않고 ..