주의사항
- 노션에서 작성 후 티스토리에 붙여넣어서 들여쓰기가 적용되지 않은 경우가 많음
- junit 4.12버전
Do it 자바 프로그래밍의 마지막 챕터 학점 산출 프로그램을 활용해 TDD와 람다 및 스트림을 사용해보려 한다.
책은 도서관에서 빌리거나 이지스 퍼블리싱 홈페이지에 가면 코드가 있으니 참조하면 되지만 설명없이 코드만 봐선 이해하기 쉽지 않다.
이 방식이 정답은 아니며 구현 방식에 관한 지적은 환영합니다!
TDD 순서
테스트코드 생성 → 실패 → 보완 → 성공 순으로 진행한다.
클래스를 생성하지 않고 테스트코드 먼저 작성하고 클래스 미생성으로 실패한 후 클래스를 만들고 다시 성공하는 과정이다.
테스트 전 준비사항
핵심은 무엇을 테스트 할 것인가?
큰틀에서 보자면 학생이름 과목 점수를 입력받아 학점을 산출하는 테스트를 하면 된다.
학생, 점수, 과목 클래스가 필요하니 각 클래스별 테스트를 진행하면 된다.
책에 클래스별 필요한 변수가 적혀있으니 참조해서 작성해보자
클래스 테스트
무엇을 테스트 해야 하는지 감을 잡기 어려우니 우선 클래스먼저 테스트하자
@Test
public void 클래스테스트(){
Student student = new Student();
}
클래스를 생성하지 않고 테스트를 진행하니 에러가 떳고 에러를 해결한 후(클래스를 생성한 후) 다시 실행하자.
위와 같은 방식으로 필요한 클래스 3개를 테스트 후 생성하자
@Test
public void 클래스테스트(){
Student student = new Stduent();
Subject subject = new Subject();
Score score = new score();
}
현재 3개의 클래스 모두 빈 클래스인 상태다.
학점 계산 테스트
다음 테스트는 무엇을 해야할까? 꼭 학점 계산 테스트를 먼저 진행할 필요는 없지만 가장 먼저 보이기 때문에 학점 계산 테스트부터 진행한다.
책의 제약조건은 필수과목과 일반과목의 학점을 다르게 구현하는것이다.
시작부터 모든걸 구현하기는 쉽지 않으니 우선 점수를 입력받고 학점을 산출하는 테스트부터 진행하자.
우선 만들어놓은 점수 클래스를 통해 점수를 입력받고 학점을 산출해보자
@Test
public void 학점테스트(){
Score score1 = new Score(50);
}
Score가 빈 클래스기 때문에 위 코드는 에러가 발생하니 생성자를 생성하고 다시 실행하자.
public class Score{
private int point;
public Score(int point){
this.point = point;
}
}
Score에 point라는 변수를 추가한 뒤 실행해도 에러가 발생한다.
바로 클래스 테스트에 선언한 new Score(); 때문이다. 이 클래스에도 숫자값을 넘김으로써 에러를 해결하자.
이후부터는 클래스 코드는 생략하고 테스트 코드 위주로 작성한다. 생략하더라도 테스트코드 작성후 실패 → 클래스코드 작성의 절차는 유지해야한다!
import 참조
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
그 후 계산할 학점을 생성한다.
@Test
public void 학점테스트(){
Score score1 = new Score(50);
int point = score1.getPoint();
}
이제 학점 계산을 진행해보자
@Test
public void 학점테스트(){
Score score1 = new Score(90);
int point = score1.getPoint();
String grade;
if(point >= 90 && point <= 100){
grade = "A";
assertThat("A",equalTo(grade));
}
}
테스트 리팩토링
나머지 학점도 기입하고 여기까지 완료했으면 테스트코드를 리팩토링하자
매번 클래스를 생성할 순 없으니 클래스를 Before어노테이션으로 옮긴다.
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
public class StudentTest{
private Student student;
private Subject subject;
private Score score;
@Before
public void 학생및과목점수생성(){
student = new Student();
subject = new Subject();
score = new Score(50);
}
@Test
public void 학점테스트(){
int point = score.getPoint();
String grade;
if(point >= 90 && point <= 100){
grade = "A";
assertThat("A",equalTo(grade));
}
}
}
옳긴 후 테스트를 실행한다.
학점 계산 테스트를 클래스로 옮기기
이 순서로 진행할 필요는 없지만 책을 보니 가장 만만해 보이니 진행한다.
학점 계산을 테스트코드에 직접 적는 것 보다 점수를 넣으면 자동으로 학점값이 리턴되는 편이 좋기 때문에 수정을 진행한다.
책에 따르면 일반 과목 학점과 필수 과목 학점의 계산 방식이 다르기 때문에 학점 계산 인터페이스를 생성 후 과목 별 계산기를 생성한다.
물론 클래스부터 생성하는 것이 아니라 테스트 코드부터 작성한다. 중간과정은 스킵하겠다.
스킵 하기전 간단하게 설명하자면
public class StudentTest{
private Student student;
private Subject subject;
private Score score;
private BasicEvalution basicEvalution;
private MajorEvalution majorEvalution;
@Before
public void 생성자(){
student = new Student();
subject = new Subject();
score = new Score(50);
basicEvalution = new BasicEvalution;
majorEvalution = new majorEvalution;
}
이렇게 테스트 코드를 먼저 작성 후 실행하고 GradeEvalution을 구현한 BasicEvalution과 MajorEvalution클래스를 생성하면 된다.
최종 테스트코드
public class StudentTest{
private Student student;
private Subject subject;
private Score score;
private BasicEvalution basicEvalution;
private MajorEvalution majorEvalution;
@Before
public void 생성자(){
student = new Student();
subject = new Subject();
score = new Score(55);
basicEvalution = new BasicEvalution();
majorEvalution = new MajorEvalution();
}
@Test
public void 학점테스트(){
String basic = basicEvalution.getGrade(score.getPoint());
String major = majorEvalution.getGrade(score.getPoint());
assertThat("D",equalTo(basic));
assertThat("F",equalTo(major));
}
}
'TDD > 학점 산출 프로그램' 카테고리의 다른 글
TDD로 학점 산출 프로그램 #2 (학생클래스, 디테일) (0) | 2021.07.30 |
---|