Unit test - f-lab-edu/practice-mall GitHub Wiki
Unit test λ¨μν μ€νΈ, λ¨μν μ€νΈλ κ΅¬μ± μμ λλ λͺ¨λ ν μ€νΈλ μμλλ λμμ κ²μ¦νκΈ° μν΄ κ²©λ¦¬λ μμ€ μ½λλ₯Ό ν μ€νΈνλ μννΈμ¨μ΄ ν μ€νΈμ ν ννμ΄λ€.
- λ¨μν μ€νΈμ λͺ©μ
- μ½λμ μ νμ±μ νμΈνλ€.
- λͺ¨λ κΈ°λ₯κ³Ό μ μ°¨λ₯Ό ν μ€νΈνλ€.
- κ°λ° μ£ΌκΈ° μ΄κΈ°μ λ²κ·Έλ₯Ό μμ νκ³ λΉμ©μ μ κ°
- λ¨μν μ€νΈμ μ ν
μλν μ€νΈμ μλνν μ€νΈκ° μλ€.
- λ¨μν μ€νΈ 3κ°μ§ κΈ°λ²
Black Box Testing,White Box Testing,Gray Box Testing (μ 리νμ)
- μ λν μ€νΈ? ν΅ν©ν μ€νΈ?
- μ λ ν μ€νΈλ μμ λ¨μμ μ½λ, μ£Όλ‘ λΉμ¦λμ€ λ‘μ§μ ν μ€νΈνλ λ° μ¬μ© λ°λ©΄, ν΅ν© ν μ€νΈλ μ ν리μΌμ΄μ μ μ¬λ¬ κ΅¬μ± μμκ° ν¨κ» λμνλμ§λ₯Ό νμΈνλ λ° μ¬μ©
- μ λ ν μ€νΈλ λΉ λ₯΄κ² μ€νλλ©°, μ½λμ μμ λΆλΆμ μ§μ€μ μΌλ‘ ν μ€νΈ, ν΅ν© ν μ€νΈλ μ 체 μ ν리μΌμ΄μ μ λμμ νμΈνκΈ° λλ¬Έμ μ€ν μκ°μ΄ κΈΈμ΄μ§ μ μμ
Spring Boot μμ ν μ€νΈ
μ€νλ§ λΆνΈλ μ΄λ¬ν ν μ€νΈλ₯Ό μ½κ² μμ±ν μ μλ λ€μν λꡬμ μ΄λ Έν μ΄μ μ μ 곡
@SpringBootTest :ν΅ν© ν μ€νΈλ₯Ό μ½κ² μμ±ν μ μκ² ν΄μ€, λ¨μν μ€νΈ(μ λν μ€νΈ)μ λΆλ¦¬ν΄μΌνλ€.
μ λν μ€νΈ μμ±
- μ½λμ μμ λ¨μλ₯Ό ν μ€νΈνλ λ° μ¬μ©
- μ£Όλ‘ λΉμ¦λμ€ λ‘μ§μ ν μ€νΈ
- μΈλΆ μμ‘΄μ±μ μ΅μννλ κ²μ΄ μ€μ
JUnit(μλ°μμ μ¬μ©νλ ν μ€νΈνλ μμν¬)κ³Ό mock objects μ¬μ©ν΄ μ½λλ₯Ό 격리νμ¬ ν μ€νΈν μ μλ€. (μΈλΆ μμ‘΄μ±μ λͺ¨νΉνμ¬ ν μ€νΈν μ μμ)
[mock objects]
MockitoλΌμ΄λΈλ¬λ¦¬ (μΈλΆμμ‘΄μ±μ λͺ¨νΉνμ¬ ν μ€νΈν μ μκ² ν¨)λ₯Ό ν΅ν΄ λΉμ λμ λͺ¨μλ‘ κ΅¬μ±
μ¦, Mockitoλ₯Ό μ¬μ©ν΄ mapper λ repositoryλ₯Ό λͺ¨νΉνκ³ Junit λ₯Ό μ¬μ©ν΄ κ²°κ³Όλ₯Ό κ²μ¦νλ€.
μ΄λ DBμ μ κ·Όμ μ΅μνν μ μλ€.
[μ λν μ€νΈ μ§μ ν΄λμ€] org.springframework.test.util
org.springframework.test.web
[ Mockito λΌμ΄λΈλ¬λ¦¬μ μ£Όμ ]
@Mock : λͺ¨μ κ°μ²΄ μμ±
@InjectMocks : ν μ€νΈλ κ°μ²΄μ λͺ¨μ νλλ₯Ό μλμΌλ‘ μ£Όμ
@RunWith(MockitoJUnitRunner.class) :Mock κ°μ²΄λ₯Ό μ¬μ©νκΈ° μν μ΄λ Έν μ΄μ μΌλ‘ JUnit4μμ μ¬μ©
@ExtendWith(MockitoExtension.class):Mock κ°μ²΄λ₯Ό μ¬μ©νκΈ° μν μ΄λ Έν μ΄μ μΌλ‘ JUnit5μμ μ¬μ©
@MockBean : @Mockμ κ²½μ° λ¨μΌ ν΄λμ€μ ν΄λΉ λ©μλμ μ΄μ μ λ§μΆ λ¨μν μ€νΈ νλκ²½μ° @MockBeanμ ν΅ν©ν μ€νΈμ μ£Όλ‘ μ¬μ©λλ©΄μ 컨νΈλ‘€λ¬ λ¨μ ν μ€νΈμ μ¬μ©
! λ€λ₯Έ μ΄λ Έν μ΄μ μΆκ° μμ
@WebMvcTest :
ν΅ν©ν μ€νΈ μμ±
μ 체 μ ν리μΌμ΄μ μ μ€μ λμμ νμΈνκΈ° μν΄μλ ν΅ν© ν μ€νΈ (λ°μ΄ν°λ² μ΄μ€, μΉ κ³μΈ΅, μλΉμ€ κ³μΈ΅ λ±μ ν¬ν¨ν μ 체 μ ν리μΌμ΄μ μ λμμ ν μ€νΈ)
μ€νλ§ μ»¨ν μ΄λλ₯Ό λμμΌνκΈ° λλ¬Έμ μκ°μ΄ μμ
μ€νλ§λΆνΈμμλ @SpringBootTest μ΄λ Έν μ΄μ μ μ¬μ©νμ¬ ν΅ν© ν μ€νΈλ₯Ό μμ±νλ€.
Controller , Service Unit Test
controller : 컨νΈλ‘€λ¬λ λ€μ΄μ€λ HTTP μμ²μ μ²λ¦¬νκ³ HTTP μλ΅μ 보λ΄λ μν μ μ£Όλ‘νκΈ° λλ¬Έμ μ¬λ°λ₯Έ κ²½λ‘λ‘ μ μ ν μμ μ΄ νΈμΆλλμ§ μμ μ΄ μ¬λ°λ₯Έ 보기λ μλ΅ μ νμ λ°ννλμ§ νμΈν΄μΌνλ€.
service : μλΉμ€λ μ ν리μΌμ΄μ μ ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ ꡬννκΈ°μ κΈ°λ₯ ν μ€νΈ κ° λ©μλμμ μ¬λ°λ₯Έ λ°μ΄ν°λ₯Ό λ°ννλμ§ νμΈνλ€. λν λ°μ΄ν°κ° μ λ³κ²½λλμ§ νμΈνλ€.
[controller μ λν μ€νΈμ μ¬μ©ν΄μΌνλ μ΄λ Έν μ΄μ ]
@WebMvcTest : μ€νλ§ MVC κ³μΈ΅ ν μ€νΈλ₯Ό μν μ΄λ Έν μ΄μ μΌλ‘, 컨νΈλ‘€λ¬ ν΄λμ€λ§ λ‘λνμ¬ ν μ€νΈνκ³ κ΄λ ¨λ λ·°λ λ°μ΄ν°λ² μ΄μ€μ κ°μ λ€λ₯Έ λΉλ€μ μ¬μ©νμ§ μλλ€.
@MockBean : μμ‘΄μ±μΌλ‘ λ±λ‘λ λΉμΈ κ²½μ° Mock κ°μ²΄λ‘ λ체ν΄μΌ νλλ°, μ¬κΈ°μ @MockBeanμ μ¬μ©
νΉμ 컨νΈλ‘€λ¬μ λμμ ν μ€νΈνκ³ , κ΄λ ¨λ λΉλ€μ Mock κ°μ²΄λ‘ λ체νμ¬ ν μ€νΈ
(μ΄λ κ² μ€νλ§μ»¨ν μ€νΈμ λΉμ΄ λλ‘λ κ²μ μ¬μ©νλ μ΄μ λ 컨νΈλ‘€λ¬μ μν λλ¬Έμ΄μ§ μμκΉμΆμ -> λ μ°Ύμλ³Ό μμ )
[Service μ λν μ€νΈμ μ¬μ©ν΄μΌνλ μ΄λ Έν μ΄μ ]
@Mock : Mockito λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ Mock κ°μ²΄λ₯Ό μμ±νκΈ° μν μ΄λ Έν μ΄μ , κ°λ¨ν μμ±λκ³ μνλ λ©μλμ λμμ μ§μ , μ€νλ§μ»¨ν μ€νΈμ κ΄κ³μμ΄ μ¬μ©ν μ μλ μ₯μ μ΄ μλ€.
@InjectMocks : μ μ€λͺ κ³Ό λμΌ
- @Mock μ @MockBean μ°¨μ΄μ νμ€ μ 리
@Mock λ Mockito λΌμ΄λΈλ¬λ¦¬μμ μ 곡νλ Mock κ°μ²΄λ₯Ό μμ±νκΈ° μν μ΄λ Έν μ΄μ μ΄κ³ μ€νλ§ μ»¨ν μ€νΈμ Mock κ°μ²΄λ₯Ό λ±λ‘νλ μ΄λ Έν μ΄μ μΌλ‘, μ€μ λ‘ λΉμΌλ‘ λ±λ‘λλ©° μ€νλ§μμ κ΄λ¦¬
Controller
Service
@WebMvcTest, @SpringBootTestμ κ°μ ν μ€νΈλ₯Ό μ¬μ©νλ©΄ Serviceλ§μ ν μ€νΈνκΈ°κ° μ΄λ ΅κΈ° λλ¬Έμ @ExtendWith(MockitoExtension.class) νμ©ν΄ Mockito λ₯Ό μ¬μ©νκ² λλ€.
- Service λ΄μ μμ‘΄νκ³ μλ Mapperλ₯Ό @MockμΌλ‘ μ μΈνλ©΄ Mapper Beanμ μμ‘΄νμ§ μκ³ ν μ€νΈκ° κ°λ₯ν΄μ§λ€.
- Service λ₯Ό @InjectMocksλ‘ μ μΈν¨μΌλ‘μ¨, @MockμΌλ‘ μ μΈλ κ°μ§ κ°μ²΄λ€μ μμ‘΄ν Service κ°μ²΄κ° μμ±λλ€.
Mockito
[verify - κ²μ¦]
[ArgumentMatchers]
Mock testλ₯Ό μ§ννλ©΄μ νμν κ°μ²΄λ₯Ό mockingνκ³ , κ·Έ κ°μ²΄μ νΉμ λ©μλκ° μ€νλ λ, μ΄λ€ κ°μ λ°ννλμ§ μ€μ νλ κ²½μ°