[TDD/방법론] FIRST, Right-BICEP, CORRECT

nana·2024년 9월 1일

방법론

목록 보기
2/9

Junit으로 생산성을 높이려면 테스트 대상과 커버하는 경계조건, 좋은 테스트의 요건을 배워야한다.

✔️FIRST : 좋은 테스트의 조건

Fast : 빠른

설계를 깨끗하게 하면 빠르게 유지할 수 있다.
가장 먼저 느린 테스트에 대한 의존성을 줄일것. > 클린 객체 지향 설계 개념과 맞출수록 단위 테스트 작성도 쉬워짐.

Isolated : 고립된

다른 단위 테스트에 의존하지 않는다.
테스트 코드는 어떤 순서나 시간에 관계없이 실행할 수 있어야한다.
작은 양의 동작에만 집중하면 테스트 코드를 집중적이고 독립적으로 유지하기 쉬워진다.
** SRP(단일 책임 원칙)

Repeatable : 반복 가능한

실행할 때 마다 결과가 같아야한다. > 직접 통제할 수 없는 외부 환경에 있는 항목들과 격리시켜야 한다.

Self-validating : 스스로 검증 가능한

테스트는 스스로 검증할 뿐만 아니라 준비할 수도 있어야 한다.
테스트에 필요한 어떤 설정 단계든 자동화를 해야한다.

Timely : 적시의

cf) 그럼 나쁜테스트란?

  • 테스트 사용하는 사람에게 어떤 정보도 주지 못하는 테스트
  • 산발적으로 실패하는 테스트
  • 어떤 가치도 증명하지 못하는 테스트
  • 실행하는 데 오래 걸리는 테스트
  • 코드를 충분히 커버하지 못하는 테스트
  • 구현과 강하게 결합되어있는 테스트.
  • 수많은 설정 고리로 점프하는 난해한 테스트.

✔️ Right-BICEP : 무엇을 테스트 할 것인가?

Right : 결과가 올바른가?

B : 경계조건(boundary conditions)은 맞는가?

경계조건 ex)

  • 모호하고 일관성 없는 입력 값.
  • 잘못된 양식의 데이터 (velog.i같은)
  • 비거나 빠진 값.
  • 이성적인 기댓값을 훨씬 벗어나는 값. (2999년도 같은)
  • 중복을 허용해서는 안 되는 목록에 중복 값이 있는 경우(주민번호 뒷자리같은)
  • 정렬이 안 된 정렬 리스트 혹은 그 반대. 정렬 알고리즘에 이미 정렬된 입력 값을 넣거나 정렬 알고리즘에 역순 데이터를 넣는 경우
  • 시간 순이 맞지 않는 경우 (HTTP서버가 OPTIONS 메서드의 결과를 POST 메서드 보다 먼저 번환해야하는데 그 후에 반환하는 경우)

👉🏻이거까지 통과하면 그 기능은 정상 작동하는거라고 볼 수 있다 라는 의미!

I : 역 관계(Inverse relationship)를 검사할 수 있는가?

C : 다른 수단을 활용하여 교차 검사(cross-check)할 수 있는가?

ex) 도서 대출 시스템 개발 시 대출된 도서 + 선반에 있는 도서개수 = 각 도서의 총 수량

E : 오류 조건(error conditions)을 강제로 일어나게 할 수 있는가?

환경적인 제약 ex)

  • 메모리가 가득 찰 때
  • 디스크 공간이 가득 찰 때
  • 네트워크 가용성 및 오류들
  • 서버와 클라이언트 간 시간이 달라서 발생하는 문제들
  • 시스템 로드
  • 제한된 색상ㅇ 팔레트 * 매우 높거나 낮은 비디오 해상도

P : 성능 조건(performance characteristics)은 기준에 부합하는가?

추측만으로 성능 문제에 바로 대응하기보다는 단위 테스트를 설계하여 진짜 문제가 어디에 있으며 예상한 변경 사항으로 어떤 차이가 생겼는지 파악해야한다.

✔️ CORRECT : 경계 조건

🌀 버그가 있는 것을 보여줄 수 있고, 버그가 없다는 것을 보여줄 수는 없다.

Conformance(준수) : 값이 기대한 양식을 준수하고 있는가?

시스템의 데이터 흐름을 이해하면 불필요한 검사를 최소화할 수 있다.
보통 이메일 주소를 파싱하여 이름 부분을 추출할 수 있으나 @기호가 없는 경우나 이름이 비어 있는 경우에도 대처를 해야한다.

Ordering(순서) : 값의 집합이 적절하게 정렬되거나 정렬되지 않았나?

Range(범위) : 이성적인 최솟값과 최댓값 안에 있는가??

Reference(참조) : 코드 자체에서 통제할 수 없는 어떤 외부 참조를 포함하고있는가?

  • 범위를 넘어서는 것을 참조하고 있지 않은지
  • 외부 의존성은 무엇인지
  • 특정 상태에 있는 객체를 의존하고 있는지 여부
  • 반드시 존재해야 하는 그 외 다른 조건들

Existence(존재) : 값이 존재하는가(non-null), 0이 아니거나(nonzero), 집합에 존재하는가 등

Cardinality(기수) : 정확히 충분한 값들이 있는가?

Time(절대적 혹은 상대적 시간) : 모든 것이 순서대로 일어나는가?

그 밖에 문제될 것이 있는가?

profile
BackEnd Developer, 기록의 힘을 믿습니다.

0개의 댓글