단위테스트란 코드가 예상대로 작동하는지 검증하는 과정이고, 이는 소프트웨어 품질 향샹으로 직결된다.
🌠TDD의 세가지 법칙
실제 코드를 짜기전에 단위 테스트를 먼저 짜야한다. 단위테스트의 우선순위가 더 높다.
- 실패하는 단위 테스트를 작성할 때까지 실제 코드는 작성하지 않는다.(개발자는 테스트 케이스에 대한 명확한 이해와 요구사항에 대한 검증을 수행하면서 코드를 작성)
- 컴파일을 실패하지 않는 것을 전제로, 실행이 실패하지 않도록 단위 테스트를 작성한다.
- 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다.
이렇게 세가지 법칙을 다 지키면 버그가 감소되어 코드의 품질은 향상되지만 매년 수천개의 테스트케이스가 생성되어서, 케이스가 많아지는 만큼 관리 문제를 유발한다고 한다.
🚗깨끗한 테스트코드의 필요성
실제 코드가 진화할수록 테스트코드도 진화를 시켜줘야한다.
기존의 테스트 케이스(테스트 코드)가 실패하면 이후 테스트 케이스를 통과하기가 점점 어려워지는 특징을 가지고 있기 때문에 이 후 테스트 코드의 유지/보수 시간을 단축시키기 위해 실제 코드 못지않게 깨끗하게 짜는것이 중요하다.
테스트 코드를 짜기위해서는 테스트 케이스가 있어야하며 둘의 차이는 특정 기능이나 모듈 테스트를 위한 코드, 특정 시나리오에 대한 테스트 설계/정의(문서, 스크립트)로 나뉜다.
🚕깨끗한 테스트코드의 작성법
클린 코드의 필자는 '가독성' 가장 중요시한다. 명료하고 단순하게 최소의 표현으로 많은 것을 나타낼것을 권장한다. 깨끗한 테스트 코드의 작성은 5가지로 나뉜다.
BUILD-OPERATE-CHECK 패턴 사용
- BUILD-OPERATE-CHECK 패턴은 지속적인 개선과 배포를 위한 소프트웨어 개발 프로세스에서 쓰이는 일종의 사이클로 문자 그대로 빌드,오퍼레이트,체크 패턴이다. 아래는 코드의 가독성을 높인 리펙터링한 코드이다.
- 첫째 코드는 중복된 함수 호출이 가독성을 흐린다. 따라서 다음과 같이 중복과 잡음을 없애 둘째 코드와 같이 수정해주어 테스트 케이스를 쉽게 이해할 수 있게끔 하는것이 중요하다고 한다.
도메인에 특화된 테스트언어 사용
- 시스템 조작 API에 함수와 유톨리티를 구현해 테스트 코드를 짜기 쉽게 할 수 있다. 아래 코드와 같이 특정 도메인에서 함수를 사용해 짭고 간결한 테스트 코드의 작성이 가능.(예금, 인출 기능을 함수로 구성해 테스트 코드로 변환)
이중 표준 사용
- 일반적으로는 현재 코딩 표준과는 다른 표준을 사용하는것을 이중 표준이라고 하며 코드의 일관성과 확장성을 위해 이중 표준을 사용하지 않는것이 좋다.
- 하지만 테스트 API 코드에 적용하는 표준은 실제 코드와 확실이 다르니, 자원이 제한되는 상황이라면 실제 환경과 다르게 작성하여 사용할 수 있으며 테스트코드의 가독성을 위한다면 차이를 주어도 좋다고 한다.
- 다음은 가독성을 중시해 이중표준을 사용한 예시이다.
테스트 당 ASSERT(참, 거짓 판별) 하나 사용
- ASSERT 문이 단 하나인 함수는 결론이 하나라서 코드를 빠르게 이해하기 쉽다.
- 따라서 ASSERT가 두개라면 함수를 두개로 나누어 사용하는 것이 좋지만 경우에 따라 배보다 배꼽이 커질 수 있으니 그대로 사용하는것도 괜찮다고 한다.
테스트 당 개념 하나 사용
- 앞선 ASSERT를 하나 사용하는것의 상위개념인데 하나의 테스트에 잡다한 개념을 연속으로 테스트하지 않는 것이 중요하다.
- 다음 코드는 달이 바뀔 때마다 마지막 일을 표시하는 코드로 여러 중복되는 테스트 코드를 다 읽어야먄 코드의 이해가 가능하다. 따라서 하나의 assert만을 읽고도 코드를 이해할 수 있도록 작성 한다면 가독성이 훨씬 좋아질 것이다.
번외) 깨끗한 테스트를 위한 5가지 규칙 F.I.R.S.T
- Fast, Independent, Repeatable, Self-Validating, Timely
- 테스트는 빨라야하며 테스트끼리 서로 의존하지 않고, 어떤 환경에서도 반복이 가능(실제,QA,집가는길 모바일)해야 한다. 또 Bool값으로 결과를 나타내어 개발자가 로그 파읽을 읽게하지 않도록, 실제코드를 구현하기 전에 작성해야한다.
💡결론
- 테스트 코드는 소프트웨어의 품질 항샹을 위한 코드이며, 이를 지속적으로 깨끗하게 관리해줘야 실제 코드의 품질도 망가지지 않는다.