테스트 코드 메서드 이름에 관하여..

반달·2023년 3월 2일
1

들어가기전에..

테스트 코드를 작성함에 있어서 항상 걸림돌이었던 메서드 이름
코드리뷰를 받을 때도 항상 지적 받는 것이기에
이 기회에 보편적으로 사용하는 테스트 코드 메서드 작명 방법을 정리하고 장단점을 생각해보려한다.


테스트 코드 메서드를 작성하는 7가지방법

1. 메서드명_테스트상태_기대결과

장단점

  • 장점
    - 어떤 메서드를 테스트 했을 때 어떤 결과가 나올지 테스트 하는건지 잘 나와있다.
  • 단점
    - 코드 리팩토링을 하다 메서드 이름이 변경되면 같이 이름을 변경해줘야 하는 불상사가 있을 수 있다.

예시

  • isAdult_AgeLessThan18_False
  • withdrawMoney_InvalidAccount_ExceptionThrown
  • admitStudent_MissingMandatoryFields_FailToAdmit
  • isAdult메서드는 나이가 18살보다 적으면 False를 반환한다

2. 메소드명_기대결과_테스트상태

  • 장점
    - 어떤 메서드를 테스트 했을 때 어떤 결과가 나올지 테스트 하는건지 잘 나와있다.
  • 단점
    - 마찬가지로 코드 리팩토링을 하다 메서드 이름이 변경되면 같이 이름을 변경해줘야 하는 불상사가 있을 수 있다.
    - 테스트 메서드를 한글로 적을 경우 어순이 어색하다.

예시

  • isAdult_False_AgeLessThan18
  • withdrawMoney_ThrowsException_IfAccountIsInvalid
  • admitStudent_FailToAdmit_IfMandatoryFieldsAreMissing
  • isAdult 메서드는 False를 반환한다 나이가 18보다 적으면

3. test[테스트할 기능]

  • 장점
    - 테스트 할 기능이 직관적으로 표현되어있다.
  • 단점
    - test라는 접두사가 굳이 붙는다? 어차피 테스트 코드 클래스 파일이고 그 자리에 테스트 메서드가 있는건 당연한건데 굳이 안붙여도 된다고 생각이 든다.
    - 이 테스트가 결국 어떤 결과를 가지는지 한눈에 파악하기 어렵다.

예시

  • testIsNotAnAdultIfAgeLessThan18
  • testFailToWithdrawMoneyIfAccountIsInvalid
  • testStudentIsNotAdmittedIfMandatoryFieldsAreMissing
  • 테스트 나이가 18살 아래는 성인이 아니다

4. 테스트할 기능

  • 장점
    - 위의 3번에서 test라는 접두사를 뺀 버전이다 훨씬 깔끔하다.
    - Junit의 경우 어노테이션으로 @Test라고 붙기 때문에 굳이 메서드이름에 넣을 이유가 없다.

  • 단점
    - 테스트의 결과가 어떻게 되어야 맞는지 알 수없다.

예시

  • IsNotAnAdultIfAgeLessThan18
  • FailToWithdrawMoneyIfAccountIsInvalid
  • StudentIsNotAdmittedIfMandatoryFieldsAreMissing
  • 나이가 18살 아래라면 성인이 아니다

5. should_기대결과_When_테스트상태

  • 장점
    - 어떤 행동을 했을 때 어떻게 되어야 하는지 직관적으로 나와있다.
    • 보는 입장에서 should 뒤엔 기대하는 결과가 when 뒤에는 어떤 행동을 했을 때라는걸 표시해준다.
  • 단점
    - 어느 메서드가 하는 일인지는 모른다.

예시

  • should_ThrowException_When_AgeLessThan18
  • should_FailToWithdrawMoney_ForInvalidAccount
  • should_FailToAdmit_IfMandatoryFieldsAreMissing
  • should 예외발생 when 나이가 18보다 작으면

6. when_조건_Expect_기대결과

  • 장점
    - 어떤 행동을 했을 때 어떻게 되어야 하는지 직관적으로 나와있다.
  • 단점
    - 메서드명을 적으면 그 메서드명이 변경될 때 같이 변경해줘야 한다.

예시

  • When_AgeLessThan18_Expect_isAdultAsFalse
  • When_InvalidAccount_Expect_WithdrawMoneyToFail
  • When_MandatoryFieldsAreMissing_Expect_StudentAdmissionToFail
  • When 나이가 18보다 작을 때 Expect isAdult는 false이다

7. given_사전조건_When_테스트상태_Expect_기대결과

이러한 접근법은 행동 주도 개발(BDD)의 일부로 개발된 네이밍 컨벤션에 기초한다. 이 아이디어는 테스트를 세개의 파트로 나누어 전제 조건, 테스트 상태, 기대 결과가 위 형식대로 네이밍되는 형태이다.

  • 장점
    - 테스트를 해볼 조건이 뭐고 어떻게하면 뭐가나오는지 전부 적혀있다.
  • 단점
    - 메서드 명이 지나치게 길어지는 경향이 있다.

예시

  • Given_UserIsAuthenticated_When_InvalidAccountNumberIsUsedToWithdrawMoney_Then_TransactionsWillFail
    (놀랍게도 이게 전부 메서드 명이다 ㅋㅋㅋ 너무길다 받침이 없는 영어로 적혀서 더 그런 것도 있긴하다.)

그럼 앞으로 어떻게 쓸까 나는?

7가지나 되는 테스트 명 작성 방법이 있지만, 한글로 테스트코드를 작성한다고 가정했을 때 영어식 표현 또는 어순이 들어가 있는 것을 제외하면 남는게
1, 2, 3, 4 의 방법이다.
그 중에서도 메서드 명이 변경되면 테스트 메서드 명도 바꿔야하는 1, 2을 제외하고 test라는 굳이 어노테이션으로 들어가는 접두사가 포함된 3을 제외하면 남는 것은 4. 테스트할 기능을 적는 방법이다.

이는 충분히 활용할 수 있는게 우리는 프로젝트를 만들 때 기능 목록을 README.md에 정리한다.
우리는 이 기능 목록을 바탕으로 커밋을 해야하고 테스트도 작성하여야 한다. 그래서 테스트 메서드 명을 하나씩 작명해야하는 번거로움을 방지하려면 기능 목록을 좀더 구체적으로 작성할 필요도 있다. ex) 나이가 20세 보다 적으면 성인이 아니다.
이렇게 하면 테스트 메서드명을 작성할 때 그대로 복사해서 사용하면 된다.
아까 내가 정한 4번 방법이 그대로 적용되는 것이다.

아 그리고 테스트 메서드의 구현부 안에는 given-when-then 을 사용하는 것이 코드를 보는 다른사람이 테스트 메서드를 빨리 파악하기에 좋은 것 같다.


참고 페이지: https://dzone.com/articles/7-popular-unit-test-naming

profile
깊이 있는 안드로이드 개발자가 되기 위해

0개의 댓글