Back-End/Spring 자료실

[Java 웹개발 마스터] #2. 테스트 주도 개발

Chipmunks 2020. 8. 8. 00:23
728x90


안녕하세요, 패스트캠퍼스에서 Java 웹개발 마스터 수강생입니다!

첫 번째 스프링 부트 프로젝트 파트에서 배운 테스트 주도 개발을 정리해보려고 합니다.


본격적으로 레스토랑 예약 사이트의 Rest API를 만들기 전에 테스트 주도 개발이 무엇인지 배웠다.

테스트 주도 개발(TDD, Test Driven Development)은 테스트 코드를 가장 먼저 만들어서 올바르게 작동하는 코드를 만들어내는 개발 방법 중 하나다.


TDD를 진행하는 사이클이 있는데, 바로 Red, Green, Refactoring 단계의 사이클로 이루어져 있다.



 

Red (테스트 실패) : 테스트 코드를 먼저 작성한다. 무조건 실패하는 테스트 코드를 작성한다.

Green (테스트 통과) : 모든 테스트가 통과할 수 있도록 코드를 변경한다.

Refactoring (리팩토링) : 메소드들의 로직을 개선하고 마지막에 모두 통과가 되는지 확인한다.

위 세 가지 과정을 계속해서 반복한다.

애플리케이션의 구조가 복잡하고 한 번 실행하는 데 아주 오래걸릴 때 도움이 많이 되는 개발 방식이다.


실습으로 바로 도메인 모델을 만들었다.

프레젠테이션 계층인 Interface 패키지와는 다른 domain 패키지를 만들었다.

domain/Restaurant.java 파일을 만들고 바로 테스트 코드를 만들었다.


여기서 Restaurant 클래스의 테스트 코드를 만들 때 인텔리제이 기능으로 쉽게 만들 수 있는데,

클래스명 우측 클릭 -> Go to -> Test -> Create New Test 로 생성할 수 있다.

맥 기준으로 Command + Shift + T 단축키로 테스트 클래스를 바로 만들 수 있다.


JUnit 4 버전을 기준으로 hamcrest 라이브러리 메소드로 테스트 코드를 작성한다.

클래스 이름은 RestaurantTests 으로 변경한다.


첫 번째로 Restaurant 라는 객체를 만들 수 있는지를 테스트했다.


1
2
3
4
5
@Test
public voic creation() {
    Restaurant restaurant = new Restaurant();
    assertThat(restaurant.getName(), is("Bob zip"));
}
cs


빨간 문자열로 뜨는 오류는 해당 메소드를 임포트하지 않았거나 구현하지 않아서다.

assertThat 자동 추천 임포트 목록이 뜨지 않고, is 의 임포트 목록이 너무 많아서 헷갈렸다.

Alt + Enter 로 Is.is 와 MatcherAssert.assertThat 을 임포트한다.


빨간 글자로 표기된 getName() 에 Alt + Enter 키로 메소드를 새로 생성한다.

처음에는 오류가 나타나도록 빈 문자열을 출력해준다.


테스트 코드를 실행하면 오류가 뜨는데, 오류 내용은 다음과 같다.


Expected: Bob zip

Actual: 


이 아래 또는 Click to see difference 는 커다란 데이터를 볼 때 유용하다.


기대 된 값은 "Bob zip" 이지만, 실제의 값은 "" 빈 문자열이다.

당연히 Restaurant 클래스에 아무 구현도 없으므로 테스트가 실패한다.

다시 getName()의 반환값을 Bob zip 으로 변경 후 실행하면 테스트가 성공한다.

이후 리팩토링으로 로직을 수정한다.


이름과 정보들을 반환하는 getName() 메소드와 getInformation() 메소드를 만들고 불변 지역변수를 만들어준다. 그리고 불변 지역변수를 초기화해줄 생성자를 만들어준다.

Command + Shift + 방향키로 메소드 정의와 메소드 구현 부분을 쉽게 위 아래로 옮길 수 있다.


다시 테스트 코드로 돌아가 테스트 메소드를 만들어 테스트를 진행한다.

테스트 코드는 Restaurant 클래스를 이용해서 프로그래밍을 할 미래의 고통을 지금으로 끌고 와 예방 접종을 하게 해준다.