[TIL] λ¨μν μ€νΈ
ππ» λ¨μ ν μ€νΈ
π ν μ€νΈ
- μ΄λ€ λμμ λν μΌμ κΈ°μ€μ μ ν΄λκ³ κ·Έ λμμ΄ μ ν΄μ§ κΈ°μ€μ λΆν© νλμ§ λΆν©νμ§ λͺ»νλμ§λ₯Ό κ²μ¦νλ κ³Όμ
- ν μ€νΈλ₯Ό μ λλ‘ μ κ±°μ³μ ν μ€νΈ λμμ΄ κ²μ¦ κ³Όμ μ μ ν΅κ³Όνκ² λ§λ€μ΄ μ΅λν λ λμ κ²°κ³Όλ₯Ό μ»μ μ μμ
π ν μ€νΈ λΆλ₯
: κΈ°λ₯ ν μ€νΈ > ν΅ν© ν μ€νΈ > μ¬λΌμ΄μ€ ν μ€νΈ > λ¨μ ν μ€νΈ
βͺοΈ κΈ°λ₯ ν μ€νΈ
- μ£Όλ‘ μ ν리μΌμ΄μ μ μ¬μ©νλ μ¬μ©μ μ μ₯μμ μ ν리μΌμ΄μ μ΄ μ 곡νλ κΈ°λ₯μ΄ μ¬λ°λ₯΄κ² λμ νλμ§ ν μ€νΈ
- μΌλ°μ μΌλ‘ QA λΆμ, QA μ 체μμ κΈ°λ₯ ν μ€νΈ μν : κ°λ°μ μ΄μΈ μ 3μ !
- API ν΄μ΄λ λ°μ΄ν°λ² μ΄μ€κΉμ§ μ°κ΄λμ΄ μμ΄ HTTP ν΅μ , λ°μ΄ν°λ² μ΄μ€ μ°κ²° λ± λ¨μν μ€νΈλ‘ λ³Ό μλ μμ
βͺοΈ ν΅ν© ν μ€νΈ
- μ ν리μΌμ΄μ μ λ§λ κ°λ°μ λλ κ°λ°νμ ν μ€νΈμ μ£Όμ²΄κ° λλ κ²μ΄ μΌλ°μ
- ν΄λΌμ΄μΈνΈ μΈ‘ ν΄ μμ΄ κ°λ°μκ° μ§ λμ ν μ€νΈ μ½λλ₯Ό μ€νμμΌ μ΄λ£¨μ΄ μ§
- μ ν리μΌμ΄μ μ μ¬λ¬ κ³μΈ΅ λ° DBμ μ°κ²°λμ΄ μμ΄ λ¨μ ν μ€νΈλΌκ³ 보기 μ΄λ €μ
βͺοΈ μ¬λΌμ΄μ€ ν μ€νΈ
- μ ν리μΌμ΄μ μ νΉμ κ³μΈ΅μΌλ‘ μͺΌκ°μ΄μ νλ ν μ€νΈ
- API κ³μΈ΅, μλΉμ€ κ³μΈ΅, λ°μ΄ν° μμΈμ€ κ³μΈ΅μ΄ κ°κ° μ¬λΌμ΄μ€ ν μ€νΈμ λμμ΄ λ μ μμ
- Mock κ°μ²΄λ₯Ό μ¬μ©ν΄μ κ³μΈ΅λ³λ‘ λμ΄μ ν μ€νΈ
- ν΄λΉνλ κ³μΈ΅μμ HTTP μμ²μ΄ νμνκ³ μΈλΆ μλΉμ€κ° μ°λ λκΈ°λ νλ©°
λ°μ΄ν° μμΈμ€ κ³μΈ΅μ DBμ μ°λλμ΄ λ¨μ ν μ€νΈλ‘ 보기 μ‘°κΈ νλ¦
βͺοΈ λ¨μ ν μ€νΈ
- λλΆλΆ λ©μλ λ¨μλ‘ μμ±
- μ΅λν λ 립μ μΌμλ‘, μ΅λν μμ λ¨μμΌ μλ‘ μ’μ
- λ°μ΄ν°λ² μ΄μ€μ μ°λλλ€κ³ ν΄μ 무쑰건μ μΌλ‘ λ¨μν μ€νΈλ‘ λΆλ₯΄κΈ° μ΄λ ΅λ€κΈ° 보λ€λ,
λ°μ΄ν°λ² μ΄μ€ μνκ° ν μ€ν μ΄μ , μ΄νμ λμΌνκ² μ μ§λ리 μ μλ€λ©΄ λΆλ₯Ό μλ μμ
π λ¨μ ν μ€νΈλ₯Ό ν΄μΌνλ μ΄μ
- Intelli-Jλ₯Ό μ€ννκ³ PostmanμΌλ‘ HTTP μμ²μ 보λ΄μ JSON μλ΅ κ²°κ³Ό νμΈνλ©° ν μ€νΈ νλ λ°©λ²
→ μ€μνμ§λ§ λΉμμ°μ
- ꡬνν μ½λκ° μλν λλ‘ λμ νλμ§ κ²°κ³Όλ₯Ό λΉ λ₯΄κ² νμΈν μ μμ
- μμ λ¨μμ ν μ€νΈλΌμ 미리미리 λ²κ·Έλ₯Ό μ°Ύμ μ μμ
- ν μ€νΈ μΌμ΄μ€κ° μ μ§μ¬μ Έ μμ΄μΌ λ²κ·Έκ° λ°μνλλΌλ λ¬Έμ κ° λ°μν μμΈμ λ¨κ³μ μΌλ‘ μ°ΎκΈ° μ©μ΄ν¨
π‘ ν μ€νΈ μΌμ΄μ€ : Test Case
- ν μ€νΈλ₯Ό μν μ λ ₯λ°μ΄ν°, μ€ν 쑰건, κΈ°λ κ²°κ³Όλ₯Ό νννκΈ° μν λͺ μΈ
→ μ¦ λ©μλ λ± νλμ λ¨μλ₯Ό ν μ€νΈνκΈ° μν΄ μμ±νλ ν μ€νΈ μ½λ
π λ¨μ ν μ€νΈλ₯Ό μν F I R S T μμΉ
β Fast : λΉ λ₯΄κ²
- μμ±ν ν μ€νΈ μΌμ΄μ€λ λΉ¨λΌμΌ ν¨
β‘ Independent : λ 립μ μΌλ‘
- κ°κ°μ ν μ€νΈ μΌμ΄μ€λ λ 립μ μ΄μ΄μΌ ν¨
- μ΄λ€ ν μ€νΈ μΌμ΄μ€λ₯Ό λ¨Όμ μ€νμμΌλ μ€νλλ μμμ μκ΄μμ΄ μ μμ μΈ μ€νμ΄ λ³΄μ₯λμ΄μΌ ν¨
- νλμ ν μ€νΈ ν΄λμ€μμ μ¬λ¬ κ°μ ν μ€νΈ μΌμ΄μ€λ₯Ό ν λ²μ μ€νν μ μμ
→ λ κ°μ ν μ€νΈ μΌμ΄μ€λ₯Ό νκΊΌλ²μ μ€ννκ³ μμλ₯Ό λ°κΏμ μ¬μ©νλλΌλ
κ°κ°μ ν μ€νΈ μΌμ΄μ€λ λ 립μ μΌλ‘ μ€νλμ΄ ν μ€νΈ κ²°κ³Όκ° λ°λμ§ μμ
β’ Repeatable : λ°λ³΅ κ°λ₯νλλ‘
- μ΄λ€ νκ²½μμλ λ°λ³΅ν΄μ μ€νμ΄ κ°λ₯ν΄μΌ λ¨
- IDE λ²νΌμ λλ₯΄λ , λΉλ νμ€ν¬λ₯Ό μ§μ μ λ ₯νλ , λ‘컬 νκ²½μ΄λ μλ² νκ²½μμ μ€ννλ μ§ κ°μ κ²°κ³Όμ¬μΌ ν¨
β£ Self-Validating : μ ν κ²μ¦μ΄ λλλ‘
- μ±κ³΅ λλ μ€ν¨λΌλ μ체 κ²μ¦ κ²°κ³Όλ₯Ό 보μ¬μ£Όμ΄μΌ ν¨
- ν μ€νΈ μΌμ΄μ€ μ€μ€λ‘ κ²°κ³Όκ° μ³μμ§ κ·Έλ₯Έμ§ νλ¨ν μ μμ΄μΌ ν¨
β€ Timely : μκΈ° μ μ νκ²
- ν μ€νΈ νλ €λ κΈ°λ₯ ꡬνμ νκΈ° μ§μ μ μμ±ν΄μΌ ν¨
- ꡬννκ³ μ νλ κΈ°λ₯μ λ¨κ³μ μΌλ‘ μ‘°κΈμ© μ κ·Έλ μ΄λ νλ©΄μ ν μ€νΈ μΌμ΄μ€ μμ λ¨κ³μ μΌλ‘ μ κ·Έλ μ΄λ
π JUnit μμ΄ λΉμ¦λμ€ λ‘μ§μ λ¨μ ν μ€νΈ μ μ©
- JUnitμ ν μ€νΈλ₯Ό νκΈ° μν νμ€ ν μ€νΈ νλ μμν¬
- ν μ€νΈ νλ μμν¬ μμ΄ λ¨μ ν μ€νΈλ₯Ό μ μΌ μ½κ³ λΉ λ₯΄κ² μ μ©ν μ μλ λΆλΆ : ν¬νΌ ν΄λμ€ or μ νΈλ¦¬ν° ν΄λμ€
π‘ μ νΈλ¦¬ν° ν΄λμ€ : Utility Class
- μ νΈλ¦¬ν° ν΄λμ€μ λ©μλλ€μ μΌλ°μ μΌλ‘ ν΄λμ€μ κ°μ²΄λ‘ μΈμ€ν΄μ€ν λ νμκ° μμ΄ μ μ λ©μλλ‘ κ΅¬μ±
π‘ Given - When - Then νν μ€νμΌ
- BDD(Behavior Driven Development)λΌλ ν μ€νΈ λ°©μμμ μ¬μ©
- λ¨μ ν μ€νΈμ μ΅μνμ§ μκ±°λ ν μ€νΈ μΌμ΄μ€μ κ°λ μ±μ λμ΄κΈ° μν΄ μ¬μ©
βͺοΈ Given
- ν μ€νΈλ₯Ό μν μ€λΉ κ³Όμ λͺ μ
- ν μ€νΈμ νμν μ μ μ‘°κ±΄λ€ ν¬ν¨
- ν μ€νΈ λμμ μ λ¬λλ μ λ ₯ κ° (ν μ€νΈ λ°μ΄ν°) ν¬ν¨
- ex) νμ¬ κ°, μ»μ κ°
βͺοΈ When
- ν μ€νΈ ν λμ μ§μ
- ex) μ€μ κ°, κΈ°λνλ κ°
βͺοΈ Then
- ν μ€νΈμ κ²°κ³Όλ₯Ό κ²μ¦νλ μμ
- ex) μμνλ κ°κ³Ό λμ μν κ²°κ³Ό κ°μ λΉκ΅ν΄μ κΈ°λν λλ‘ λμμ΄ μννλμ§ κ²μ¦νλ μ½λ ν¬ν¨
π‘ Assertion : μ΄μ¨μ = λ¨μΈλ¬Έ, λ¨μ λ¬Έ
- ν μ€νΈ μΌμ΄μ€μ κ²°κ³Όκ° λ°λμ μ°Έμ΄μ΄μΌ νλ€λ κ²μ λ Όλ¦¬μ μΌλ‘ νν
- μμνλ κ²°κ³Ό κ°μ΄ μ°Έμ΄κΈ°λ₯Ό λ°λΌλ κ²
π JUnit μΌλ‘ λΉμ¦λμ€ λ‘μ§μ λ¨μ ν μ€νΈ μ μ©
π‘ JUnit :
- Javaμ νμ€ ν μ€νΈ νλ μμν¬
- Java μΈμ΄λ‘ λ§λ€μ΄μ§ μ ν리μΌμ΄μ μ ν μ€νΈ νκΈ° μν μ€ν μμ€ ν μ€νΈ νλ μμν¬
βͺοΈ JUnitμ μ¬μ©ν ν μ€νΈ μΌμ΄μ€ κΈ°λ³Έ ꡬ쑰
public class JunitTest {
@Test
public void test1() {
//ν
μ€νΈ νκ³ μ νλ λμμ λν ν
μ€νΈ λ‘μ§ μμ±
}
@Test
public void test2() {
//ν
μ€νΈ νκ³ μ νλ λμμ λν ν
μ€νΈ λ‘μ§ μμ±
}
@Test
public void test3() {
//ν
μ€νΈ νκ³ μ νλ λμμ λν ν
μ€νΈ λ‘μ§ μμ±
}
}
→ μ ν리μΌμ΄μ μμ ν μ€νΈ νκ³ μ νλ λμμ΄ μμΌλ©΄
β void νμ λ©μλ λ§λ€κΈ° β‘ @Test μ λν μ΄μ μΆκ° β’ ν μ€νΈ λμ λ©μλμ λν ν μ€νΈ λ‘μ§ μμ±
βͺοΈ Assertion λ©μλ μ΄μ©
- μμνλ κ²°κ³Ό κ°μ΄ μ°Έμ΄κΈΈ λ°λΌλ λ Όλ¦¬μ μΈ νν / κ²μ¦
πΉ assertEquals( )
public class JUnitTest {
@DisplayName("Hello JUnit Test")
@Test
public void assertionTest() {
String expected = "Hello, JUnit";
String actual = "Hello, JUnit";
assertEquals(expected, actual);
}
}
- assertEquals( )λ₯Ό μ¬μ©νμ¬ κΈ°λνλ κ°κ³Όμ€μ κ²°κ³Ό κ°μ΄ κ°μμ§ κ²μ¦ν μ μμ
- @DisplayName( ~ )μ ν μ€νΈ μΌμ΄μ€λ₯Ό μ€νμμΌ°μ λ μ€ν κ²°κ³Ό μ°½μ νμλλ μ΄λ¦μ μ§μ νλ λΆλΆ
πΉ assertNotNull
public class NotNullTest {
@DisplayName("Assertion Null Test")
@Test
public void assertNotNullTest() {
String houseName = getHouse("ABC");
assertNotNull(houseName, "Shoud be not null");
}
private String getHouse(String unit){
return House.map.get(unit);
}
}
- assertNotNull( )λ₯Ό μ¬μ©νμ¬ ν μ€νΈ λμ κ°μ²΄κ° nullμ΄ μλμ§ ν μ€νΈ ν μ μμ
- assertNotNull( ν μ€νΈ λμ κ°μ²΄, ν μ€νΈμ€ν¨ μ νμν λ©μμ§ )
πΉ assertThrows( )
public class AssertionExceptionTest {
@DisplayName("throws NullpointerException when map.get()")
@Test
public void assertionTrowExceptionTest(){
assertThrows(NullpointerException.class, () -> getHouse("AC"));
}
private String getHouse(String unit){
return House.map.get(unit).toUpperCase();
}
}
- assertThrows( )λ νΈμΆν λ©μλμ λμ κ³Όμ μ€μ μμΈκ° λ°μνλμ§ ν μ€νΈ ν μ μμ
- assertThrows( λ°μμ΄ κΈ°λλλ μμΈ ν΄λμ€, ν μ€λ λμ λ©μλ )
- ν μ€νΈ μΌμ΄μ€λ₯Ό μ€ννλ©΄
→getHouse( )κ° νΈμΆ → νλΌλ―Έν°λ‘ "AC"λ₯Ό μ λ¬ → ν΄λΉνλ ν€κ° μλμ§ mapμμ μ°Ύμ → "AC" ν€κ° mapμ μ‘΄μ¬ X
→ mapμμ null κ° λ°ν → mapμμ λ°νλ κ°μ΄ null μΈ μνμμ toUpperCase()λ₯Ό νΈμΆν΄μ λλ¬Έμλ‘ λ³ν μλ
→ NullPointerException λ°μ → NullpointerExceptionμ΄ λ°μν κ²μΌλ‘ κΈ°λνμ¬ ν μ€νΈ μ€ν κ²°κ³Όλ μ±κ³΅ !
βͺοΈ ν μ€νΈ μΌμ΄μ€ μ€ν μ , μ μ²λ¦¬
πΈ @BeforeEach
public class BeforeEachTest{
@BeforeEach
public void init( ) {
System.out.println("Before Each Test Case");
}
@DisplayName("BeforeEach Test 1")
@Test
public void beforeEachTest1() {
}
@DisplayName("BeforeEach Test 2")
@Test
public void beforeEachTest2() {
}
}
//κ²°κ³Ό
Before Each Test Case
Before Each Test Case
- init( )μ΄ λ λ² μ€νλμ΄ μ½μμ λ λ² μΆλ ₯λ¨
- @BeforeEachλ₯Ό μΆκ°ν λ©μλλ ν μ€νΈ μΌμ΄μ€κ° κ°κ° μ€νλ λ λ§λ€ ν μ€νΈ μΌμ΄μ€ μ€ν μ§μ μ λ¨Όμ μ€νλμ΄ μ΄κΈ°ν μ§ν
- @Testκ° 2κ°λκΉ 2λ² μΆλ ₯λ κΌ΄ ! μ¦, init( ) → Test 1 → init( ) → Test 2 !!
πΈ @BeforeAll
- @BeforeAllμ ν΄λμ€ λ 벨μμ ν μ€νΈ μΌμ΄μ€λ₯Ό νκΊΌλ²μ μ€ν μν€λ©΄ λ± νλ²λ§ μ΄κΈ°ν μμ μ νλ μ λν μ΄μ
μ¦, init( ) → Test 1 → Test 2 !!
- @BeforeAllμ μΆκ°ν λ©μλλ μ μ λ©μλμ¬μΌ ν¨
βͺοΈ ν μ€νΈ μΌμ΄μ€ μ€ν ν, νμ²λ¦¬
πΈ @AfterEach, @AfterAll
- @BeforeEach, @BeforeAllκ³Ό λμ λ°©μμ κ°κ³ νΈμΆ λλ μμ λ§ λ°λ
βͺοΈ Assumptionμ μ΄μ©ν μ‘°κ±΄λΆ ν μ€νΈ
- Assumptionμ ' -λΌκ³ κ°μ νκ³ 'λΌλ ννμ μΈ λμ κ°μ μ ν΄λΉν¨
πΉassumTrue( )
public class AssumptionTest {
@DisplayName("Assumption Test")
@Test
public void assumptionTest( ){
assumeTrue(System.getProperty("os.name").startsWith("Windows"));
System.out.println("execute?");
assertTrue(processOnlyWindowsTask());
}
private boolean processOnlyWindowsTask( ) {
return true;
}
}
- assumeTrueλ νλΌλ―Έν°λ‘ μ λ ₯λ κ°μ΄ true μ΄λ©΄ λλ¨Έμ§ μλ λ‘μ§ μ€ν
- System.getProperty("os.name").startsWith("Windows")λ
ν μ€νΈμΌμ΄μ€λ₯Ό μ€ννλ PC μ΄μ체μ κ° WindowsλΌλ©΄ μ΄λΌλ μλ―Έ
ππ» Hamcrest
- JUnit κΈ°λ°μ λ¨μν μ€νΈμμ μ¬μ©ν μ μλ Assertion Framework
βͺοΈ Hamcrestλ₯Ό μ¬μ©νλ μ΄μ
- Assertionμ μν λ§€μ³κ° μμ°μ€λ¬μ΄ λ¬Έμ₯μΌλ‘ μ΄μ΄μ Έ κ°λ μ± ν₯μ
- ν μ€νΈ μ€ν¨ λ©μμ§λ₯Ό μ΄ν΄νκΈ° μ¬μ
- λ€μν λ§€μ³ μ 곡
βͺοΈ JUnit Assertionμ μ¬μ©ν λ¨μν μ€νΈμ Hamcrest - Assertion μ μ©
public class HamcrestTest{
@DisplayName("Hello Junit Test Using Hamcrest")
@Test
public void assertionTest()
String expected = "Hello";
String actual = "Hello";
assertThat(actual, is(equalTo(expected));
}
}
βΈ JUnit Assertion μ΄μ© : assertEquals(expected, actual);
- νλΌλ―Έν°λ‘ μ λ ₯λ κ°μ λ³μ μ΄λ¦μ ν΅ν΄ λλ΅μ μΌλ‘ μ΄λ€ κ²μ¦μ νλ €λμ§ μ μ μμΌλ ꡬ체μ μλ―Έ μ μΆ νμ
βΈ Hamcrestμ Matcher μ΄μ© : assertThat(actual, is(equalTo(expected));
- μ½λλ‘ assert that acual is equal to expectedλ‘ μ½μ μ μμ
→ κ²°κ³Ό κ°μ΄ κΈ°λ κ°κ³Ό κ°λ€λ κ²μ κ²μ¦νλ€λ μλ―Έ
- assertThat( ν μ€νΈ λμμ μ€μ κ²°κ³Ό, κΈ°λνλ κ° )