๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Test

JUnit5 - JUnit ํ™˜๊ฒฝ ์„ธํŒ…๊ณผ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ

by Leica 2021. 9. 13.
๋ฐ˜์‘ํ˜•

 

๐Ÿ’ฌ <์ž๋ฐ”์™€ JUnit์„ ํ™œ์šฉํ•œ ์‹ค์šฉ์ฃผ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ> ์ฑ…์„ ํ†ตํ•ด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€๋‹ค.

 

์ฒซ ๋ฒˆ์งธ JUnit ํ…Œ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ (p26 ~ p39)

๐Ÿ’ฌ ์ฑ…์— ๋‚˜์™€์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ•˜๊ธฐ ์œ„ํ•ด IntelliJ์—์„œ java 11 ๋ฒ„์ „์˜ gradle ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ์ฑ…์˜ ์˜ˆ์ œ์—์„œ๋Š” java 8์˜ stream์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์—ฐ์Šต์šฉ ํ”„๋กœ์ ํŠธ์˜ jdk๋„ 8 ์ด์ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ

๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์ฝ”๋“œ์ด๋‹ค.

 

๐Ÿ“„ Scoreable.java

@FunctionalInterface
public interface Scoreable {
    int getScore();
}

 

โœ๏ธ ์ฐธ๊ณ  - @FunctionalInterface
@FunctionalInterface๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค์ž„์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์• ๋…ธํ…Œ์ด์…˜์ด๋‹ค.
ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์˜ค๋กœ์ง€ ํ•˜๋‚˜์˜ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ–๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
์ž๋ฐ” API์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋Š” Comparator, Runnable ๋“ฑ์ด ์žˆ๋‹ค.
@FunctionalInterface๋ฅผ ๋ถ™์˜€์ง€๋งŒ ์‹ค์ œ๋กœ ํ•จ์ˆ˜ํ˜• ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ฉด, ์ฆ‰ ์ถ”์ƒ ๋ฉ”์†Œ๋“œ๊ฐ€ 1๊ฐœ๋ฅผ ์ดˆ๊ณผํ•˜๋ฉด ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

๐Ÿ“„ ScoreCollection.java

public class ScoreCollection {

    private List<Scoreable> scores = new ArrayList<>();

    public void add(Scoreable scoreable) {
        scores.add(scoreable);
    }

    public int arithmeticMean() {	// ์‚ฐ์ˆ  ํ‰๊ท 
        int total = scores.stream().mapToInt(Scoreable::getScore).sum();
        return total / scores.size();
    }
}

 

ScoreCollection์˜ add() ๋ฉ”์†Œ๋“œ๋Š” Scoreable ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ , Scoreable ์ธํ„ฐํŽ˜์ด์Šค๋Š” intํ˜• score ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿ’ฌ arithmetic mean์ด๋ผ๋Š” ์–ดํœ˜๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ์‚ฌ์ „ ๊ฒ€์ƒ‰์„ ํ•ด๋ดค๋”๋‹ˆ '์‚ฐ์ˆ  ํ‰๊ท ' ์ด๋ผ๋Š” ๋œป์ด์˜€๋‹ค. ๋ฉ”์†Œ๋“œ ์šฐ์ธก์— ์ฃผ์„์œผ๋กœ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

 

์˜์กด์„ฑ ์„ค์ • ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ฒ€์ฆ

ํ”„๋กœ์ ํŠธ์— JUnit์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ธํŒ…ํ•˜๊ณ  ํ™•์ธํ•ด๋ณด์ž.

 

ScoreCollection์˜ JUnit ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

JUnit ๋ฒ„์ „์€ ์ฑ…์—์„œ๋Š” 4๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‚ด ์‹ค๋ฌด ํ™˜๊ฒฝ์—์„œ๋Š” 5๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ๋” ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— 5๋กœ ์„ ํƒํ–ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ์˜ ์˜์กด์„ฑ ์„ค์ •์„ JUnit5๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  AssertJ์˜ assert๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด assertj-core๋„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

 

๐Ÿ“„ build.gradle

dependencies {
    testCompile group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.2'
    testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.20.2'
}

 

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋Š” src/test ํ•˜์œ„์— ์ƒ์„ฑํ•œ๋‹ค.

 

๐Ÿ“„ ScoreCollectionTest.java

import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.fail;

class ScoreCollectionTest {

    @Test
    void test() {
        fail("Not yet implemented.");
    }
}

JUnit์€ @Test ์• ๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ํ…Œ์ŠคํŠธ๋กœ ์‹คํ–‰ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค์—๋Š” @Test๊ฐ€ ๋ถ™์ง€ ์•Š์€ ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ๋„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ JUnit์€ ๊ทธ๋Ÿฌํ•œ ์ผ๋ฐ˜ ๋ฉ”์†Œ๋“œ์€ ์•Œ์•„์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰์„ ์ œ์™ธํ•œ๋‹ค.

 

๐Ÿ–ฅ ์‹คํ–‰ ๊ฒฐ๊ณผ

fail() ๋ฉ”์†Œ๋“œ์— ์˜ํ•ด ๋ฌด์กฐ๊ฑด ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ์ด๋‹ค.

AssertionFailedError ์ต์…‰์…˜์ด ๋ฐœ์ƒํ•˜๊ณ  ์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋กœ์„œ fail() ๋ฉ”์†Œ๋“œ์— ์ธ์ž๋กœ ๋„˜๊ธด "Not yet implemented."๊ฐ€ ์ฝ˜์†”์— ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿ“„ScoreCollectionTest.java

@Test
void test() {
//    fail("Not yet implemented.");
}

fail() ํ˜ธ์ถœ์„ ์ œ๊ฑฐํ•˜๋ฉด ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ฒ€์ฆํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฌด์กฐ๊ฑด ์„ฑ๊ณตํ•œ๋‹ค.

 

๐Ÿ–ฅ ์‹คํ–‰ ๊ฒฐ๊ณผ

 

์ด๋ ‡๊ฒŒ ๋ฌด์กฐ๊ฑด ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ, ๋ฌด์กฐ๊ฑด ์„ฑ๊ณตํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด์„œ ์˜ฌ๋ฐ”๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋ฉด JUnit์„ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์ด๋‹ค.

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž‘์„ฑ

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ž€ ํƒ€๊ฒŸ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€ ํ–‰๋™์„ ์ œ๊ณตํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์ด๋‹ค.

์ž‘์„ฑํ•  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ScoreCollection์˜ ๋ฉค๋ฒ„ ๋ฆฌ์ŠคํŠธ scores์— ์ •์ˆ˜ 5, 7์„ ์ถ”๊ฐ€ํ•˜๊ณ  arithmeticMean() ๋ฉ”์†Œ๋“œ๊ฐ€ 6์„ ๋ฐ˜ํ™˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ธฐ์กด์— JUnit์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ–ˆ๋˜ ์˜๋ฏธ์—†๋Š” ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋Š” ์‚ญ์ œํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

 

๐Ÿ“„ ScoreCollectionTest.java

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

class ScoreCollectionTest {

    @DisplayName("๋‘ ์ˆ˜์˜ ์‚ฐ์ˆ  ํ‰๊ท  ์„ฑ๊ณต ํ…Œ์ŠคํŠธ")
    @Test
    void arithmeticMeanOfTwoNumbers() {
        // given
        ScoreCollection scoreCollection = new ScoreCollection();
        scoreCollection.add(() -> 5);
        scoreCollection.add(() -> 7);

        // when
        int actual = scoreCollection.arithmeticMean();

        // then
        assertThat(actual).isEqualTo(6);
    }
}

JUnit5๋ฅผ ์‚ฌ์šฉํ•ด์„œ public์„ ์ƒ๋žตํ•˜๊ณ  @DisplayName ์• ๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๋‚ด์šฉ์„ ๋”์šฑ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

assertThat()์€ AssertJ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ static import ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

 

์ฑ…์—์„œ๋Š” ์ด ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„, ์‹คํ–‰, ๋‹จ์–ธ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์„ค๋ช…ํ•˜์˜€๋‹ค.

๊ทธ ๋ณด๋‹ค ์ต์ˆ™ํ•˜๊ณ  ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์šฉ์–ด๋Š” given, when, then ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

given - ์ค€๋น„ ๋‹จ๊ณ„
ํ…Œ์ŠคํŠธ ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๋Š” ์ค€๋น„ ๋‹จ๊ณ„
ScoreCollection ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋žŒ๋‹ค์‹์œผ๋กœ Scoreable์„ ๋„˜๊ฒจ add()๋ฅผ ๋‘ ๋ฒˆ ํ˜ธ์ถœํ•œ ๊ฒƒ์ด ์ด ๋‹จ๊ณ„์ด๋‹ค.

when - ์‹คํ–‰ ๋‹จ๊ณ„
๊ฒ€์ฆํ•˜๋ ค๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„
ScoreCollection์˜ arithmeticMean()์„ ํ˜ธ์ถœํ•˜์˜€๋‹ค.

then - ๋‹จ์–ธ ๋‹จ๊ณ„
๊ธฐ๋Œ€ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ assert(๋‹จ์–ธ)ํ•˜๋Š” ๋‹จ๊ณ„
AssertJ์˜ assertThat()์— ์‹ค์ œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๊ฐ’ actual์„ ๋„˜๊ธฐ๊ณ , ์ฒด์ด๋‹ ๋ฉ”์†Œ๋“œ๋กœ isEualTo()์— ๊ธฐ๋Œ€๊ฐ’์ธ 6์„ ๋„˜๊ฒจ ํ˜ธ์ถœํ•˜์˜€๋‹ค.

 

๐Ÿ–ฅ ์‹คํ–‰ ๊ฒฐ๊ณผ

 

์ด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์‹คํŒจํ•˜๋„๋ก ๋ณ€๊ฒฝํ•ด๋ณด์ž.

 

๐Ÿ“„ ScoreCollectionTest.java

...
// then
assertThat(actual).isEqualTo(100);
...

 

๐Ÿ–ฅ ์‹คํ–‰ ๊ฒฐ๊ณผ

๊ธฐ๋Œ€๊ฐ’์€ 100์ด๋‚˜ ์‹ค์ œ ๊ฒฐ๊ณผ๊ฐ’์€ 6์ด๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ์ฝ˜์†”์— ์ฐํžŒ๋‹ค.

 

์•„๋ž˜์™€ ๊ฐ™์ด assert๋ฌธ์„ ๋ฐ”๊ฟˆ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•˜๋„๋ก ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค.

 

๐Ÿ“„ ScoreCollectionTest.java

...
// then
assertThat(actual).isNotEqualTo(100);
...

 

๐Ÿ–ฅ ์‹คํ–‰ ๊ฒฐ๊ณผ

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€