테스트코드 작성하기(2)
안녕하세요~ 오늘은 테스트 코드를 작성하는 2번째 포스팅입니다!

첫번째 포스팅에서는 위 코드를 작성하고 마무리를 지었습니다!
이어서 작성해보겠습니다!!
먼저 작성할 코드는
@DisplayName("비밀번호가 8자 미만 또는 12자 초과하는 경우 IllegalArgumentException 예외가 발생한다.")
@Test
void validatePasswordTest2() {
assertThatCode(() -> PasswordValidator.validate('aabb'))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("비밀번호는 최소 8자 이상 12자 이하여야 한다.");
}
이런식으로 작성해주려고 합니다!
위와 같이 작성할 경우 IllegalArgumentException 예외가 발생합니다!!
저희는 지금 비밀번호 8자 미만 12자 초과하는 경우를 조건으로 주고 있기 때문에 위와 같이 테스트 코드를 작성해주었습니다!
그리고 assertj를 통해 테스트를 진행하고 있습니다!
위와 동일한 조건에 비밀번호를 입력한다면 맨아래줄에 기재된것같이 비밀번호 최소 8자 이상 12자 이하여야한다는 메시지를 띄워줍니다!!
그리고 여기서 한가지 알아주셔야할점이 테스트를 할경우 경계값으로 테스트 하는게 제일 확실합니다
그래서 경계값으로 다시 테스트 해보려고합니다!!!
테스트 전에 의존성을 하나 추가하겠습니다!
testImplementation('org.junit.jupiter:junit-jupiter-params:5.10.0')
그리고
위에 넣어주었던 소스를 아래와 같이 수정해줍니다!
@DisplayName("비밀번호가 8자 미만 또는 12자 초과하는 경우 IllegalArgumentException 예외가 발생한다.")
@ParameterizedTest
@ValueSource(strings = {"aabbcce", "aabbccddeef"})
void validatePasswordTest2(String password) {
assertThatCode(() -> PasswordValidator.validate(password))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("비밀번호는 최소 8자 이상 12자 이하여야 한다.");
}
여기서 ParameterizedTest를 이용하여 아래 제가 작성해준것처럼 value를 넣어줄수도 있고 csv소스와 csvfile소스를 넣어줄수도 있습니다!
그리고 의존성 하나를 더 추가해보겠습니다!
implementation('org.passay:passay:1.6.1')
위와 같이 의존성을 추가해줍니다!
위 의존성은 패스워드를 생성해줄때 사용하려고 합니다!!
★테스트하기쉬운 코드를 작성하면 결합도가 낮아진다!
그리고 클래스로 RandomPasswordGenerator라는 클래스를 추가해주려고 합니다!!
추가를 해주고 아래와 같이 코드를 작성해줍니다.
package org.example;
import org.passay.CharacterData;
import org.passay.CharacterRule;
import org.passay.EnglishCharacterData;
import org.passay.PasswordGenerator;
public class RandomPasswordGenerator{
/**
* Special characters allowed in password
*/
public static final String ALLOWED_SPL_CHARACTERS = "!@#$%^&*()_+";
public static final String ERROR_CODE = "ERRONEOUS_SPECIAL_CHARS";
public String generatePassword(){
PasswordGenerator gen = new PasswordGenerator();
CharacterData lowerCaseChars = EnglishCharacterData.LowerCase;
CharacterRule lowerCaseRule = new CharacterRule(lowerCaseChars);
lowerCaseRule.setNumberOfCharacters(2);
CharacterData upperCaseChars = EnglishCharacterData.UpperCase;
CharacterRule upperCaseRule = new CharacterRule(lowerCaseChars);
lowerCaseRule.setNumberOfCharacters(2);
CharacterData digitChars = EnglishCharacterData.Digit;
CharacterRule digitRule = new CharacterRule(digitChars);
digitRule.setNumberOfCharacters(2);
CharacterData specialChars = new CharacterData() {
public String getErrorCode() {
return ERROR_CODE;
}
public String getCharacters() {
return ALLOWED_SPL_CHARACTERS;
}
};
CharacterRule splCharRule = new CharacterRule(specialChars);
splCharRule.setNumberOfCharacters(2);
return gen.generatePassword(int)(Math.random() * 13), splCharRule, lowerCaseRule, upperCaseRule,
}
}
위 소스는 0부터 12자리까지의 랜덤 패스워드를 생성해주는 메소드 입니다!!
이제 테스트할 상황을 만들기 위해서 User라는 클래스를 만들어 보겠습니다!!
package org.example;
public class User {
private String password;
public void initPassword() {
RandomPasswordGenerator randomPasswordGenerator = new RandomPasswordGenerator();
String randomPassword = randomPasswordGenerator.generatePassword();
/**
* 비밀번호는 최소 8자 이상 12자 이하여야 한다.
*/
if (randomPassword.length() >= 8 && randomPassword.length() <= 12){
this.password = randomPassword;
}
}
}
User라는 클래스를 만든뒤 위와 같이 소스를 작성해줍니다!!
위와같이 작성을 완료하셨으면
User에 대한 테스트 메서드를 하나 만들어 줘야합니다!!
UserTest라고 생성해줍니다!!
User 클래스에서 User에 커서를 가져다놓고 windows 기준으로 alt + insert를 누르시면 Test라고 있습니다!!
그것을 이용해서 만들어 주시면 될거같습니다!!
만들고 나서
package org.example;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class UserTest {
@DisplayName("패스워드 초기화한다.")
@Test
void passwordTest() {
User user = new User();
user.initPassword();
}
}
위와 같이 작성하여 줍니다!!
작성해주고 다시 User 클래스로 가줍니다!!
package org.example;
public class User {
private String password;
public void initPassword() {
RandomPasswordGenerator randomPasswordGenerator = new RandomPasswordGenerator();
String randomPassword = randomPasswordGenerator.generatePassword();
/**
* 비밀번호는 최소 8자 이상 12자 이하여야 한다.
*/
if (randomPassword.length() >= 8 && randomPassword.length() <= 12){
this.password = randomPassword;
}
}
public String getPassword() {
return password;
}
}
맨 아래에 getter를 위와 같이 추가해줍니다!!
그리고 나서 UserTest로 다시 가줍니다!!
package org.example;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
class UserTest {
@DisplayName("패스워드 초기화한다.")
@Test
void passwordTest() {
// given
User user = new User();
//when
user.initPassword();
//then
assertThat(user.getPassword()).isNotNull();
}
}
그리고 then부분을 추가해줍니다!!
그리고 실행해보시면 에러가 나올경우도 있고 성공이 나오는 경우도 있습니다!
그이유는 바로 random으로 글자 수가 나오기 때문입니다!!
저희가 위에서 입력해준 값은 0~12자리까지 나오게 하였기 때문입니다!!
그리고
이제 Generater를 컨트롤 할수있게끔 interface를 하나 만들어 보겠습니다!!
package org.example;
public interface PasswordGenerator {
String generatePassword();
}
위와 같이 작성해줍니다!!
다음으로
위와 같이 RandomPasswordGenerator에 implements 시켜줍니다!!
다음으로
User클래스를 수정해줍니다!!
package org.example;
public class User {
private String password;
public void initPassword(PasswordGenerator passwordGenerator) {
//RandomPasswordGenerator randomPasswordGenerator = new RandomPasswordGenerator();
String password = passwordGenerator.generatePassword();
/**
* 비밀번호는 최소 8자 이상 12자 이하여야 한다.
*/
if (password.length() >= 8 && password.length() <= 12){
this.password = password;
}
}
public String getPassword() {
return password;
}
}
이런식으로 수정한뒤
CorrectFixedPasswordGenerator를 만들어줍니다!!
package org.example;
public class CorrectFixedPasswordGenerator implements PasswordGenerator{
public String generatePassword(){
return "abcdefgh"; //8글자
}
}
고정길이에 대한 클래스라고 생각하시면 될거 같습니다!!
위와 같이 UserTest에 위에서 만든 CorrectFixedPasswordGenerator를 선언해줍니다!!
그러면 앞으로 8자리만 들어오게 됩니다!!
위 소스 테스트해보니 잘되네요 ㅎㅎㅎ
오늘 포스팅은 여기까지 하겠습니다!!
다들 좋은 밤 보내세요! 감사합니다!
