https://www.geeksforgeeks.org/should-private-methods-be-tested/
- 비공개 메서드를 테스트하면 해당 메서드가 수행해야 하는 작업을 수행하고 예상치 못한 부작용이 발생하지 않는지 확인하는 데 도움이 될 수 있습니다.
- 비공개 메소드를 테스트하면 해당 메소드가 효율적이고 성능 문제를 일으키지 않는지 확인하는 데 도움이 됩니다.
- public 메소드로 테스트하기 어려운 경우 도움이 됩니다.
- private 메서드가 다른 모듈과 연결되는 경우, 모킹을 통해 슬라이스 테스트를 구현하기 좋다
- private 메서드 역시 regression 방지가 중요하다
이 질문에 대해서는 사람마다 의견이 다르기 때문에 정해진 답은 없습니다.
어떤 사람들은 비공개 메서드의 단위 테스트를 나쁜 습관으로 간주할 수도 있고, 다른 사람들은 이를 코드를 테스트하는 데 완벽하게 허용되는 방법으로 볼 수도 있습니다. 단위 테스트 전용 메서드는 코드가 긴밀하게 결합될 수 있기 때문에 일부에서는 나쁜 습관으로 간주됩니다. 이는 테스트 코드가 테스트 중인 클래스의 구현 세부 사항과 밀접하게 연결되어 있음을 의미합니다
- 코드가 밀접하게 결합될 수 있습니다. 테스트 코드는 테스트 중인 클래스의 구현 세부 사항과 밀접하게 연결됩니다. 이로 인해 코드를 변경하고 유지 관리하기가 어려워질 수 있습니다.
- 프라이빗 메서드에 대한 단위 테스트를 작성하는 것은 어려울 수 있습니다. 프라이빗 메서드는 일반적으로 퍼블릭 메서드보다 - 더 복잡하므로 단위 테스트가 더 어렵습니다.
- 프라이빗 메서드에 대한 단위 테스트를 작성하는 데는 시간이 많이 걸릴 수 있습니다. 프라이빗 메서드는 일반적으로 퍼블릭 메서드보다 더 복잡합니다. 즉, 프라이빗 메서드에 대한 단위 테스트를 작성하는 데 더 많은 시간이 필요합니다.
- private 메서드는 공용 인터페이스에 영향을 주지 않고 변경될 수 있습니다. 이는 private 메서드에 대한 단위 테스트가 테스트해야 하는 모든 변경 사항을 포착하지 못할 수도 있음을 의미합니다.
- 프라이빗 메서드는 스터빙하기 어려울 수 있습니다. 모의는 종속성 동작을 시뮬레이션하기 위해 단위 테스트에 사용되는 기술입니다. Private 메서드는 단위 테스트 코드에서 직접 액세스할 수 없기 때문에 스터빙하기 어려울 수 있습니다.
즉,
- 프라이빗 메서드에 대한 단위 테스트는 코드가 긴밀하게 결합될 수 있고,
- 프라이빗 메서드에 대한 단위 테스트를 작성하기 어려울 수 있으며,
- 프라이빗 메서드에 대한 단위 테스트를 작성하는 데 시간이 많이 걸릴 수 있으므로
나쁜 습관으로 간주될 수 있습니다.
현재 서비스 레이어에서 검증 목적의 validateSomething()
private 메서드를 사용하고 있다. 그리고 이는 updateSomeProperty()
라는 메서드에서 사용된다. 즉 update 하기 위해 필요한 validation을 수행한다.
validate가 제대로 작동하는지 굳이 검증할 필요는 없다. 대신, updateSomeProperty
에서 올바르게 해당 validation이 작동하는지 검증하면 된다. 이것이 외부로 공개된 인터페이스이기 때문이다.
테스트 커버리지가 낮아지기 때문에 private 메서드까지 테스트하고 싶은 욕구가 생길 수도 있겠지만... 테스트 커버리지가 높은 것이 항상 도움이 되는 것은 아니다.
좋은 코드의 조건 중 하나로 뽑히는 것이 테스트하기 쉬운 코드다. 괜히 TDD가 있는 것이 아니다. 반대로 말하면, (항상 그렇지는 않겠지만) 테스트하기 쉬운 코드를 작성하기 위해 노력하다 보면 언젠가 좋은 코드를 만들게 되지 않을까? 라는 생각.
통합 테스트를 위한 디비는 어떻게 구성하면 좋을까? Testcontainers
다양한 운영환경에서의 데이터베이스 형상관리, flyway
https://youtu.be/pxDlj5jA9z4?si=lL_LYT_Cxy2aEl6k
현재 시간과 비교하는 서비스 로직을 테스트하면서 이런저런 난항을 겪었다. 그 과정에서 Period의 경우 연월일단위로 비교하므로 시간 단위 비교에는 사용할 수 없다는 것을 깨달음. 이것도 테스트를 안 짰으면 못 고쳤을 일이다.
포스트맨으로 다 되지 않냐는 말이 안 먹히는 경우가 있다. 이런 경우가 대표적이다. 매일 12시마다 테스트를 돌려서 스케줄링이 잘 돌아가는지 체크할 수는 없지 않은가.
Period와 Duration, ChronoUnit이 있다는 것도 체크하자.