π° JUnit 5 λͺ¨λ ꡬμ±
- JUint νλ«νΌ
- ν μ€ν νλ μ μν¬λ₯Ό ꡬλνκΈ° μν λ°μ²μ ν μ€νΈ μμ§μ μν API wprhd
- JUnit Jupiter
- JUnit 5λ₯Ό μν ν μ€νΈ APIμ μ€ν μμ§ κ΅¬μ±
- JUnit Vintage
- JUnit 3, 4λ‘ μμ±λ ν μ€νΈλ₯Ό 5 νλ«νΌμμ μ€ννκΈ° μν λͺ¨λ μ 곡
Jupiterλ‘ ν μ€νΈλ₯Ό μμ±νκ³ μ€ννλ €λ©΄ build.gradle νμΌ λ΄ dependenciesμ μμ‘΄μ μΆκ°ν΄μ£Όμ΄μΌ νλ€.
λ€μμ TDD μ€ν°λ νλ‘μ νΈμ build.gradle fileμ΄λ€. Jupiter κ΄λ ¨ μμ‘΄μ±μ΄ μΆκ°λ κ²μ νμΈν μ μλ€.
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.7'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'testdriven'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// junit
testImplementation('org.junit.jupiter:junit-jupiter:5.5.0')
}
tasks.named('test') {
useJUnitPlatform()
}
π° @Test Annotation & Test Method
- @Test Annotation
- Test λ©μλ μμ @Test Annotation λΆμ
- not private
- assertEqals() Method
- μ€μ κ°κ³Ό ν μ€νΈ κ°μ΄ κ°μμ§ λΉκ΅
@Test
void plus(){
int result = Calculator.plus(1, 2);
assertEquals(3, result); // μ€μ κ°κ³Ό λμΌ νμ§ λΉκ΅
assertEquals(5, Calculator.plus(4, 1));
}
π° μ£Όμ λ¨μΈ λ©μλ
Method | explanation |
assertEquals(expected, actual) | μ€μ κ°κ³Ό κΈ°λνλ κ°μ΄ κ°μμ§ κ²μ¬ |
assertNotEquals(unexpected, actual) | μ€μ κ°κ³Ό νΉμ κ°κ³Ό κ°μ§ μμμ§ κ²μ¬ |
assertSame(Object expected, Object actual) | λ κ°μ²΄κ° λμΌν κ°μ²΄μΈμ§ κ²μ¬ |
assertNotSame(Object unexpected, Object actual) | λ κ°μ²΄κ° λμΌνμ§ μμ κ°μ²΄μΈμ§ κ²μ¬ |
assertTrue(boolean condition) | κ°μ΄ true μΈμ§ κ²μ¬ |
assertFalse(boolean condition) | κ°μ΄ false μΈμ§ κ²μ¬ |
assertNull(Object actual) | κ°μ΄ null μΈμ§ κ²μ¬ |
assertNotNull(Object actual) | κ°μ΄ null μ΄ μλμ§ κ²μ¬ |
fail() | ν μ€νΈ μ€ν¨ μ²λ¦¬ |
assertThrows(Class<T> expectedType, Executable executable) |
executableμ μ€νν κ²°κ³Όλ‘ μ§μ ν νμ μ μ΅μ μ μ΄ λ°μνλμ§ κ²μ¬ |
assertDoesNotThrow(Executable executable) | executableμ μ€νν κ²°κ³Όλ‘ μ§μ ν νμ μ μ΅μ μ μ΄ λ°μνμ§ μλμ§ κ²μ¬ |
Assert λ©μλλ μ€ν¨νλ©΄ λ€μ μ½λλ₯Ό μ€ννμ§ μκ³ λ°λ‘ μ΅μ μ λ°μ
assertAll() : μ€ν¨ν Test νμΈ λ©μλ
public class TestMethod {
@Test
void assertEqualsMethod(){
LocalDate localDate = LocalDate.now();
LocalDate localDate1 = LocalDate.now();
assertEquals(localDate, localDate1);
}
@Test
void assertEqualsMethod2(){
assertEquals(3, 5/2); // μλ¬ λ°μμ, κ²μ¦ μ½λ μ€ν¨λ‘
assertEquals(4, 2*2); // μ΄ μ½λ μ€ν λμ§ μμ
}
@Test
void failMethod(){
try{
AuthService authService = new AuthService();
authService.authenticate(null, null); // null μ΄ λ°μνλλ°, μ΅μ
μ
μ΄ λ°μνμ§ μμΌλ©΄ ν
μ€νΈ μ€ν¨ (null == null)
fail();
}catch (IllegalArgumentException e){
}
}
@Test
void assertThrowsMethod(){
IllegalArgumentException e = assertThrows(IllegalStateException.class,
()->{
AuthService authService = new AuthService();
authService.authenticate(null, null);
});
assertTrue(e.getMessage().contains("id"));
}
}
- assertAll()
λͺ¨λ κ²μ¦μ μ€ννκ³ κ·Έ μ€μ μ€ν¨ν κ²μ΄ μλμ§ νμΈνκ³ μΆμ λ μ¬μ©νλ λ©μλμ΄λ€.
@Test
void assertAllMethod(){
assertAll(
() -> assertEquals(3, 5/2), // μ€ν¨
() -> assertEquals(4, 2*2),
() -> assertEquals(6, 11/2) // μ€ν¨
);
}
/**
*μλ¬ μ½λ
*/
org.gradle.internal.exceptions.DefaultMultiCauseException: Multiple Failures (2 failures)
org.opentest4j.AssertionFailedError: expected: <3> but was: <2>
org.opentest4j.AssertionFailedError: expected: <6> but was: <5>
at app//org.junit.jupiter.api.AssertAll.assertAll(AssertAll.java:80)
at app//org.junit.jupiter.api.AssertAll.assertAll(AssertAll.java:44)
at app//org.junit.jupiter.api.AssertAll.assertAll(AssertAll.java:38)
---
π° ν μ€νΈ λΌμ΄ν μ¬μ΄ν΄
πͺ@BeforeEach Annotation And @AfterEach Annotation
JUnit μ€ν μμ
1. ν μ€νΈ λ©μλλ₯΄ ν¬ν¨ν κ°μ²΄ μμ±
2. (μ‘΄μ¬νλ©΄) @BeforeEach Annotation μ΄ λΆμ λ©μλ μ€ν
3. @Test μ΄λ Έν μ΄μ μ΄ λΆμ λ©μλ μ€ν
4. (μ‘΄μ¬νλ©΄) @AfterEach μ΄λ Έν μ΄μ μ΄ λΆμ λ©μλ μ€ν
@BeforeEach
ν μ€νΈλ₯Ό μ€ννλλ° νμν μ€λΉ μμ ν λ μ¬μ©
not private
μ) ν μ€νΈμμ μ¬μ©ν μμ νμΌμ μμ±, ν μ€νΈ λ©μλ μ¬μ©ν κ°μ²΄ μμ±
@AfterEach
ν μ€νΈλ₯Ό μ€νν νμ μ 리ν κ²μ΄ μμ λ μ¬μ©
not private
μ) νμ€νΈμμ μ¬μ©ν μμ νμΌμ μμ
public class LifecycleTest {
public LifecycleTest(){
System.out.println("new LifecycleTest");
}
// κ°κ° ν
μ€νΈ νλ μ§ν μμν λ νΈμΆλλ λ©μλ
@BeforeEach
void setUp(){
System.out.println("setUp");
}
@Test
void a(){
System.out.println("A");
}
@Test
void b(){
System.out.println("B");
}
// κ°κ° ν
μ€νΈ νλ μ§ν λλ λ νΈμΆλλ λ©μλ
@AfterEach
void tearDown(){
System.out.println("tearDown");
}
}
πͺ@BeforeAll Annotation And @AfterAll Annotation
ν ν΄λμ€μ λͺ¨λ ν μ€νΈ λ©μλκ° μ€νλκΈ° μ μ νΉμ μμ μ μνν΄μΌνλ κ²½μ°
@BeforeAll
μ μ λ©μλμ μ¬μ©
ν΄λμ€μ λͺ¨λ ν μ€νΈ λ©μλλ₯Ό μ€ννκΈ° μ μ ν λ² μ΄ν
@AfterAll
μ μ λ©μλμ μ¬μ©
ν΄λμ€μ λͺ¨λ ν μ€νΈ λ©μλλ₯Ό μ€νν λ€ μμ±
π° ν μ€νΈ λ©μλ κ° μ€ν μμ μμ‘΄κ³Ό νλ 곡μ νμ§ μκΈ°
public class BadTest {
private FileOperator op = new FileOperator();
private static File file;
@Test
void fileCreationTest(){
File createdFile = op.createFile(); // νμΌ μμ±
assertTrue(createdFile.length()>0);
this.file = createdFile;
}
@Test
void readFileTest(){
long data = op.readData(file); // fileCreationTestμμ μμ±ν νμΌ μ¬μ©
assertTrue(data>0);
}
}
λ€μ μμ μ½λλ νλμ Fileμ λ Test μ½λκ° κ³΅μ νκ³ μλ€.
μμμλΆν° fileCreationTest -> readFileTest μμΌλ‘ μ½λκ° μ§νλλ©΄ ν μ€νΈμ μ±κ³΅νμ§λ§, ν μ€νΈ λ©μλκ° νΉμ μμλ‘ μ€νλλ€λ κ°μ νμ ν μ€νΈ λ©μλλ₯Ό μμ±νλ©΄ μλλ€.
[μμλ λ²μ μ λ°λΌ λ¬λΌμ§ μ μκΈ° λλ¬Έμ΄λ€.]
λ°λΌμ κ° ν μ€νΈ λ©μλλ μλ‘ λ 립μ μΌλ‘ λμν΄μΌ νλ€. ν λ©μλμ κ²°κ³Όμ λ°λΌ λ€λ₯Έ λ©μλμ μ€ν κ²°κ³Όκ° λ¬λΌμ§λ©΄ μλλ€.
π° @DisplayName, @Disabled
@DisplayName
μ΄λ¦λ§μΌλ‘ ν μ€νΈ λ΄μ©μ μ€λͺ νκΈ° λΆμ‘±ν λ μ¬μ©
곡백, νΉμ λ¬Έμ μ¬μ© λ±
ν μ€νΈ κ²°κ³Όλ₯Ό λ©μλ μ΄λ¦μ΄ μλ DisplayNameμΌλ‘ νμ
@Disabled
ν μ€νΈ λ©μλλ₯Ό μ€ν λμμμ μ μΈν λ μ¬μ©
μμ§ μμ±λμ§ μμκ±°λ μ μλμ ν μ€νΈλ₯Ό μ€ννμ§ λ§μμΌ ν λ
@DisplayName(("@DisplayName ν
μ€νΈ"))
public class DisplayNameTest {
@DisplayName("κ°μ΄ κ°μμ§ λΉκ΅")
@Test
void assertEqualsMethod(){
}
@DisplayName("μ΅μ
μ
λ°μ μ¬λΆ ν
μ€νΈ") // ν
μ€νΈ λ©λͺ¨
@Test
void assertThrowsTest(){
}
@Disabled // νΉμ ν
μ€νΈ μ€ννκ³ μΆμ§ μμ λ
@Test
void failMethod(){
}
}
π° λͺ¨λ ν μ€νΈ μ€ννκΈ°
λ°°ν¬ μ , λͺ¨λ ν μ€νΈλ₯Ό μ€ννμ¬ κΉ¨μ§λ ν μ€νΈκ° μλμ§ νμΈν΄μΌ νλ€.
μ΄ λ, μ€ν¨νλ ν μ€νΈκ° μ‘΄μ¬νλ©΄ μλͺ»λμλ€λ κ²μΌλ‘ μ½λ νΈμλ λ°°ν¬λ₯Ό μ μ λ©μΆκ³ λ¬Έμ μμΈμ μ°Ύμ μ κ±°νλ€.
# maven test
mvn test
# gradle test
gradle test
'Backend Language > TDD' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ°Έκ³ ] Mockito κΈ°μ΄ μ¬μ©λ² (0) | 2023.02.12 |
---|---|
[TDD Chapter6] ν μ€νΈ μ½λμ κ΅¬μ± (0) | 2023.02.04 |
[TDD Chapter4] TDD κΈ°λ₯ λͺ μΈ μ€κ³ (0) | 2023.01.21 |
[TDD Chapter3] ν μ€νΈ μ½λ μμ± μμ (1) | 2023.01.12 |
[TDD Chapter2] TDD μμ (0) | 2023.01.12 |