[방법론] 테스트 주도 개발(TDD)
TDD
-
SpringBoot 테스트 코드
- @SpringBootTest 어노테이션을 통해 스프링부트 어플리케이션 테스트에 필요한 거의 모든 의존성을 제공한다.
- @RunWith 어노테이션은 JUnit 프레임워크가 테스트를 실행할 시(JUnit은 내장된 Runner를 테스트 시 실행하고 됨) 테스트 실행방법을 확장할 때 쓰는 어노테이션
-
TDD(Test Driven Development · 테스트 주도 개발) 3가지 절차
- 실패
- 실패하는 테스트 케이스를 먼저 만드는 것
- 상황에 따라 한번에 여러개를 만들어도 된다.
- 성공
- 실패하는 테스트 케이스를 통과시키기 위한 코드를 작성
- 리팩토링
- 중복되는 코드, 개성 할 코드에 대한 리팩토링 생각
- 실패
- 장점
- 작은 단위로 만들기 때문에 코드의 모듈화가 이뤄질 수 있다.
- 유지보수가 쉬워진다.
- 생각할 점
- 간단하다고 생각한 기능이라도 후에 유지 보수를 위해서 테스트가 있다면 좀 더 효율적일 듯 하다.
- 그러나 시간이 정해져 있고, 작은 기능을 빠르게 생산해야 하는 일이라면 굳이 작성을 하지 않아도 될듯하다.
- 테스트 코드를 먼저 만들고 개발을 시작하는게 습관이 되어 있지 않다면 처음에 작성하는게 쉽지 않을 수 있다고도 생각한다.
참고할만한 블로그 : https://dhsim86.github.io/web/2017/03/16/spring_boot_introduce-post.html
-
Junit5
JUnit5 = JUnit Platform + JUnit Jupiter + Junit Vintage
-
JUnit Platform : 테스트를 발견하고 테스트 계획을 생성하는 TestEngine 인터페이스를 가지고 있다. Platform은 TestEngine을 통해서 테스트를 발경하고 ,실행하고 ,결과를 보고한다.
-
JUnit Jupiter : TestEngine의 실제 구현체는 별도 모듈이다. 모듈 중 하나가 jupiter-engine이다. 이 모듈은 jupiter-api를 사용해서 작성한 테스트 코드를 발견하고 실행한다. Jupiter API는 JUnit 5에 새롭게 추가된 테스트 코드용 API로서, 개발자는 Jupiter API를 사용해서 테스트 코드를 작성할 수 있다.
-
JUnit Vintage : 기존에 JUnit 4 버전으로 작성한 테스트 코드를 실행할 때에는 vintage-engine 모듈을 사용한다.
-
기존 JUnit4는 JUnit라이브러리만 정의 해준면 되지만(All in one), 5의 경우 3개의 모듈로 나누어 져 있는것을 알 수 있다.
-
Junit 4의 경우 Java 5이상이여야 하며, JUnit 5의 경우는 Java 8이상이여야 한다.
-
달라진 부분
-
JUnit4의 경우 첫 번째 파라미터로 전달을 받았으나, JUnit5에서는 마지막 파라미터로 전달을 받는다.
-
// junit 4 assertEquals("meesage parameter", "expected value", "actual value"); // junit 5 assertEquals("expected value", "actual value", "meesage parameter");
-
JUnit5의 경우 람다를 사용할 수 있다.
-
assertTrue(1 == 1, () -> "Assertion messages can be provided by Java 8 Lambdas "); Throwable exception = expectThrows(IllegalArgumentException.class, () -> { throw new IllegalArgumentException("Invalid age."); });
- assumeNoException, assumeNotNull deprecated되었다.
-
-