728x90
세 번째 테스트: 숫자를 포함하지 않고 나머지 조건을 충족하는 경우
세 번째 테스트 메서드를 추가하자.
이번 테스트 대상은 숫자를 포함하지 않고 나머지 조건은 충족하는 암호이다.
이 암호도 보통 강도를 가져야 한다.
세 번째 테스트 코드 작성
@DisplayName("숫자 포함x, 나머지 조건 충족, 강도는 보통")
@Test
void meetsOtherCriteria_except_for_number_Then_Normal() {
PasswordStrengthMeter meter = new PasswordStrengthMeter();
PasswordStrength result = meter.meter("ab!@ABqwer");
assertThat(PasswordStrength.NORMAL).isEqualTo(result);
}
테스트를 실행하면 새로 추가한 테스트가 실패한 것을 알 수 있다.
이 테스트를 통과하는 방법은 어렵지 않다.
암호가 숫자를 포함했는지를 판단해서 포함하지 않은 경우 NORMAL을 리턴하게 구현하면 된다.
테스트를 통과시키기 위한 코드 추가
public class PasswordStrengthMeter {
public PasswordStrength meter(String s) {
if (s.length() < 8) {
return PasswordStrength.NORMAL;
}
// 여기부터 새로 추가함
boolean containsNum = false;
for (char ch : s.toCharArray()) {
if (ch >= '0' && ch <= '9') {
containsNum = true;
break;
}
}
if (!containsNum) {
return PasswordStrength.NORMAL;
}
//
return PasswordStrength.STRONG;
}
}
각 문자를 비교해서 0 ~ 9 사이의 값을 갖는 문자가 없으면 NORMAL을 리턴하도록 했다.
똑같이 따라했으면 모든 테스트가 통과할 것이다.
코드 리팩토링
코드를 조금 리팩토링하자.
숫자 포함 여부를 확인하는 코드를 메서드로 추출해서 가독성을 개선하고 메서드 길이도 줄여보자.
public class PasswordStrengthMeter {
public PasswordStrength meter(String s) {
if (s.length() < 8) {
return PasswordStrength.NORMAL;
}
boolean containsNum = meetsContainingNumberCriteria(s);
if (!containsNum) {
return PasswordStrength.NORMAL;
}
return PasswordStrength.STRONG;
}
private boolean meetsContainingNumberCriteria(String s) {
for (char ch : s.toCharArray()) {
if (ch >= '0' && ch <= '9') {
return true;
}
}
return false;
}
}
테스트 통과!
코드 정리: 테스트 코드 정리
세 개의 테스트 메서드를 추가했다. 다음과 같은 형태를 갖는다.
@Test
void 메서드이름() {
PasswordStrengthMeter meter = new PasswordStrengthMeter();
PasswordStrength result = meter.meter(암호);
assertThat(PasswordStrength.STRONG).isEqualTo(result);
}
테스트 코드도 코드이기 때문에 유지보수 대상이다.
중복을 알맞게 제거하거나 의미가 잘 드러나게 코드를 수정할 필요가 있다.
먼저 PasswordStrengthMeter 객체를 생성하는 코드의 중복을 없애보자.
private PasswordStrengthMeter meter = new PasswordStrengthMeter();
@DisplayName("암호가 모든 조건을 충족, 강도는 강함")
@Test
void meetsAllCriteria_Then_Strong() {
PasswordStrength result = meter.meter("ab12!@AB");
assertThat(PasswordStrength.STRONG).isEqualTo(result);
PasswordStrength result2 = meter.meter("abc1!Add");
assertThat(PasswordStrength.STRONG).isEqualTo(result2);
}
암호 강도 측정 기능을 실행하고 이를 확인하는 코드도 중복을 없애보자.
PasswordStrength result = meter.meter(암호);
assertThat(PasswordStrength.STRONG).isEqualTo(result);
이런 중복은 메서드를 이용해서 제거할 수 있다.
public class PasswordStrengthMeterTest {
private PasswordStrengthMeter meter = new PasswordStrengthMeter();
private void assertStrength(String password, PasswordStrength expStr) {
PasswordStrength result = meter.meter(password);
assertThat(expStr).isEqualTo(result);
}
@DisplayName("테스트 메서드 생성")
@Test
void name() {
}
@DisplayName("암호가 모든 조건을 충족, 강도는 강함")
@Test
void meetsAllCriteria_Then_Strong() {
assertStrength("ab12!@AB", PasswordStrength.STRONG);
assertStrength("abc1!Add", PasswordStrength.STRONG);
}
}
테스트 코드의 중복을 무턱대고 제거하면 안 된다.
중복을 제거한 뒤에도 테스트 코드의 가독성이 떨어지지 않고 수정이 용이한 경우에만 중복을 제거한다.
중복 제거 후 관리가 어려워지면 되돌려야 한다.
728x90
'Book Review > 테스트 주도개발 시작하기' 카테고리의 다른 글
[테스트 주도개발 시작하기] Chapter1: 암호 검사기 완료 (0) | 2023.04.15 |
---|---|
[테스트 주도개발 시작하기] Chapter1. TDD 시작(6): 암호 검사기 (0) | 2023.04.15 |
[테스트 주도개발 시작하기] Chapter1. TDD 시작(4): 암호 검사기 (0) | 2023.04.11 |
[테스트 주도개발 시작하기] Chapter1. TDD 시작(3): 암호 검사기 (0) | 2023.04.07 |
[테스트 주도개발 시작하기] Chapter1. TDD 시작(2): 암호 검사기 (0) | 2023.04.04 |