π JUnitμ΄λ?
β
Java μ§μμμ κ°μ₯ λ§μ΄ μ¬μ©λλ μ λ ν
μ€νΈ νλ μμν¬
β
Java μ ν리μΌμ΄μ
μμ μ λ ν
μ€νΈμ ν΅ν© ν
μ€νΈλ₯Ό μ€ννλ λ° μ¬μ©
ꡬμ±μμ
JUnit 5λ λ€μ 3κ°μ§ λͺ¨λλ‘ κ΅¬μ±λλ€.
| λͺ¨λ | μ€λͺ |
|---|---|
| JUnit Platform | λ€μν ν μ€νΈ μμ§μ μ€νν μ μλ κΈ°λ° μ 곡 |
| JUnit Jupiter | JUnit 5μ ν
μ€νΈ μμ§ μ 곡 (@Test, @BeforeEach λ±) |
| JUnit Vintage | JUnit 3, 4 κΈ°λ°μ ν μ€νΈ μ€ν μ§μ |
π JUnit λΌμ΄νμ¬μ΄ν΄ μ΄λ Έν μ΄μ
β ν μ€νΈ μ€ν μ /ν μ€μ λ° μ 리λ₯Ό μννλ λ©μλλ₯Ό μ μν μ μκ² νλ€.
| μ΄λ Έν μ΄μ | μ€λͺ |
|---|---|
@BeforeEach |
κ° ν μ€νΈ μ μ μ€ν |
@AfterEach |
κ° ν μ€νΈ νμ μ€ν |
@BeforeAll |
λͺ¨λ ν μ€νΈ μ€ν μ μ 1λ² μ€ν |
@AfterAll |
λͺ¨λ ν μ€νΈ μ€ν ν 1λ² μ€ν |
import org.junit.jupiter.api.*;
class LifecycleTest {
@BeforeAll
static void beforeAll() {
System.out.println("π λͺ¨λ ν
μ€νΈ μμ μ (1ν μ€ν)");
}
@BeforeEach
void beforeEach() {
System.out.println("πΉ κ°λ³ ν
μ€νΈ μ€ν μ ");
}
@Test
void test1() {
System.out.println("β
μ€ν: test1");
}
@Test
void test2() {
System.out.println("β
μ€ν: test2");
}
@AfterEach
void afterEach() {
System.out.println("πΉ κ°λ³ ν
μ€νΈ μ€ν ν");
}
@AfterAll
static void afterAll() {
System.out.println("π λͺ¨λ ν
μ€νΈ μ’
λ£ ν (1ν μ€ν)");
}
}π JUnit λ¨μΈ (Assertions)
β
ν
μ€νΈ κ²°κ³Όλ₯Ό κ²μ¦νλ λ€μν Assertionsλ₯Ό μ 곡
β
λͺ¨λ org.junit.jupiter.api.Assertions ν΄λμ€μ static λ©μλλ‘ μ 곡
| λ©μλ | μ€λͺ |
|---|---|
assertEquals(expected, actual) |
κΈ°λκ°κ³Ό μ€μ κ° λΉκ΅ |
assertTrue(condition) |
μ‘°κ±΄μ΄ trueμΈμ§ νμΈ |
assertFalse(condition) |
μ‘°κ±΄μ΄ falseμΈμ§ νμΈ |
assertNotNull(object) |
κ°μ²΄κ° nullμ΄ μλμ νμΈ |
assertThrows(Exception.class, () -> {...}) |
μμΈ λ°μ μ¬λΆ νμΈ |
Assertions μμ
@Test
void addAssertions() {
int sum = 2 + 3;
Assertions.assertEquals(sum, 5);
}μμΈ μ²λ¦¬ Assertions μμ
@Test
void exceptionAssertions() {
Assertions.assertThrows(ArithmeticException.class, () -> {
int result = 1 / 0;
});
}λ¬Έμ μ
β κ°λ
μ±μ΄ λ¨μ΄μ§λ κ²μ¦
β λ©μλ 체μ΄λμ μ§μνμ§ μμ μ¬λ¬ κ²μ¦μ μννκΈ° μ΄λ €μ
β μμΈ κ²μ¦μ΄ μ νμ
AssertJλ μμ κ°μ JUnitμ λ¬Έμ μ μ ν΄κ²°νλ€.
π AssertJλ?
β
Javaμμ ν
μ€νΈλ₯Ό μμ±ν λ νμν μ§κ΄μ μΈ λ¨μΈμ μ 곡νλ λΌμ΄λΈλ¬λ¦¬
β
ν
μ€νΈ μ½λμ κ°λ
μ±μ ν₯μ
ꡬμ±μμ
β μ¬λ¬ λͺ¨λλ‘ κ΅¬μ±λμ΄ μμΌλ©°, κ° λͺ¨λμ νΉμ ν νμ μ λν λ¨μΈμ μ 곡
- AssertJ Core: JDK νμ (String, Iterable, Stream, Path, File, Map λ±)μ λν λ¨μΈμ μ 곡
- AssertJ Guava: Guava λΌμ΄λΈλ¬λ¦¬μ νμ (Multimap, Optional λ±)μ λν λ¨μΈμ μ 곡
- AssertJ Joda-Time: Joda-Time λΌμ΄λΈλ¬λ¦¬μ νμ (DateTime, LocalDateTime λ±)μ λν λ¨μΈμ μ 곡
- AssertJ Neo4j: Neo4j λ°μ΄ν°λ² μ΄μ€μ νμ (Path, Node, Relationship λ±)μ λν λ¨μΈμ μ 곡
- AssertJ DB: κ΄κ³ν λ°μ΄ν°λ² μ΄μ€μ νμ (Table, Row, Column λ±)μ λν λ¨μΈμ μ 곡
- AssertJ Swing: Swing μ¬μ©μ μΈν°νμ΄μ€μ κΈ°λ₯μ ν μ€νΈλ₯Ό μν APIλ₯Ό μ 곡
βοΈ AssertJ Coreκ° κ°μ₯ λ리 μ¬μ©λλ©°, λλ¨Έμ§ λͺ¨λμ νΉμ νκ²½(Guava, Joda-Time, DB λ±)μμ μ¬μ©λ¨
νΉμ§
- ν₯μλ κ°λ
μ±:
assertThat()λ©μλλ₯Ό μ€μ¬μΌλ‘ μμ°μ€λ¬μ΄ μΈμ΄ ꡬ쑰λ₯Ό μ 곡 - νλΆν λ¨μΈ λ©μλ: λ¬Έμμ΄, 컬λ μ , μμΈ, νμΌ λ± λ€μν νμ μ λν λ¨μΈμ μ§μ
- λ©μλ 체μ΄λ: μ¬λ¬ λ¨μΈμ 체μ΄λνμ¬ κ°λ μ± ν₯μ
- IDE μΉνμ : μ½λ μλ μμ± κΈ°λ₯μ ν΅ν΄ κ°λ° μμ°μ±μ ν₯μ
π AssertJ λ¨μΈ (Assertions)
κΈ°λ³Έ λ¨μΈ
@Test
void basicAssertions() {
String name = "Frodo";
assertThat(name).isEqualTo("Frodo")
.startsWith("Fro")
.endsWith("do")
.isEqualToIgnoringCase("frodo");
}컬λ μ λ¨μΈ
@Test
void collectionAssertions() {
List<String> fellowship = List.of("Frodo", "Sam", "Gandalf");
assertThat(fellowship).hasSize(3)
.contains("Frodo", "Sam")
.doesNotContain("Sauron");
}μμΈ λ¨μΈ
import static org.assertj.core.api.Assertions.*;
@Test
void exceptionAssertions() {
assertThatThrownBy(() -> {
throw new Exception("boom!");
}).isInstanceOf(Exception.class)
.hasMessageContaining("boom");
}κ°μ²΄ λ¨μΈ
public class Member {
Long id;
String name;
String nickname;
}
@Test
void fieldsAssertions() {
Member member1 = new Member(1L, "choi", "phillip");
Member member2 = new Member(null, "choi", "phillip");
assertThat(member1).usingRecursiveComparison()
.ignoringFields("id")
.isEqualTo(member2);
}π JUnitκ³Ό AssertJμ κ΄κ³
- JUnitμ ν
μ€νΈ μ€νμ λ΄λΉ (ν
μ€νΈ λΌμ΄νμ¬μ΄ν΄ κ΄λ¦¬,
@Testμ 곡) - AssertJλ μ§κ΄μ μ΄κ³ κ°λ ₯ν κ²μ¦μ λ΄λΉ (
assertThat()μΌλ‘ κ°λ μ± κ°μ ) - AssertJλ JUnitμ΄ μμΌλ©΄ ν μ€νΈλ₯Ό μ€νν μ μμ
- JUnitλ§ μ¬μ©νλ©΄ κ²μ¦ μ½λκ° λΆνΈνλ―λ‘, AssertJλ₯Ό μΆκ°νλ©΄ κ°λ μ±μ΄ ν₯μλ¨
π μ°Έκ³
https://junit.org/junit5/docs/current/user-guide
https://assertj.github.io/doc