-
단위 테스트교육/우아한 테크 코스 2019. 5. 12. 13:14SMALL
개발을 어느정도 해가면서 제일 해보고 싶었던 개발 방법론 중 하나가 TDD 였다.
TDD란?
Test Driven Development (테스트 주도 개발) 테스트 코드를 먼저 짜고, 그 테스트 코드를 통과하기 위한 로직을 이후에 구현 하는 방법이다.
테스트 코드를 짜면 좋은 점은 여러가지 이유가 있겠지만 우선적으로 리팩토링에 시간 소모가 매우 적다.
테스트 코드가 없는 상태로 리팩토링을 진행할 시에는 매번 수작업으로 이상이 없는지를 테스트를 해야하는데 테스트 코드가 있으면 그 부분에서 수작업으로 진행해야 할 부분이 매우 적어진다.
오늘 다룰 부분은 여러 테스트(기능 테스트, 통합 테스트).. 에 기본이 되는 단위 테스트이다.
단위 테스트란?
단위 테스트(= 유닛 테스트) 란 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. - 유닛 테스트(위키백과)
단위테스트의 장점과 이러한 특징들은 대부분의 글, 책에서 확인을 할 수 있으니 여기서는 코드를 통해서 설명을 하겠다.
흔히 테스트를 위해 XUnix( Java의 경우 - JUnit) 라이브러리를 사용합니다. 이번 프로젝트에서는 JUnit 에서도 JUnit 5.4.2 버전을 사용하였다. 4버전과의 차이점으로는 5버전부터는 JUnit Platform, JUnit Jupiter, JUnit Vintage 모듈로 구분이 되었고, 자바 8 버전 이상을 요구한다.
이와 더불어서 JUnit에서 제공하는 assert 에는 불편한 점이 있어 assertJ를 이용하여 테스트를 진행할 것이다.
dependencies { testCompile('org.junit.jupiter:junit-jupiter:5.4.2') testCompile('org.assertj:assertj-core:3.11.1') }
단위테스트에서 우선 기본은 main/java 폴더와 test/java폴더 밑에 폴더 구조가 동일해야 인식을 한다.
또한 테스트 클래스의 컨벤션은 ~~Test 이다.
즉 main/java/racing/model - Car.java 파일이 있으면 test/java/racing/model/ - CarTest.java 파일이 있어야 한다.
Car에 대략적인 코드
1234567891011121314151617public class Car {private final static int MAX_NAME_LENGTH = 5;private final String name;private int position;public Car(String name) {this(name, 0);}public Car(String name, int position) {if ("".equals(name) || name.length() > MAX_NAME_LENGTH || position < 0) {throw new IllegalArgumentException();}this.name = name;this.position = position;}이 코드에서는 결국 name과 position이 원하는 조건에 만족을 하지 않으면 Exception을 던진다.
평소같으면 console로 직접 Car에 들어갈 name, position을 직접 일일이 적어보며 Exception이 나오는지 확인을 할 것이다.
123456789101112131415161718192021222324252627public class CarTest {@Testvoid create_name() {assertThat(new Car("pobi").equals(new Car("pobi"))).isEqualTo(true);}@Testvoid create_name_blank() {assertThrows(IllegalArgumentException.class, () -> {new Car("");});}@Testvoid create_name_5자_초과() {assertThrows(IllegalArgumentException.class, () -> {new Car("pobing");});}@Testvoid create_position_음수(){assertThrows(IllegalArgumentException.class, () ->{new Car("pobi", -1);});}위에 처럼 Test 코드를 짤 수 있고, 각 예외상황별로 세세하게 짠다.
생성자에서 조건을 blank 일 때, 5자가 초과가 될 때, position이 0보다 작을 때, 정상적으로 만들어질 때 총 4가지 케이스에 대해 테스트를 진행한다.
테스트 코드의 메서드 명을 보면 한글이 보이는데, 포비가 말하길, 테스트 코드는 결국 실제 배포시에는 올라가지 않을 뿐더러 팀원들이 모두 한국일 경우에는 영어로 이상하게 번역하는것 보다는 의미가 통하는게 우선이라고 했다.
또한 테스트 코드에 확인할 코드들을 무분별하게 할 것이 아닌 경계값을 기준으로 테스트를 진행하라고 했다.
예를들어 분기문(if)를 기준으로 처리를 진행하는데,
if (position > 0 || position < 10)
이러한 부분이 있으면 테스트를 진행할 때 position에 0,1,2,3,4,5,6,7,8,9,10 모두 넣어서 테스트를 할 수 있겠지만 이럴 경우에는 낭비이고 적절하게 0,1,9,10 일 때 정도 즉 경계값 정도 테스트를 하는 것이 좋다.
이렇게 든든하게 테스트 코드를 잘 작성해 놓으면 리팩토링이 무섭지 않다.
LIST'교육 > 우아한 테크 코스' 카테고리의 다른 글
[2주차 미션] 후기 및 피드백 (0) 2019.05.27 [1주차 미션] 후기 및 피드백 (0) 2019.05.24 코드 컨벤션 (0) 2019.05.10 우아한 테크코스 채용과정에 대한 소개와 느낀점 (0) 2019.05.09