Dev

자바와 JUnit을 활용한 실용주의 단위 테스트

prostars 2022. 11. 12. 14:16

현재 팀에서 관리는 레거시 코드는 높은 결합도와 상호 의존성을 가진 구조로 단위 테스트를 구성할 수 있는 상황이 아니다 보니, 단위 테스트보다 통합 테스트의 비중이 압도적으로 높다. 올해 꽤 많은 리팩터링으로 코드의 결합도를 낮추었고 의존성도 많이 끊었고, 일반화할 수 있는 내용은 정리해서 포스팅했었다.

여러분의 삶은 테스트 친화적인 설계를 채택할수록 편해지고 설계 자체도 더 좋아집니다.
알라딘 eBook <자바와 JUnit을 활용한 실용주의 단위 테스트> (제프 랭어.앤디 헌트. 데이브 토머스 지음, 유동환 옮김) 중에서

 

이제 단위 테스트 추가를 시도해볼 생각에 Spock를 검토했으나 현재 팀은 JUnit 선호도가 높고, 몇 개 없지만 JUnit으로 약간의 단위 테스트가 이미 구성되어 있다. 개인적으로 JVM의 단위 테스트 프레임워크로 JUnit을 선호하지 않는다. 이전 회사들에서는 ScalaTest와 Spock로 BDD 형식의 단위 테스트를 구성했었다.

 

각설하고, JUnit으로 단위 테스트를 추가해야 하는데, JUnit 사용해본 세월이 흘렀으므로, 리마인드 예전에 봤던 JUnit 책을 꺼냈으나 2004년도 책이라, 최근 책으로 책을 골라서 봤다. 2019년도에 나온 번역서이므로 약간의 시차가 있고 Java 8 기반으로 쓰였지만, 예제는 자바 12 기반으로 한다. JUnit 4.11 기반으로 쓰였지만, 목차에 나와 있듯이 JUnit 기능 설명보다 단위 테스트의 개념 설명과 방법론 설명의 비중이 높다. (JUnit 4 to JUnit 5 참고 : https://www.baeldung.com/junit-5-migration)

 

Hamcrest Mokito 설명도 약간 있다. TDD 대한 소개도 있지만, 개인적으로 TDD 선호하지는 않는다. 책이 얇은 편이라서 금방 있을 것이다. 참고로, 책의 전반부는 여기에 공개되어 있다. 

 

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=199724948

 

[전자책] 자바와 JUnit을 활용한 실용주의 단위 테스트

단위 테스트 작성 이유부터 테스트 가이드라인, 목 객체 사용법, 자동화된 단위 테스트, 리팩토링까지 단위 테스트의 핵심 내용을 설명한다. 또한, 단위 테스트를 단계별로 실습할 수 있게 구성

www.aladin.co.kr

구현 세부 사항을 설명하는 주석은 코드와 일치하지 않는 것으로 악명이 높습니다.
...
설명이 있는 주석문을 선호한다면 단언에 메시지를 추가할 수 있습니다. 하지만 더 좋은 방법은 테스트를 코드 자체만으로 이해할 수 있게 작성하는 것입니다. 테스트 이름을 변경하거나, 의미 있는 상수를 도입하거나, 변수 이름을 개선하거나, 복잡한 초기화 작업을 의미 있는 이름을 가진 도우미 메서드로 추출하거나, 가독성이 우수한 햄크레스트 단언을 사용하는 등의 방법을 활용하는 것이 테스트를 훨씬 좋게 만듭니다.
...
테스트가 프로덕션 코드와 같은 패키지에 있으면 그 클래스에 대해 패키지 수준으로 접근할 수 있습니다. 다른 패키지에 있다면 자바 리플렉션으로 접근 권한을 우회할 수 있습니다. 하지만 둘 다 하지 않는 것이 좋습니다.
내부 행위를 테스트하려는 충동이 든다면 설계에 문제가 있는 것입니다.
...
단위 테스트는 우리가 만드는 클래스에 대한 지속적이고 믿을 수 있는 문서 역할을 해야 합니다. 테스트는 코드 자체로 쉽게 설명할 수 없는 가능성들을 알려 줍니다.
...
테스트 코드는 빠르게 동작하며, 느린 것에 의존하는 코드를 최소화한다면 작성하기도 쉬워집니다. 이러한 의존성을 최소화하는 것 역시 좋은 설계의 목표입니다. 다시 한 번 말하지만, 코드를 클린 객체 지향 설계 개념과 맞출수록 단위 테스트 작성도 쉬워집니다.
...
좋은 단위 테스트는 다른 단위 테스트에 의존하지 않습니다(혹은 같은 메서드에 있는 테스트 케이스).
...
코드를 이해하는 비용 또한 상당합니다. 깔끔하고 좋은 구조를 갖춘 코드는 10분이면 변경할 수 있지만, 복잡하고 지저분한 코드는 몇 시간이 필요합니다.
...
단위 테스트를 설정하는 데 코드가 몇 줄 혹은 수십 줄 필요하다면 그것은 시스템 설계에 문제가 있다는 것입니다. SRP를 위반하면 클래스는 점점 커지고, 다른 클래스에 대한 의존성이 커지고, 테스트를 설정하는 데 더 많은 노력이 요구됩니다. 커다란 클래스를 분할하세요.
...
잘 추상화된 테스트는 코드를 이해하는 데 중요한 것을 부각시켜 주고 그렇지 않은 것은 보이지 않게 해 줍니다. 테스트에 사용된 데이터는 스토리를 말하는 데 도움을 주어야 합니다.
...
목에 대해 어떤 가정을 세운다고 생각해 보세요. 목으로 처리한 것은 무엇이고, 그것이 질의에 대해 어떻게 반응하고 어떤 부작용을 발생시키는지 충분히 알고 있어야 합니다. 이러한 지식이 없다면 테스트에 잘못된 가정이 포함된 것입니다.

-알라딘 eBook <자바와 JUnit 활용한 실용주의 단위 테스트> (제프 랭어.앤디 헌트. 데이브 토머스 지음, 유동환 옮김) 중에서
반응형