본문 바로가기

TDD

TDD, 테스트 코드의 구성 1. 상황 찾기 어떤 상황이 실행 결과에 영향을 줄 수 있는지 찾기 위한 노력 필요 다양한 예외 상황을 찾아내고 이를 코드에 반영해야 기능이 비정상적으로 동작하는 것을 막을 수 있음 2. 테스트 코드의 구성 요소 기능은 상황에 따라 달라 지기 때문에 상황(given), 실행(when) 결과 확인(then) 세 가지 요소로 테스트를 구성할 수 있음 JUnit에서 상황을 설정하는 방법은 테스트할 대상에 따라 달라짐 1) 각 테스트 메서드마다 객체를 생성해서 상황 설정 public class BaseballGameTest { @Test void exactMatch() { // given BaseballGame game = new BaseballGame("456"); // when Score score = ga.. 더보기
TDD 테스트 주도 개발, 기능 명세와 설계 1. 기능 명세 1) 다양한 형태의 요구사항 문서를 이용해서 기능 명세를 구체화함(입력과 결과를 도출) 2) 기능을 크게 입력과 결과 두 가지로 나눈다 - 입력: 보통 메소드의 파라미터로 전달 받음 - 결과: 여러 형식으로 정의, 리턴 값으로 보내주거나 Exeption 결과를 보내줄 수 있음 기능 명세 구체화를 돕는 TDD 개발자는 스토리보드나 와이어프레임 같은 형태로 요구사항을 전달 받지만 이런 문서는 개발자가 기능을 구현하기에 생략된 내용이 많음 테스트 코드를 작성하기 위해서는 파라미터, 결과값을 정해야하므로 기능을 입력과 결과로 도출 해야함 ex. 선불 1만원 지불 시 한달 이용 가능한 서비스의 만료일 구하기 Q. 4월 30일에 1만원 지불 시 5월 30일이 아닌 31일이 만료일이 맞는지? Q. 1.. 더보기
TDD 테스트 코드 작성 방법 1. 순서 정하기 1) 쉬운 경우에서 어려운 경우로 진행 2) 예외적인 경우에서 정상인 경우로 진행 *암호 검사기 연습 예제 순서를 보면 쉬운 경우에서 어려운 경우로 진행 됨 1. 모든 규칙 충족: 단순 값(Ex. 상수)을 리턴값으로 넣어서 테스트 -> 새로운 추가 테스트 넣어서 에러 발생 시 -> 상수 제거 후 일반화 2. 1번 규칙 미충족, 나머지 규칙 충족 3. 2번 규칙 미충족, 나머지 규칙 충족 4. 3번 규칙 미충족, 나머지 규칙 충족 5. Null이거나 값이 없는 문자열 -> 유효하지 않은 값 6. 1번 규칙 충족, 나머지 규칙 미충족 7. 2번 규칙 충족, 나머지 규칙 미충족 8. 3번 규칙 충족, 나머지 규칙 미충족 9. 모든 규칙 미충족 2. 예외 상황을 먼저 테스트 해야하는 이유 - .. 더보기
테스트 주도 개발 시작하기 - TDD 시작, TDD 암호 검사기 3 1. 일곱 번째 테스트 숫자 포함 조건만 충족하는 경우 1) 테스트 코드 작성 import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class PasswordStrengthMeterTest { private PasswordStrengthMeter meter = new PasswordStrengthMeter(); // 중복되는 코드, 필드에서 생성하도록 수정 private void assertStrength(String password, PasswordStrength expStr) { // 중복되는 코드.. 더보기
테스트 주도 개발 시작하기 - TDD 시작, TDD 암호 검사기 2 1. 네 번째 테스트 값이 없는 경우 - 예외상황을 고려하지 않으면 비정상 작동 - 값이 없는 경우에 대해서 알맞은 동작이 되도록 테스트 해야함 - 값이 없는 경우에는 어떻게 작동해야 할 지 고민 필요, IllegalArgumentException 발생 시키거나, 유효하지 않은 암호를 의미하는 PasswordStrength.INVALID를 리턴하게 할 수 있음(코드는 후자의 방법으로 진행) 1) 테스트 코드 추가 import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class PasswordStreng.. 더보기
테스트 주도 개발 시작하기 - TDD 시작, TDD 암호 검사기 1 구현할 기능: 암호 검사기 검사 규칙 길이가 8자 이상 0 ~9 숫자를 포함 대문자 포함 암호 강도 3개 규칙 모두 충족 시 암호는 강함 2개 규칙 충족 시 암호는 보통 1개 규칙 충족 시 암호는 약함 1. 첫 번째 테스트 가장 쉽거나 가장 예외적인 상황을 선택해야 함 모든 규칙을 충족하는 경우, 모든 조건을 충족하지 않은 경우 중 모든 규칙을 충족하는 경우를 먼저 테스트 왜? 모든 규칙을 충족시키지 않는 경우 테스트를 통과시키려면 각 조건을 검사하는 코드를 모두 구현해야 하므로 한 번에 만들어야 할 코드가 많아지고 시간이 길어짐 -> 사실상 구현을 다 하고 테스트 하는 방식과 큰 차별점이 없음 1) 테스트 코드 구현 import org.junit.jupiter.api.DisplayName; import.. 더보기
테스트 주도 개발 시작하기 - TDD 시작, TDD란 1. 기능을 검증하는 테스트 코드 작성 import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class CalculatorTest { @Test // @Test어노테이션을 붙인 plus()메소드를 테스트 메소드로 인식 void plus() { // 기능을 검증 할 plus()메소드 int sum = Calculator.plus(1, 2); // 계산 기능을 실행하는 코드 작성 assertEquals(3, sum); // 결과가 기대한 값인지 검증, assertEquals(기대값, 실제값) 두 값이 같지 않으면 AssertionFailedError 발생 } } Caculator.. 더보기