Unit Testing 7

통합테스트을 좀 더 좋게 작성하기위한 사전 지식

단위 테스트에만 전적으로 의존하면 시스템이 전체적으로 잘 작동하는지 알 수 없다. 결국 통합테스트를 진행해야하며 단위테스트로 비즈니스로직을 확인한다 하더라도 외부의 의존성테스트를 안 할 수도 없는 노릇이다. 통합테스트의 역할 단위 테스트가 도메인 모델 및 알고리즘에 대한 테스트를 진행한다면 통합테스트는 컨트롤러를 다루는 전체적인 테스트를 진행한다. 통합테스트는 회기 방지가 단위테스트 보다 우수하고, 제품코드와의 결합도 낮아서 리팩터링 내성도 우수하다. 통합테스트는 주요흐름과 단위테스트가 다루지 못하는 기타 예외 상황을 다룬다. 빠른 실패 원칙 빠른 실패 원칙은 예기치 않은 오류가 발생하자마자 현재 연산을 중단하는 것을 의미한다. 마치 도미노를 할때 중간중간 세이프바를 두는것과 같다. 피드백 루프 단축: ..

Unit Testing 2024.03.17

가치 있는 테스트를 위한 리팩터링

좋은 단위 테스트 스위트의 속성을 정의 개발 주기에 통합돼 있다. 코드베이스 중 가장 중요한 부분만을 대상으로 한다. 최소한의 유지비로 최대의 가치를 끌어낸다. 즉 가치있는 테스트를 식별하고 가치있게 작성해야한다. 리팩터링할 코드 식별하기 코드 복잡도 도메인 유의성 클래스 또는 메서드가 가진 협력자 수 협력자의 유형 순환 복잡도 (1 + 분기점(if) 수) 복잡한 코드와 도메인 유의성을 갖는 코드가 단위 테스트에서 가장 이롭다. 해당 테스트가 회귀 방지에 뛰어나 지기 때문. 예로 주문 가격을 계산하는 메서드에 조건문이 없다면 순환 복잡도는 1이다. 그러나 이러한 메서드는 비즈니스적으로 중요한 기능이므로 테스트하는것이 중요하다. 협력자의 유형과 협력자 수에 따라서 테스트의 크기(유지보수성)가 결정된다. 위..

Unit Testing 2024.03.03

단위 테스트작성 스타일과 함수형 어키텍처

단위 테스트의 세가지 스타일 출력 기반 테스트 상태 기반 테스트 통신 기반 테스트 위 스타일은 하나의 테스트에서 둘 이상 또는 세가지를 다 사용할 수 있다. 출력기반 테스트 테스트 대상 시스템에 입력을 넣고 생성되는 출력을 점검 하는 방식. 전역 상태나 내부 상태를 변경하지 않는 코드에만 적용되므로 반환 값만 검증하면 된다. 간단하게 출력값을 검증을 기반으로 하는 테스트, 이는 함수형이라고도 하고 사이드 이펙트 없는 코드 선호를 강조하는 프로그래밍 방식인 함수형 프로그래밍의 뿌리를 두고있다. 상태 기반 스타일 정의 상태 기반 스타일은 작업이 완료된 후 시스템 상태를 확인하는 것이다. 이 테스트 스타일에서 상태라는 용어는 테스트 대상 시스템이나 협력자 혹은 db나 파일시스템과 같은 프로세스 외부 의존성의 ..

Unit Testing 2024.02.24

목(mock)사용하는 테스트의 취약성

목과 스텁 흔히 테스트를 할때 다른 시스템 모듈의 의존성을 최소화 하기 위해서 목과 스텁을 사용하는데 목은 테스트 대상 시스템과 그 협력자 사이의 상호 작용을 검사할 수 있는 테스트 대역이다. 테스트 대역은 모든 유형의 비운영용 가짜 의존성을 설명하는 포괄하는 용어 여기서 목(목,스파이)과 스텁(스텁,더미,페이크)로 나뉜다. 두 유형의 차이점 목은 외부로 나가는 상호 작용을 모방하고 검사하는 데 도움이 된다. 이러한 상호작용은 테스트 대상 시스탬이 상태를 변경하기 위한 의존성을 호출하는 것에 해당 (이메일 전송을 하는 부분 등등) 스텁은 내부로 들어오는 상호작용을 모방하는 데 도움이 된다. 이러한 상호작용은 테스트 대상 시스템이 입력 데이터를 얻기 위한 의존성을 호출하는 것에 해당한다.(DB에서 데이터를..

Unit Testing 2024.02.18

이상 적인 단위테스트의 4대 요소

잘 만들어진 단위테스트 스위트의 특성 개발 주기에 포함돼 있다. 실제로 사용하는 테스트에만 가치가 있다. 그렇지않으면 작성해도 의미없다. 코드베이스의 가장 중요한 부분만을 대상으로 한다. 모든 실행 코드에 똑같이 신경쓸 필요가 없다. 애플리케이션의 핵심을 다른것과 구별하는 것이 중요하다. 최소한의 유지비로 최대 가치를 끌어낸다. 가치있는 테스트와 낮은 가치의 테스트 식별 가치 있는 테스트 작성 좋은 단위 테스트의 4대 요소 회귀 방지 리팩터링 내성 빠른 피드백 유지 보수성 회귀 방지 회귀는 소프트웨어 버그다.개발할 기능이 많을수록 릴리스가 될때마다. 고장날 가능성이 높아진다. 회귀 방지 지표에 대한 테스트 점수가 얼마나 잘 나오는지 평가하려면 다음을 고려하자 테스트 중에 실행되는 코드양 코드 복잡도 코드..

Unit Testing 2024.02.11

단위테스트(2) 단위테스트 구조

AAA 패턴 AAA 패턴은 준비, 실행, 검증 이라는세 부분으로 나누어서 하나의 단위테스트를 구성하는 것 이다. AAA 패턴은 스위트 내 모든 테스트가 단순하고 균일한 구조를 갖는 데 도움이 된다. 이러한 일관성이 이 패턴의 가증 큰 장점이다. 준비구절에서는 테스트 대상 시스템과 해당 의존성을 원하는 상태로 만든다. 실행 구절에서는 sut에서 메서드를 호출하고 준비된 의존성을 전달하며 출력 값을 캡처한다. 검증 구절에서 결과를 의도된 값이나 상태가 되었는지 검증한다. AAA 패턴의 주의할점 여러개의 준비, 실행, 검증 구절 피하기 이는 애매하고 이상한 통합테스트와 다를바가 없어진다. 테스트 내에 if문 피하기 이 또한 위와 비슷하게 if문이 있는 단위 테스트를 만날 수 있다. 이것도 안티패턴. 단위 테스..

Unit Testing 2024.02.04

단위 테스트 (1)

코드는 작성되면 될수록 점점 나빠지는 경향이 있다. 코드베이스에 변경이 생길 때마다 엔트로피는 증가한다.그렇기때문에 지속적인 정리와 리팩토링을통해 관리를 해 나가야하고 이와같은 관리가 되지 않으면 프로젝트는 점점 복잡해지고 보수하기 어려워진다. 흔히 이러한 경향을 해소하기위한 방법으로 테스트를 한다. 테스트는 안전망 역할을 하며 회기에 대한 보험을 제공하는 도구라 할 수 있다. 코드 커버리지 또는 분기 커버리지 점수가 높다고 절때 안정성이나 테스트가 완료된 것이라고 보기 힘들다 그 이유는 점수를 위한 테스트를 칠 수 있기때문이다. 개발을 해본 사람은 이를 뜻하는 것이 무엇인지 알거라고 봅니다. 성공적인 Test shuit는 다음과 같다. 개발 주기에 통합돼 있다. 코드베이스 중 가장 중요한 부분만을 대상..

Unit Testing 2024.01.28