인프런 커뮤니티 질문&답변

Dompoo님의 프로필 이미지
Dompoo

작성한 질문수

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

댓글 작성 API 추가 (영상오류 수정)

검증시 변수값이 아니라 상수값으로 비교하는 이유가 있나요?

작성

·

460

·

수정됨

0

문제가 발생한건 아니고 단순 질문입니다!

 

테스트 짜실 때 보면,

// 1번 코드
assertEquals("상수값", findComment.getAuthor());

// 2번 코드
assertEquals(addComment.getAuthor, findComment.getAuthor());

1번처럼 상수값과 비교를 많이 하시는데,
저는 2번처럼 저장하려고 했던 객체와 실제로 저장된 후 리턴된 객체간의 비교를 많이 하는 것 같습니다. 2번이 유지보수의 측면으로 봤을 때 더 좋아보이는데 1번 스타일로 테스트 코드를 짜는 이유가 있으실까요?

답변 2

1

호돌맨님의 프로필 이미지
호돌맨
지식공유자

안녕하세요. 호돌맨입니다.
질문을 남겨주셔서 감사합니다.

저장하려고 했던 객체에서 값을 가져와서 비교하지 않는 이유는 아래와 같습니다.

비즈니스 로직이 들어가는 경우

addComment 객체에 author가 저장될때(setAuthor) 혹은 값을 가져올때(getAuthor) 비즈니스 로직이 첨가 되는경우 테스트 결과 값이 달라질 수 있습니다. 하지만 테스트 기대 값을 직접 때려넣으면 해당 케이스의 테스트 실패까지 고려할 수 있게 됩니다.

그 반대의 경우

addComment 객체에 author 값을 "AAA"로 설정했다고 가정합니다. 그런데 시간이 흐르고 요구사항이 변경되어 getAuthor()할때 "Hello_" prefix를 붙여 "Hello AAA"를 반환하게 했습니다.

String getAuthor() {
    return "Hell_" + this.author;
}

만약 2번 형태로 테스트를 검증하게되면 DB에도 "Hello_AAA" 값이 저장되어 테스트가 성공하게 됩니다. 이게 왜 문제가 되는지 궁금하시죠?

중요한건 개발자로서 그걸 의도하고 생각해봤냐 입니다.

위 코드를 다시 보시면 Hello가 아니라 Hell로 오타가 발생했습니다. 그럼에도 테스트가 통과되고 있습니다.

개발자가 인지하지 않았음에도 통과 되도록 만들어진 테스트 코드는 큰 의미가 없다는거죠.

감사합니다.

 

0

안녕하세요 Dom poo 님, 인프런 AI 인턴이에요.

객체 비교를 위해 변수값이 아닌 상수값으로 비교하는 이유에는 몇 가지 이유가 있습니다.

  1. 의도 표현: 상수값은 일반적으로 의미를 가지고 있어 명확하게 의도를 표현할 수 있습니다. “상수값”과 같이 명확하게 정의된 값을 비교함으로써 테스트 코드를 읽을 때 어떤 값을 기대하는지 한눈에 알 수 있습니다.

  2. 유연성: 변수값은 변경될 수 있으므로 비교 시점에 따라 다른 값을 갖을 수 있습니다. 이러한 경우 이후에 테스트를 수정해야 할 수도 있습니다. 그러나 상수값으로 비교한다면 이러한 유연성이 줄어들고, 애플리케이션의 변경에 따른 영향을 최소화할 수 있습니다.

  3. 성능과 안정성: 상수값은 미리 정의되어 있으므로 객체 생성 또는 상태 변경 없이도 비교할 수 있습니다. 이는 성능과 안정성 면에서 이점이 될 수 있습니다. 변수값으로 비교하게 되면 객체 생성 및 상태 변경 과정에서 예외가 발생할 가능성이 있으며, 이는 테스트의 신뢰도를 떨어뜨릴 수 있습니다.

따라서 테스트 코드에서는 객체간의 비교보다는 의도를 명확히 표현하기 위해 상수값을 사용하는 것이 일반적입니다. 하지만 특정 상황에서는 변수값으로 비교하는 것이 더 적합한 경우도 있을 수 있습니다. 상황에 따라 적절한 방법을 선택하여 테스트 코드를 작성하시면 됩니다. 감사합니다!

Dompoo님의 프로필 이미지
Dompoo

작성한 질문수

질문하기