** just enough 의 의미 주목
즉 해당 테스트만을 통과하기 위한 최소한*(딱 그만큼의) 코드를 짠다 -> 빠른 그린(결과값)을 본후 리팩토링을 위해서
테스트 코드에 관한 의문
TDD(Test Driven Development)테스트 기반으로 테스트를 돌려 레드 - 그린 - 리팩토링 과정을 돌려 하나씩 설계해가는 개발법
1. 진짜 처음부터 null 싸인 부터 보면서 시작하던데 null 이 나올걸 아는데 굳이 레드를 보기 위해서 돌려야 하나라는 의문이 생김.
2. 여태까지 비교적 간단한 프로그래밍이나 식을 계산하는 식이라서 거의 식을 다 짜놓고 중간 값 확인용으로 사용함
따라서 그냥 메인 클래스에 식 적혀있고 그것을 복사해와서 테스트 코드 넣고 값 확인하고 다시 계속함
저렇게 하다가 식 한번 잘못세워서 끝 부분에 알아서 통째로 코드 다 지운 경험이 있음
일단 시킨대로 테스트코드 부터 작성한다 -> 빠른 그린을 보고 규칙을 찾는다.
좋은건 괜히 따라하라는게 아니므로 닥치고 시키는 데로 하는게 맞는 것 같으므로 일단 저렇게 시작한다.(내 방식이랄 것도 딱히 없으니 차피)
여태는 변수를 어떻게 가져올지 몰라서 매번 테스트페이지에서 변수하나당 테스트만들고 테스트하거나 같은 식이면 매번 변수를 수기로 바꿔 입력해줬다.
저게 무슨말이냐면 말그대로 메서드를 따로 만들거나 패러미터를 입력해주지 않아서 그때그때 해당하는 변수를 새로 선언하고 직접 인식되게했다 -> 그러니 앞테스트를 통과시켜도 이전테스트를 하려면 앞테스트 변수 값을 지워야함... -> 모든 테스트를 돌릴게 없음..(테스트가 결국 한 개 남으므로)
그래서 메소드화 시켜서 원하는 변수는 패러미터로 지정해준뒤 그 값을 assertEquals() 에 넣어서 값마다 비교함. (하나의 주제에 대해 여러 변수 테스트 가능하도록함)
class CalculateMoneyTest {
@Test
void moneyInneed() {
CalculateMoney calculateMoney = new CalculateMoney();
assertEquals(30, calculateMoney.getMoneyInNeed(3, 4));
assertEquals(9, calculateMoney.getMoneyInNeed(3, 2));
assertEquals(12, calculateMoney.getMoneyInNeed(2, 3));
}
이렇게 변수 값 다를때마다 하나의 주제에 대해서 테스트 가능
근데 메소드로 만드는 과정에서 메소드에서 사용되는 변수들을 필드화 시키거나 매개변수로 지정해야해서 메인클래스 전체식을 복사해 가져오는 것보다 고려할 게 많음
만든 메소드의 매개변수값은 직접 입력함으로서 위 과정 생략 -> 번거롭지 않음
테스트코드도 결국 테스트 클래스에서 식을 쓰는거라 테스트 클래스에서 인식 가능하도록 클래스에서 클래스 넘어올때 처럼 이어주는 구조를 짜워야함. 이게 결국 자바를 잘 못다루면 많이 헷갈리고 어려움 -> 그래서 내가 여태 안했나..?
하나의 식으로 여러 케이스에 대해 테스트 할 것이므로 식이 끝난후 초기화해주는 과정을 잊으면 안됨
이게 오늘 배운거...아니 분명 간단한 식인데 아무리 해도 이상한 값나와서 직접 똑같지만 변수만 바꾼식으로 여기저기 시도해보고 타입의 통일화가 안되서그런가 하며 애꿎은 상관없는 타입들 건드리고 ..난리남
public int getMoneyInNeed(int price, int count) {
moneyInNeed = 0;
for(int i = 1; i < count + 1; i += 1 ) {
int expression = price * i;
moneyInNeed += expression;
}
return moneyInNeed;
}
특정식의 돈을 구하는 식인데 메소드 밑의 moneyInNeed 를 0 으로 초기화 해주지 않으면 저 값이 다른 값을 구할때도 계속 중첩으로 쌓여서 첫 값말곤 다 이상한 값이 나옴
class CalculateMoneyTest {
@Test
void moneyInneed() {
CalculateMoney calculateMoney = new CalculateMoney();
int x = 2;
int y = 3;
int result = 0;
for(int i = 1; i < y + 1; i += 1 ) {
result += x * i;
}
assertEquals(12, result);
assertEquals(30, calculateMoney.getMoneyInNeed(3, 4));
assertEquals(9, calculateMoney.getMoneyInNeed(3, 2));
assertEquals(12, calculateMoney.getMoneyInNeed(2, 3));
}
원하는 값이 하도 안나와서 똑같은 식을 그대로 적어서 테스트 코드에 result 로 뽑아봄 -> 됨.. 원인은 초기화..
class CalculateMoneyTest {
@Test
void moneyInneed() {
CalculateMoney calculateMoney = new CalculateMoney();
int x = 2;
int y = 3;
int result = 0;
for(int i = 1; i < y + 1; i += 1 ) {
result += x * i;
}
assertEquals(12, result);
assertEquals(30, calculateMoney.getMoneyInNeed(3, 4));
assertEquals(9, calculateMoney.getMoneyInNeed(3, 2));
assertEquals(12, calculateMoney.getMoneyInNeed(2, 3));
}
요약
1. 레드 -> 그린 -> 리팩토링 (빠른 결과 값 보기)
2. 각 케이스별 테스트가 모두 통과해야함 ( 개별적으로 테스트 -> 다시 지우고 변수 값 넣고 테스트 x)
3. 그러기 위해선 메소드에 매개변수를 넣어주는 식으로 해야함.
4. 한번의 값을 구하는 경우가 아니라면 기존 값을 재실행할때 초기화 해주는 것 잊지말것
'개발공부하며 느낀 인생 공부' 카테고리의 다른 글
허세를 부리지말자[메가테라 4주차 주간회고] (0) | 2022.07.15 |
---|---|
인출학습 이렇게 하는거다![20220713 til] (0) | 2022.07.13 |
[Intellij] 인텔리제이 No such file or directory 문제 해결 (0) | 2022.07.11 |
동료가 내 점심을 가지고 til을 쓰라고 했다. 헤헿[220710 til] (0) | 2022.07.10 |
Java JUnit빌드시스템 용어 정리(빌드 시스템, Jar file, heap vs stack memory, 참조와 참조변수선언, gradle 명령어) (0) | 2022.07.10 |
댓글