2 분 소요


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"

카테고리: ,

업데이트:

댓글남기기