Upload
-
View
217
Download
3
Embed Size (px)
DESCRIPTION
TDD with JUnit 1 We are the Java Experts 스터디 자료
Citation preview
TDD with JUnitTestDrivenDevelopment
Junyoung Lee
대개����������� ������������������ 우리는
개발을����������� ������������������ 하고
테스트를����������� ������������������ 합니다.
잘����������� ������������������ 돌아가나
?
개발 기간이 길어질 수록 개발자의 목표의식이 흐려진다작업이 길어질 수록 확인이 어렵다개발자의 집중력이 필요해진다논리적인 오류를 찾기 어렵다
코드의 사용 방법과 변경 이력을개발자의 기억에 의존하게 된다
귀차니즘의 증가로 테스트를 간소화 하게 된다코드 수정 시 정상 동작을 보장하기 어렵다
테스트를 해보려면 변경 등의 선행 작업이 필요회귀 테스트가 희귀 테스트가 되기 쉽다개발자의 노동력을 필요로 하게 된다
- 테스트 주도 개발 TDD 실천법과 도구 중
TDD에서는
테스트를����������� ������������������ 작성하고,
개발을����������� ������������������ 합니다.
코드도����������� ������������������ 없는데����������� ������������������ 무슨����������� ������������������ 테스트를����������� ������������������ 먼저?
TDD
Need무엇을 테스트 할 것인가?
Test실패하는 테스트 작성
Code테스트를 통과하는 코드 작성
Refactoring코드의 중복 제거
TDD Flow
Simple CodeRon jeffries said “Clean code that works”
예측 가능한 개발 방법이다끊임없이 발생할 버그에 대해 걱정하지 않고
일이 언제 마무리 될 지 알 수 있다코드가 가르쳐주는 모든 교훈을 학습할 기회를 갖게 된다당신이 만든 소프트웨어는 사용자의 삶을 향상시켜 준다
동료들이 당신을 존경할 수 있게 해준다당신 또한 동료들을 존경할 수 있게 된다
작성하는 동안 기분이 좋다
- 테스트 주도 개발 중
Getting����������� ������������������ started����������� ������������������ TDDwith����������� ������������������ JUnit
Eclipse를 사용할 겁니다.
JUnit 라이브러리를 받습니다.
프로젝트의 빌드 패스에 추가합니다.
시작해 봅시다.
환경 설정
이 정도는 스샷 없어도 되겠쪙?
두 날짜의 일 수 차이를 구하는프로그램을 작성해 봅시다.
20140314 - 20140310 = 4
예제 출처 - https://wikidocs.net/224
테스트����������� ������������������ 케이스����������� ������������������ 작성
1. 두 날짜의 차이 일 수를 구한다.
2. 특정 일자의 총 일 수를 구한다.
3. 전년도까지의 총 일수를 구한다. <
4. 전달까지의 총 일수를 구한다.
5. 해당 일자까지의 총 일 수를 구한다.
테스트����������� ������������������ 코드����������� ������������������ 작성
public class SubDateTest extends TestCase{ public static void main(String[] args) { junit.textui.TestRunner.run(SubDateTest.class); } public void testGetYearDay() { assertEquals(0, SubDate.getYearDay(1)); assertEquals(365, SubDate.getYearDay(2)); }}
아직 SubDate는 존재하지 않습니다.
왜냐구요?
이제����������� ������������������ 만들거니까요.
슬슬����������� ������������������ 적응하세요.
일단!����������� ������������������ 컴파일을����������� ������������������ 성공하게����������� ������������������ 하기����������� ������������������ 위해서
public class SubDate { public static int getYearDay(int year) { return 1; }}
테스트����������� ������������������ 결과는?성공할����������� ������������������ 수����������� ������������������ 있을리가����������� ������������������ 없죠.
테스트를����������� ������������������ 성공시켜����������� ������������������ 봅시다.
public static int getYearDay(int year) { if (year == 1) return 0; return 365;}
짜자잔~
가장 빨리 테스트를 통과하는
코드를 만들어라.
어떤 죄악을 저질러도 상관없다.
- Kent Beck
아직����������� ������������������ getYearDay는완전하지����������� ������������������ 않습니다.
아래����������� ������������������ 테스트는����������� ������������������ 실패하겠죠
assertEquals(365+365+365+366, SubDate.getYearDay(5));
public void testLeapYear() { assertTrue(SubDate.isLeapYear(0)); assertFalse(SubDate.isLeapYear(1)); assertTrue(SubDate.isLeapYear(4));}
윤년도����������� ������������������ 고려해야겠죠?윤년을����������� ������������������ 위한����������� ������������������ 테스트����������� ������������������ 코드����������� ������������������ 작성
윤년����������� ������������������ 계산����������� ������������������ 코드����������� ������������������ 작성
ublic static boolean isLeapYear(int year) { if (year == 0) return true; if (year == 1) return false; if (year == 4) return true; return false;}
public static boolean isLeapYear(int year) { if (year % 4 == 0) return true; return false;}
리팩토링
윤년����������� ������������������ 체크����������� ������������������ 메서드도����������� ������������������ 완전하진����������� ������������������ 않습니다.
1. 4로 나누어서 떨어지는 해는 윤년이다.
2. 100으로 나누어서 떨어지는 해는 윤년이 아니다.
3. 400으로 나누어서 떨어지는 해는 윤년이다.
public void testLeapYear() { assertTrue(SubDate.isLeapYear(0)); assertFalse(SubDate.isLeapYear(1)); assertTrue(SubDate.isLeapYear(4)); assertTrue(SubDate.isLeapYear(1200)); assertFalse(SubDate.isLeapYear(700));}
테스트����������� ������������������ 코드����������� ������������������ 수정
getLeapYear����������� ������������������ 수정
public static boolean isLeapYear(int year) { if (year % 400 == 0) return true; if (year % 100 == 0) return false; if (year % 4 == 0) return true; return false;}
assertEquals(365+365+365+366, SubDate.getYearDay(5));
윤년을����������� ������������������ 고려한����������� ������������������ 테스트����������� ������������������ 코드
public static int getYearDay(int year) { int result = 0; for (int i = 1; i < year; i++) { if (isLeapYear(i)) result += 366; else result += 365; } return result;}
윤년을����������� ������������������ 고려한����������� ������������������ getYearDay
지금까지 한 것들을정리해 봅시다.