Study/Java

[TIL] λ‹¨μœ„ν…ŒμŠ€νŠΈ

hong- 2022. 7. 12. 14:48

πŸ‘πŸ» λ‹¨μœ„ ν…ŒμŠ€νŠΈ

 πŸ“ ν…ŒμŠ€νŠΈ

  - μ–΄λ–€ λŒ€μƒμ— λŒ€ν•œ 일정 기쀀을 정해놓고 κ·Έ λŒ€μƒμ΄ μ •ν•΄μ§„ 기쀀에 λΆ€ν•© ν•˜λŠ”μ§€ λΆ€ν•©ν•˜μ§€ λͺ»ν•˜λŠ”μ§€λ₯Ό κ²€μ¦ν•˜λŠ” κ³Όμ •

  - ν…ŒμŠ€νŠΈλ₯Ό μ œλŒ€λ‘œ 잘 κ±°μ³μ„œ ν…ŒμŠ€νŠΈ λŒ€μƒμ΄ 검증 과정에 잘 ν†΅κ³Όν•˜κ²Œ λ§Œλ“€μ–΄ μ΅œλŒ€ν•œ 더 λ‚˜μ€ κ²°κ³Όλ₯Ό 얻을 수 있음


 πŸ“ ν…ŒμŠ€νŠΈ λΆ„λ₯˜

   : κΈ°λŠ₯ ν…ŒμŠ€νŠΈ > 톡합 ν…ŒμŠ€νŠΈ > 슬라이슀 ν…ŒμŠ€νŠΈ > λ‹¨μœ„ ν…ŒμŠ€νŠΈ

   β–ͺ️ κΈ°λŠ₯ ν…ŒμŠ€νŠΈ

   - 주둜 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ” μ‚¬μš©μž μž…μž₯μ—μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯이 μ˜¬λ°”λ₯΄κ²Œ λ™μž‘ ν•˜λŠ”μ§€ ν…ŒμŠ€νŠΈ

   - 일반적으둜 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( ν…ŒμŠ€νŠΈ λŒ€μƒμ˜ μ‹€μ œ κ²°κ³Ό, κΈ°λŒ€ν•˜λŠ” κ°’ )