작성
·
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 인턴이에요.
객체 비교를 위해 변수값이 아닌 상수값으로 비교하는 이유에는 몇 가지 이유가 있습니다.
의도 표현: 상수값은 일반적으로 의미를 가지고 있어 명확하게 의도를 표현할 수 있습니다. “상수값”과 같이 명확하게 정의된 값을 비교함으로써 테스트 코드를 읽을 때 어떤 값을 기대하는지 한눈에 알 수 있습니다.
유연성: 변수값은 변경될 수 있으므로 비교 시점에 따라 다른 값을 갖을 수 있습니다. 이러한 경우 이후에 테스트를 수정해야 할 수도 있습니다. 그러나 상수값으로 비교한다면 이러한 유연성이 줄어들고, 애플리케이션의 변경에 따른 영향을 최소화할 수 있습니다.
성능과 안정성: 상수값은 미리 정의되어 있으므로 객체 생성 또는 상태 변경 없이도 비교할 수 있습니다. 이는 성능과 안정성 면에서 이점이 될 수 있습니다. 변수값으로 비교하게 되면 객체 생성 및 상태 변경 과정에서 예외가 발생할 가능성이 있으며, 이는 테스트의 신뢰도를 떨어뜨릴 수 있습니다.
따라서 테스트 코드에서는 객체간의 비교보다는 의도를 명확히 표현하기 위해 상수값을 사용하는 것이 일반적입니다. 하지만 특정 상황에서는 변수값으로 비교하는 것이 더 적합한 경우도 있을 수 있습니다. 상황에 따라 적절한 방법을 선택하여 테스트 코드를 작성하시면 됩니다. 감사합니다!