[Spring MVC] JUnit 단위 테스트 실습
1. StampCalculator 클래스에 대한 단위 테스트 케이스 작성
StampCalculatorTest 클래스 내에 두 개의 테스트 케이스를 JUnit을 사용해서 작성
JUnit의 Assertion 메서드를 사용하려면
import static *org.junit.jupiter.api.Assertions*
… 을 사용해야한다.
calculateStampCountTest()
// 수정 전 코드
private static void calculateStampCountTest() {
// given
int nowCount = 5;
int earned = 3;
// when
int actual = StampCalculator.calculateStampCount(nowCount, earned);
int expected = 7;
// then
System.out.println(expected == actual);
}
// JUnit 수정 후
@DisplayName("실습1: 스탬프 카운트 계산 단위 테스트")
@Test
public void calculateStampCountTest() {
// given
int nowCount = 5;
int earned = 3;
// when
int actual = StampCalculator.calculateStampCount(nowCount, earned);
int expected = 7;
// then
assertEquals(expected, actual);
}
calculateEarnedStampCountTest()
// 수정 전
private static void calculateEarnedStampCountTest() {
// given
Order order = new Order();
OrderCoffee orderCoffee1 = new OrderCoffee();
orderCoffee1.setQuantity(3);
OrderCoffee orderCoffee2 = new OrderCoffee();
orderCoffee2.setQuantity(5);
order.setOrderCoffees(List.of(orderCoffee1, orderCoffee2));
int expected = orderCoffee1.getQuantity() + orderCoffee2.getQuantity();
// when
int actual = StampCalculator.calculateEarnedStampCount(order);
// then
System.out.println(expected == actual);
}
// JUnit 수정 후
@Test
@DisplayName("실습1: 주문 후 누적 스탬프 카운트 계산 단위 테스트")
public void calculateEarnedStampCountTest(){
Order order = new Order();
OrderCoffee orderCoffee1 = new OrderCoffee();
orderCoffee1.setQuantity(3);
OrderCoffee orderCoffee2 = new OrderCoffee();
orderCoffee2.setQuantity(5);
order.setOrderCoffees(List.of(orderCoffee1, orderCoffee2));
int expected = orderCoffee1.getQuantity() + orderCoffee2.getQuantity();
int actual = StampCalculator.calculateEarnedStampCount(order);
assertEquals(expected, actual);
}
2. RandomPasswordGenerator 클래스의 단위 테스트 케이스 작성
RandomPasswordGenerator 클래스의 generate() 메소드는 회원이 로그인 패스워드를 분실했을 경우, 임시 패스워드를 랜덤으로 생성하는 기능.
int numberOfUpperCaseLetters
: 생성될 패스워드 문자열에서 알파벳 대문자의 개수int numberOfLowerCaseLetters
: 생성될 패스워드 문자열에서 알파벳 소문자의 개수int numberOfNumeric
: 생성될 패스워드 문자열에서 0 이상인 숫자의 개수int numberOfSpecialChars
: 생성될 패스워드 문자열에서 특수문자의 개수
@DisplayName("실습 3: 랜덤 패스워드 생성 테스트")
@Test
public void generateTest() {
int numberOfUpperCaseLetters = 2;
int numberOfLowerCaseLetters = 5;
int numberOfNumeric = 2;
int numberOfSpecialChars = 1;
String password = RandomPasswordGenerator.generate(
numberOfUpperCaseLetters,
numberOfLowerCaseLetters,
numberOfNumeric,
numberOfSpecialChars
);
int findUpper = 0;
int findLower = 0;
int findNumeric = 0;
int findSpecial = 0;
for(int i=0; i<password.length(); i++){
char find = password.charAt(i);
if (find >= 'A' && find <= 'Z') findUpper++;
else if (find >= 'a' && find <= 'z') findLower++;
else if (find >= '0' && find <= '9') findNumeric++;
else findSpecial++;
}
assertEquals(numberOfUpperCaseLetters, findUpper);
assertEquals(numberOfLowerCaseLetters, findLower);
assertEquals(numberOfNumeric, findNumeric);
assertEquals(numberOfSpecialChars, findSpecial);
}
추가 학습 (Hamcrest)
Hamcrest는 JUnit 기반의 단위 테스트에서 사용할 수 있는 Assertion Framework이다.
Hamcrest를 사용하는 이유
- Assertion을 위한 Matcher가 자연스러운 문장으로 이어지므로 가독성이 향상 된다.
- 테스트 실패 메시지를 이해하기 쉽다.
- 다양한 Matcher를 제공한다.
JUnit → Hamcrest
// JUnit Assertion
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class HelloJunitTest {
@DisplayName("Hello Junit Test")
@Test
public void assertionTest1() {
String actual = "Hello, JUnit";
String expected = "Hello, World";
assertEquals(expected, actual);
}
}
// Hamcrest Assertion
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
public class HelloHamcrestTest {
@DisplayName("Hello Junit Test using hamcrest")
@Test
public void assertionTest1() {
String expected = "Hello, JUnit";
String actual = "Hello, World";
assertThat(actual, is(equalTo(expected)));
}
}
실행 결과 메시지 차이
// JUnit Assertion
expected: <Hello, World> but was: <Hello, JUnit>
Expected :Hello, World
Actual :Hello, JUnit
// Hamcrest Assertion
Expected: is "Hello, World"
but: was "Hello, JUnit"
댓글남기기