✏️ 스터디 모음집/디자인 패턴 스터디
클린코드 - 깨끗한 테스트 코드 짜기
cocoroocoo
2022. 11. 5. 02:43
테스트 코드를 작성함에 있어서
F.I.R.S.T 규칙 이란?
F : 빠르게 동작하는 테스트 코드
I : 독립적인 기능을 테스트하는 테스트 코드 → 기능(단위테스트라면, 함수)당 assert 하나!
R : 반복 가능한 테스트 코드
S : 여기저기 들어다 볼 필요 없이, 테스트 코드 만으로 자가 검증이 끝나는 테스트 코드
T : 실제 코드를 구현 하기 전에 적시에 테스트 코드를 작성하자
BUILD-OPERATE-CHECK 패턴 ?
깨끗한 테스트 코드는 가독성이 제일 중요하다!
BUILD : 테스트 자료를 만든다. // 보통 이 단계에서 목업 데이터를 만들거나, 테스트용 데이터 베이스에 데이터를 넣는다.
OPERATE : 테스트 자료를 조작한다. // 이 단계에서는 테스트 하고자 하는 시스템의 함수를 호출
CHECK : 조작의 결과를 확인한다. // 이 단계에서 assert 체크!
😱 안티 패턴
//use exposed API of the system you are testing to prepare a //scenario
//BUILD
CreateUserRequest request = buildCreateUserRequest();
UserDto user = client.createUser(request);
UpdateUserRequest updateRequest = createUpdateUserRequest(user);
//OPERATE
client.updateUser(updateRequest);
//CHECK
UserDto userDto = client.getUser(request.getId()):
assertUser(userDto, updateRequest);
BUILD, OPERATE, CHECK 단계에서 모두 테스트하려는 시스템(아래 예시 코드에서는 client)의 함수를 사용하는 경우
CHECK 단계에서는 OPERATE 조작의 결과를 확인하는데, 테스트 하려는 시스템(client)에 문제가 있을 경우, 여기저기에서 다 client 코드를 쓰고 있어서 OPERATE 에서 만 문제가 있는건지, 아니면 다른곳에서 문제가 발생 했는 지 알아차리기 쉽지 않음.
😃 안티 패턴 수정
테스트 하려는 시스템과, 아닌 시스템을 나누자!
//use repository layer of the system you are testing to prepare
//a scenario
//BUILD
Organization organization = createDefault();
organizationRepository.save(organization);
User user = createDefaultUserAccount(organization);
userAccountRepository.save(organisation);
//OPERATE
client.updateUserAccount(updateRequest);
//CHECK
user = userAccountRepository.getUserAccount(user.getId());
assertUser(updateRequest, user);
위와 같이 레이어를 나누면
테스트 하려는 시스템(client)에 문제가 있을 경우,
CHECK 단계에서는 시스템(client) 함수를 사용하는 OPERATE 조작에서만 문제가 있구나! 라고 판단 할 수 있음
출처