Bibi's DevLog ๐ค๐
[Java] JUnit, AssertJ์ ๊ฐ๋ ๋ฐ ๊ธฐ์ด์ ์ธ ์ฌ์ฉ๋ฒ (๋จ์ ๋ฌธ, ์ด๋ ธํ ์ด์ ) ๋ณธ๋ฌธ
[Java] JUnit, AssertJ์ ๊ฐ๋ ๋ฐ ๊ธฐ์ด์ ์ธ ์ฌ์ฉ๋ฒ (๋จ์ ๋ฌธ, ์ด๋ ธํ ์ด์ )
๋น๋น bibi 2021. 2. 16. 18:09JUnit์ ๊ฐ๋ ๋ฐ assert ๋ฉ์๋(๋จ์ ๋ฌธ), ์ด๋ ธํ ์ด์
์ถ์ฒ : ๋งํฌ1, ๋งํฌ2, ๋งํฌ3, ๋งํฌ4. ๊ฐ์ฌํฉ๋๋ค๐โโ๏ธ๐โโ๏ธ
JUnit์ด๋?
์๋ฐ๋ฅผ ์ํ ๋จ์ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์คํ์์ค)์ด๋ค.
์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ํด ์ฃผ๋ ํ ์คํธ์ฉ ํ๋ ์์ํฌ๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
org.junit
- ๋จ์ ๋ฌธ (
assert...()
)์ผ๋ก ํ ์คํธ ์ผ์ด์ค์ ์ํ๊ฒฐ๊ณผ๋ฅผ ํ๋ณํด ์๋ ค์ค๋ค. - ์ด๋ ธํ ์ด์ ์ผ๋ก ํ ์คํธ๊ฐ ๊ฐ๊ฒฐํด์ง๋๋ก ์ง์ํ๋ค.
- ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ Testํด๋์ค๋ก ๋จ๊น์ผ๋ก์จ ํ ์คํธ history๋ฅผ ์ ์ฅํ ์ ์๋ค.
๋จ์ ํ ์คํธ Unit Test๋?
๋ชจ๋ ํจ์์ ๋ฉ์๋์ ๋ํ ํ ์คํธ ์ผ์ด์ค test cate๋ฅผ ์์ฑํ๋ ์ ์ฐจ.
์์ค์ฝ๋์ ํน์ ๋ชจ๋์ด ์๋๋๋ก ์ ํํ ๋์ํ๋์ง ๊ฒ์ฆํ๋ค.
System.out.println()
๋ก ๋งค๋ฒ ์ฌ๋์ด ๋์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด์ผ ํ๋ ํ ์คํธ ๋ฐ ๋๋ฒ๊น ๊ณผ์ ์ ์ฝ๊ฒ ํ๋ค.
JUnit์ assert ๋ฉ์๋๋ค
assertEquals(A, B)
: ๊ฐ์ฒด A์ B๊ฐ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋์ง ํ์ธํ๋ค.assertEquals(A, B, C)
: ๊ฐ์ฒด A์ B๊ฐ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋์ง ํ์ธํ๋ค. C๋ ์ค์ฐจ๋ฒ์.assertArrayEquals(A, B)
: ๋ฐฐ์ด A์ B๊ฐ ์ผ์นํ๋์ง ํ์ธํ๋ค.assertSame(A, B)
: ๊ฐ์ฒด A์ B๊ฐ ๊ฐ์ ๊ฐ์ฒด์ธ์ง ํ์ธํ๋ค.assertTrue(A)
: ์กฐ๊ฑด A๊ฐ ์ฐธ์ธ์ง ํ์ธํ๋ค.assertNull(A)
: ๊ฐ์ฒดA๊ฐ Null์ธ์ง ํ์ธํ๋ค.assertNotNull(A)
๊ฐ์ฒด A๊ฐ Null์ด ์๋์ง ํ์ธํ๋ค.
assertThat()
๋ ์์ง๋ง, AssertJ์ ์ฌ์ฉ๋ฒ์ด ๋ ์ฌ์ด ๊ฒ ๊ฐ์ ๋์ค์ AssertJ ๊ณต๋ถํ ๋ ๋ ์์ธํ ์์๋ณด๊ณ ๊ฐ์ด ์ ๋ฆฌํด์ผ๊ฒ ๋ค.
JUnit์ ์ด๋ ธํ ์ด์
@Test
: ๋ฉ์๋ ์์ ํด๋น ์ด๋ ธํ ์ด์ ์ ์ ์ธํด, ํ ์คํธ ๋์ ๋ฉ์๋์์ ์ง์ ํ ์ ์๋ค.@Test(timeout=๋ฐ๋ฆฌ์ด)
: ํ ์คํธ ๋ฉ์๋ ์ํ ์๊ฐ์ ์ ํํ ์ ์๋ค.
ํ ์คํธ๋ฉ์๋๊ฐ ๋ฆฌํด๊ฐ์ ๋ฐํํ๋ ๋ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ์ง์ ๋ ๋ฐ๋ฆฌ์ด๋ฅผ ๋๊ธด๋ค๋ฉด ํด๋น ํ ์คํธ๋ ์คํจ๋ก ํ๋ณํ๋ค.@Test(expected=์์ธ)
: ํด๋น ํ ์คํธ ๋ฉ์๋ ์์ธ ๋ฐ์ ์ฌ๋ถ์ ๋ฐ๋ผ ์ฑ๊ณต/์คํจ๋ฅผ ํ๋ณํ ์ ์๋ค.expected=
์ ์ง์ ๋ ์์ธ๊ฐ ๋ฐ์ํด์ผ ํ ์คํธ๊ฐ ์ฑ๊ณตํ ๊ฒ์ผ๋ก ํ๋ณํ๋ค.@Ignore
: ํด๋น ์ด๋ ธํ ์ด์ ์ด ์ ์ธ๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ์คํํ์ง ์๋๋ก ์ง์ ํ๋ค.@BeforeEach
== (๊ตฌ)@Before
: ๋ชจ๋@Test
๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํ๋๋ ๋ฉ์๋๋ฅผ ์ง์ ํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.- ๊ฐ ํ ์คํธ ์์ ์ ์ ๊ฐ๊ฐ ํธ์ถ๋๋ค.
@Test
๋ฉ์๋์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ์ฝ๋๋ฅผ@Before
๋ฉ์๋์ ์ ์ธํด ์ฌ์ฉํ๋ฉด ์ข๋ค.- ํ ์คํธ๋ง๋ค ๊ณตํต์ผ๋ก ์ฐ์ด๋ฉด์, ํ ์คํธ ์ ์ ๋ฆฌ์ ๋์ด์ผ ํ ํญ๋ชฉ์ด ๋ค์ด๊ฐ๋ค
@AfterEach
== (๊ตฌ)@After
: ๋ชจ๋@Test
๋ฉ์๋์ ์คํ์ด ๋๋ ๋ค์ ์คํ๋๋ ๋ฉ์๋๋ฅผ ์ง์ ํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.- ๊ฐ ํ ์คํธ๊ฐ ๋๋๊ณ ๊ฐ๊ฐ ํธ์ถ๋๋ค.
@BeforeAll
== (๊ตฌ)@BeforeClass
: ํด๋น ํ ์คํธ ํด๋์ค๊ฐ ์คํ๋ ๋ ๋ฑ ํ ๋ฒ๋ง ์ํ๋๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ์ง์ ํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.@AfterAll
== (๊ตฌ)@AfterClass
: ํด๋น ํ ์คํธ ํด๋์ค๊ฐ ์คํ์ด ๋๋ ๋ค์ ๋ฑ ํ ๋ฒ๋ง ์ํ๋๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ์ง์ ํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.- ํ ์คํธํด๋์ค์ ๋ชจ๋ ํ ์คํธ๊ฐ ์๋ฃ๋ ๋ค ํ ๋ฒ ํธ์ถ๋๋ค.
AssertJ
์ถ์ฒ : AssertJ , AssertJ ๊ณต์ ๊ฐ์ด๋, AssertJ API ๊ฐ์ฌํฉ๋๋ค๐โโ๏ธ๐โโ๏ธ
AssertJ๋
์๋ฐ JUnit์ ํ ์คํธ์ฝ๋์ ์ฌ์ฉ๋์ด, ํ ์คํธ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ํธ์์ฑ์ ๋์ฌ ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
- ๋ฉ์๋ ์ฒด์ด๋์ ์ง์ํด, ๋ ์ง๊ด์ ์ด๊ณ ์ฝ๊ธฐ ์ฌ์ด ํ ์คํธ์ฝ๋ ์์ฑ ๊ฐ๋ฅ
- ํ ์คํธ์ ํ์ํ ํ๋ถํ ๋ฉ์๋๋ค์ ์ ๊ณตํจ
์๋ฐ 8 ์ด์์ AssertJ 3.x๋ฒ์ ์ ์ฌ์ฉํด์ผ ํ๋ค.
- ์๋ฐ 8 ๊ธฐ์ค, Gradle์์๋
testCompile 'org.assertj:assertj-core:3.6.2'
๋ก ์ฌ์ฉํ๋ค
AssertJ ๋ฉ์๋ ์ํฌํธ
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
static ์ํฌํธ๋ฅผ ํตํด AssertJ์ ๋ค์ํ API๋ฅผ ํด๋์ค ์ด๋ฆ ์์ด ์ฌ์ฉ ๊ฐ๋ฅํจ.
AssertJ์ assert ๋ฉ์๋
AssertJ์์ ๋ชจ๋ ํ
์คํธ ์ฝ๋๋ assertThat()
์ผ๋ก ์์ํจ.
assertThat(ํ ์คํธ ํ๊ฒ).๋ฉ์๋1().๋ฉ์๋2().๋ฉ์๋3()'
์ด๋ฐ ํฌ๋งท์ผ๋ก AssertJ์ ์ฌ๋ฌ ๋ฉ์๋๋ค์ ์ฐ์์ ์ผ๋ก ํธ์ถํด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
(๋ฉ์๋ ์ฒด์ด๋)
์์ - ๋ฌธ์์ด ํ ์คํธ
isNotEmpty()
, contains(e)
, doesNotContain(e)
, startsWith(e)
, endsWith(e)
, isEqualTo(e)
assertThat("Hello, world! Nice to meet you.") // ์ฃผ์ด์ง "Hello, world! Nice to meet you."๋ผ๋ ๋ฌธ์์ด์
.isNotEmpty() // ๋น์ด์์ง ์๊ณ
.contains("Nice") // "Nice"๋ฅผ ํฌํจํ๊ณ
.contains("world") // "world"๋ ํฌํจํ๊ณ
.doesNotContain("ZZZ") // "ZZZ"๋ ํฌํจํ์ง ์์ผ๋ฉฐ
.startsWith("Hell") // "Hell"๋ก ์์ํ๊ณ
.endsWith("u.") // "u."๋ก ๋๋๋ฉฐ
.isEqualTo("Hello, world! Nice to meet you."); // "Hello, world! Nice to meet you."๊ณผ ์ผ์นํฉ๋๋ค.
์์ - ์ซ์ ํ ์คํธ
assertThat(3.14d) // ์ฃผ์ด์ง 3.14๋ผ๋ ์ซ์๋
.isPositive() // ์์์ด๊ณ
.isGreaterThan(3) // 3๋ณด๋ค ํฌ๋ฉฐ
.isLessThan(4) // 4๋ณด๋ค ์์ต๋๋ค
.isEqualTo(3, offset(1d)) // ์คํ์
1 ๊ธฐ์ค์ผ๋ก 3๊ณผ ๊ฐ๊ณ
.isEqualTo(3.1, offset(0.1d)) // ์คํ์
0.1 ๊ธฐ์ค์ผ๋ก 3.1๊ณผ ๊ฐ์ผ๋ฉฐ
.isEqualTo(3.14); // ์คํ์
์์ด๋ 3.14์ ๊ฐ์ต๋๋ค
AssertJ์ ๋ฉ์๋๋ค
์ฐ์ ์ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ org.assertj.core.api
ํจํค์ง์ ๋ฉ์๋๋ค ์ค์ฌ์ผ๋ก ์ ๋ฆฌํ๋ค.
๋ฉ์๋๋ค์ด ๋๋ฌด ๋ง์์ ๋น์ฅ ์ธ ์ ์์ ๋งํ ๊ฒ์ผ๋ก ์ถ๋ ค์ ์ ๋ฆฌํ๋ค.
(์์ด๋ฅผ ์ ํ์ง ์์ต๋๋ค. ์ดํด๋๋ ๋ถ๋ถ๋ง ์ ๋ฆฌํ์ต๋๋ค.)
์ถ์ฒ : assertJ ๊ณต์ ์นํ์ด์ง - Package org.assertj.core.api
์ผ๋ฐ
Assert ์ธํฐํ์ด์ค
: ๋ชจ๋ Assertion ๊ฐ์ฒด๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํจ
isEqualTo(Object o)
: ์ค์ ๊ฐ์ด ์ฃผ์ด์ง ๊ฐ๊ณผ ๊ฐ์์ง ํ์ธisNotEqualTo(Object o)
: ์ค์ ๊ฐ์ด ์ฃผ์ด์ง ๊ฐ๊ณผ ๊ฐ์ง ์์์ง ํ์ธisInstanceOf(Class<?> type)
,isInstanceOfAny(Class<?> ... types)
: ์ค์ ๊ฐ์ด ์ฃผ์ด์ง ์ ํ์ ์ธ์คํด์ค์ธ์ง ํ์ธisNotInstanceOf(Class<?> type)
,isNotInstanceOfAny(Class<?> ... types)
๋ ๊ทธ ๋ฐ๋.isExactlySameInstanceOf(Class<?> type)
: ์ค์ ๊ฐ์ด ์ ํํ ์ฃผ์ด์ง ์ ํ์ ์ธ์คํด์ค์ธ์ง ํ์ธisNotExactlyInstanceOf(Class<?> type)
๋ ๊ทธ ๋ฐ๋.asList()
: ์ค์ ๊ฐ์ด List์ ์ธ์คํด์ค์ธ์ง ํ์ธํ๊ณ list Assertion์ ๋ฐํasString()
: toString()์ผ๋ก ์ค์ ๊ฐ์ ๋ํ ๋ฌธ์์ด์ ๋ฐํhasSameClassAs(Object o)
,doesNotHaveSameClassAs(Object o)
hasSameHashCodeAs(Object o)
,doesNotHaveSameHashCodeAs(Object o)
: ์ค์ ๊ฐ / ๊ฐ์ฒด๊ฐ ์ฃผ์ด์ง ๊ฐ์ฒด์ ๋์ผํ ํด๋์ค / ํด์์ฝ๋๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ธ
doesNot
์ด ๋ถ์ ๋ฉ์๋๋ ๋ฐ๋๋ก, ๊ฐ์ง๊ณ ์์ง ์์์ง๋ฅผ ํ์ธhasToString(String str)
,doesNotHaveToString(String str)
: ์ค์ actual.toString()
๊ฐ์ด ์ฃผ์ด์ง String๊ณผ ๊ฐ์์ง ํ์ธdoesNot
์ด ๋ถ์ ๋ฉ์๋๋ ๋ฐ๋๋ก, ๊ฐ์ง ์์์ง ํ์ธisIn(Iterable<?> v)
,isIn(Object ... v)
: ์ฃผ์ด์ง iterable ๋๋ ๊ฐ ๋ฐฐ์ด์ ์ค์ ๊ฐ์ด ์๋์ง ํ์ธisNotIn(Iterable<?> v)
,isNotIn(Object ... v)
์ ๊ทธ ๋ฐ๋.isNull()
: ์ค์ ๊ฐ์ด null์ธ์ง ํ์ธ.isNotNull()
์ ๊ทธ ๋ฐ๋.isSameAs(Object o)
:==
๋น๊ต๋ฅผ ์ฌ์ฉํด ์ค์ ๊ฐ์ด ์ฃผ์ด์ง ๊ฐ๊ณผ ๋์ผํ์ง ํ์ธ.isNotSameAs(Object o)
๋ ๊ทธ ๋ฐ๋.
๊ทธ ์ธ..
as("์ค๋ช ")
: Assertion์ ์ค๋ช ํ๋ ๋ฉ์๋. "์ค๋ช "์ ๋ด์ฉ์ด ํ ์คํธ ๊ฒฐ๊ณผ์ ์ถ๋ ฅ๋๋๋ก ํ ์ ์๋ค.
์ซ์ ๊ด๋ จ ๋ฉ์๋
NumberAssert์ธํฐํ์ด์ค
isBetween(start, end)
: ์ค์ ๊ฐ์ด start์์ end ๊ฐ ์ฌ์ด์ ์๋์ง ํ์ธํจ. (start, end ๊ฐ์ ํฌํจํจ)isStrictlyBetween(start, end)
: ์ค์ ๊ฐ์ด start์์ end ๊ฐ ์ฌ์ด์ ์๋์ง ํ์ธํจ. (start, end ๊ฐ์ ํฌํจํ์ง ์์)isCloseTo(expected, offset)
,isCloseTo(expected, percentage)
: ์ค์ ์ซ์๊ฐ ์ฃผ์ด์ง offset / percentage ๋ด์์ expected์ ๊ฐ๊น์ด์ง ํ์ธ.
์ฐจ์ด๊ฐ offset / percentage์ ๊ฐ์ผ๋ฉด Assertion์ ์ ํจํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํจ.isNotCloseTo(expected, offset)
,isNotCloseTo(expected, percentage)
: ์ค์ ์ซ์๊ฐ ์ฃผ์ด์ง offset / percentage ๋ด์์ expected์ ๊ฐ๊น์ง ์์์ง ํ์ธ.
์ฐจ์ด๊ฐ offset / percentage์ ๊ฐ์ผ๋ฉด Assertion์ ์คํจํ ๊ฒ์ผ๋ก ๊ฐ์ฃผํจ.isPositive()
,isNegative()
: ์ค์ ๊ฐ์ด ์์์ธ์ง / ์์์ธ์ง ํ์ธํจ.isNotPositive()
,isNotNegative()
: ์ค์ ๊ฐ์ด ์์๊ฐ ์๋์ง (์์์ด๊ฑฐ๋ 0์ธ์ง) / ์์๊ฐ ์๋์ง (์์์ด๊ฑฐ๋ 0์ธ์ง) ํ์ธํจ.isZero()
: ์ค์ ๊ฐ์ด 0์ธ์ง ํ์ธ.isNotZero()
:์ค์ ๊ฐ์ด 0์ด ์๋์ง ํ์ธ.isOne()
: ์ค์ ๊ฐ์ด 1๊ณผ ๊ฐ์์ง ํ์ธ
๋ถ๋์์์ ์ซ์ ๊ด๋ จ ๋ฉ์๋
FloatingPointNumberAssert ์ธํฐํ์ด์ค
์ซ์ ๊ด๋ จ ๋ฉ์๋์ ๋ํด, ์๋์ ๋ฉ์๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
isNaN()
: ์ค์ ๊ฐ์ด NaN๊ณผ ๊ฐ์์ง ํ์ธ.isNotNaN()
: ์ค์ ๊ฐ์ด NaN๊ณผ ๊ฐ์ง ์์์ง ํ์ธ.isFinite()
,isInfinite()
AssertJ ์ฌ์ฉ์ ์ฃผ์์
assertThat(Object o)
๋ก ํ ์คํธํ ๊ฐ์ฒด๋ฅผ ํธ์ถํ ๋ค์ ๋ฉ์๋๋ค์ ์ฌ์ฉํด์ผ ํ๋ค.- BAD :
assertThat(actual.equals(expected));
GOOD :assertThat(actual).isEqualTo(expected);
- BAD :
assertThat(1 == 2);
GOOD :assertThat(1).isEqualTo(2);
- BAD :
as()
๋ assertion ๋ฉ์๋๋ค์ ํธ์ถํ๊ธฐ ์ ์ ์ฌ์ฉํด์ผ ํ๋ค.BAD
// DON'T DO THIS ! as/describedAs have no effect after the assertion assertThat(actual).isEqualTo(expected).as("description"); assertThat(actual).isEqualTo(expected).describedAs("description");
GOOD
// DO THIS: use as/describedAs before the assertion assertThat(actual).as("description").isEqualTo(expected); assertThat(actual).describedAs("description").isEqualTo(expected);
https://steady-coding.tistory.com/349?category=861122 JUnit ์ ๋ฆฌ
https://steady-coding.tistory.com/351 AssertJ ์ ๋ฆฌ
๋์ค์ ์ฐธ๊ณ ํด์ ๊ณต๋ถ ํ ์ ๋ฆฌํ๊ธฐ!
'๐ฅ BE ๋ฐฑ์๋ > Java ์๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] this์ this() (0) | 2021.02.18 |
---|---|
[Java] List ๋ฆฌ์คํธ = ArrayList ๋ก ์ ์ธํด ์ฌ์ฉํ๋ ์ด์ (2) | 2021.02.18 |
[Java] ์ ๊ทผ์ ์ด์ (0) | 2021.02.16 |
[Java] ์์ฑ์์ ๊ธฐ๋ณธ์์ฑ์ (0) | 2021.02.16 |
[Java] ์์์ enum (0) | 2021.02.16 |