Spring Test
DBμ μ κ·Όνλ μ½λλ₯Ό ν μ€νΈνκ³ μΆμ λλ μ΄λ»κ² ν΄μΌν κΉ?
λ¨μνκ² μλ²λ₯Ό μ€νμν€κ³ , μ€μ λ°μ΄ν°λ₯Ό μ λ ₯ν΄λ³Ό μ μλ€. νμ§λ§ λ§€λ² μ΄ μμ μ νλ κ²μ μλΉν λ²κ±°λ‘μ΄ μΌμ΄λ€. ν μ€νΈ μ½λλ₯Ό νμ©ν΄λ³΄μ.
ν
μ€νΈ μ½λλ src/test
μ μμΌλ―λ‘, src/test
μμμ application.properties
νμΌμ μ€μ ν΄μΌ νλ€. κ·Έλ¬λ―λ‘ μ΄ μμμ DB urlμ΄λ username λ± μ€μ μ ν΄μΌ νλ€.
ν μ€νΈ μ½λλ₯Ό μμ±ν΄λ³΄μ.
μμ κ°μ μ€μ μ ν μ€νΈλ λ¬Έμ μ μ΄ μ‘΄μ¬νλ€. μ€μ μ€νν μλ²μ λ°μ΄ν°λ² μ΄μ€μ ν μ€νΈμ λ°μ΄ν°λ² μ΄μ€κ° λμΌνλ€. λ°λΌμ μ΄μ μ μλ²λ₯Ό μ€ννλ©΄μ μ μ₯λ λ°μ΄ν°λ€μ΄ 보κ΄λμ΄ μλ€. μ¦, λ°μ΄ν°λ² μ΄μ€λ₯Ό λΆλ¦¬μμΌμΌ νλ€.
λ°μ΄ν°λ² μ΄μ€ λΆλ¦¬
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ ν μ€νΈ νκ²½κ³Ό μ€μ νκ²½μ λΆλ¦¬μμΌμΌ νλ€. μ΄ λ λ μ¬λ¦΄ μ μλ κ°μ₯ κ°λ¨ν λ°©λ²μ ν μ€νΈ μ μ© DBκ° μμΌλ©΄ λλ€. μ¦ μλ‘μ΄ ν μ€νΈ μ μ© DBλ₯Ό λ§λ€κ³ ν μ€νΈ μ½λλ μ΄ DBλ₯Ό ν΅ν΄μ μ€ννλλ‘ νλ©΄ λλ€.
μ΄ λ ν
μ€νΈ λ°μ΄ν°λ² μ΄μ€μλ ν
μ€νΈν ν
μ΄λΈμ μμ±ν΄μΌ νλ€. κ·Έλ¦¬κ³ src/test/application.properties
λ₯Ό ν
μ€νΈ νκ²½μ λ§κ² λ€μ μ€μ νλ€.
μ΄λ κ² ν νμ ν
μ€νΈλ₯Ό μ€ννλ©΄ μλ²½ν κΉ? ν
μ€νΈλ₯Ό μ¬λ¬ κ° ν΄μΌλλ μν©μ λ μ¬λ €λ³΄μ. save()
ν
μ€νΈκ° μ€νλλ©΄ μ½λ λ΄μ μ½μ
λ Itemμ κ·Έλλ‘ μ‘΄μ¬ν κ²μ΄λ€. μ΄ λ λ€λ₯Έ ν
μ€νΈκ° μλ€λ©΄, μ΄ ν
μ€νΈμ save()
μμ μμ±λ Itemμ μ΄ ν
μ€νΈμ μν₯μ μ£Όκ² λλ€.
λ§μ½μ μ λν¬ ν€μ ν΄λΉνλ λ°μ΄ν°κ° μ½μ λμ§ μλ κ²μ νμΈνλ ν μ€νΈκ° μλ€κ³ ν΄λ³΄μ.
μ΄ μ½λλ λ§μ§λ§ λ‘μ§μμ μ½μ
μ΄ μλλμ§ νμΈνλ€. κ·Έλ°λ° λ§μ½ save()
μμ ItemAμ κ°μ μ λν¬ν€λ₯Ό κ°μ§λ λ°μ΄ν°κ° μ΄λ―Έ μ½μ
λμλ€λ©΄, ItemA μ½μ
λ¨κ²μμ μ€λ₯κ° λ°μνλ€. κ²°κ³Όμ μΌλ‘ μμ μ€νλ ν
μ€νΈλ‘ μΈν΄ ν΄λΉ ν
μ€νΈκ° μν₯μ λ°μλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄μλ κ°κ°μ ν
μ€νΈλ λ
립μ μΌλ‘ λμν΄μΌ νλ€.
ν μ€νΈμ μμ΄μ μ€μν μμΉμ΄ μλ€.
ν μ€νΈλ λ€λ₯Έ ν μ€νΈμ 격리ν΄μΌ νλ€.
ν μ€νΈλ λ°λ³΅ν΄μ μ€νν μ μμ΄μΌ νλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μ ν
μ€νΈκ° λλ λλ§λ€ μΆκ°λ λ°μ΄ν°μ DELETE SQL
λ¬Έμ μ¬μ©νλ κ²λ λ°©λ²μ΄ λ μ μμ§λ§, μ΄ λ°©λ²μ΄ μ’μ ν΄κ²°μ±
μΌ κ² κ°μ§λ μλ€. λ§μ½ μ€κ°μ μ€ν¨νλ€λ©΄, DELETE SQL
μ νΈμΆνμ§ λͺ»ν μλ μλ€.
λ‘€λ°±
νΈλμμ μ λν΄μ μκ°ν΄λ³΄μ. νΈλμμ μ 컀λ°κ³Ό λ‘€λ°±μ΄ μ‘΄μ¬νλ€. μ°λ¦¬λ λ‘€λ°±μ μ΄μ©νλ€.
ν μ€νΈκ° λλκ³ νΈλμμ μ λ‘€λ°±νλ€λ©΄ λ°μ΄ν°λ μ κ±°λλ€. μ€κ°μ μ€ν¨νλ€νλλΌλ, νΈλμμ μ 컀λ°νμ§ μμκΈ° λλ¬Έμ DBμ ν΄λΉ λ°μ΄ν°λ λ°μλμ§ μλλ€. λ°λΌμ κ°κ°μ ν μ€νΈλ₯Ό νΈλμμ λ¨μλ‘ μκ°νκ³ , ν΄λΉ ν μ€νΈ μ’ λ£ μ λ‘€λ°±μ μννλ€.
κ° ν
μ€νΈμ μ μ©νκΈ° μν΄ @BeforeEach
, @AfterEach
λ₯Ό μ¬μ©νλ€.
transactionManager
λ PlatformTransactionManager
λ₯Ό μ£Όμ
λ°μμ μ¬μ©νλ€. μ€νλ§ λΆνΈλ μλμΌλ‘ μ μ ν νΈλμμ
λ§€λμ λ₯Ό μ€νλ§ λΉμΌλ‘ λ±λ‘νλ€. @BeforeEach
λ₯Ό ν΅ν΄ κ°κ° ν
μ€νΈ μΌμ΄μ€ μ€ν μ μ νΈλμμ
μ μ€ννλ€. @AfterEach
λ₯Ό ν΅ν΄ ν
μ΄νΈ μΌμ΄μ€ μλ£ ν νΈλμμ
μ λ‘€λ°±νλ€.
@Transactionnal
μμμ μ°λ¦¬λ @BeforeEach
, @AfterEach
λ₯Ό μ¬μ©νλ€. μ΄ κ³Όμ λ§μ λ μ€νλ§μ @Transactional
μ λ
Έν
μ΄μ
νλλ‘ κΉλνκ² ν΄κ²°ν μ μλ€.
μ€νλ§μ΄ μ 곡νλ @Transactional
μ λ
Έν
μ΄μ
μ μ£Όλ‘ μ°λ¦¬κ° μλΉμ€μμ μ¬μ©νλ©΄ λ‘μ§μ΄ μ±κ³΅μ μΌλ‘ μν μ 컀λ°νλ€. κ·Έλ°λ° μ΄ μ λ
Έν
μ΄μ
μ ν
μ€νΈμμ μ¬μ©νλ©΄ μ€νλ§μ νΈλμμ
μ μ€ννκ³ ν
μ€νΈκ° λλλ©΄ νΈλμμ
μ μλμΌλ‘ λ‘€λ°±μν¨λ€. μ΄λ μ λ
Έν
μ΄μ
μ λ©μλμ λΆμ¬λ λλ€.
μλ² λλ λͺ¨λ DB
μ μν©μ μ΄ν΄λ³΄λ©΄ ν μ€νΈμ© DBλ λ§λ€κ³ λ°λ‘ μ§μμ§λ―λ‘ DB λ΄ λ°μ΄ν°λ μ§μλμ§ μλλ€. λ¨μν ν μ€νΈ κ²μ¦μ©λμ΄κΈ° λλ¬Έμ λͺ¨λ μμ ν΄λ μκ΄μ΄ μλ€.
λͺλͺ λ°μ΄ν°λ² μ΄μ€λ μλ² λλ λͺ¨λλ₯Ό μ 곡νλ€. μλ² λλ λͺ¨λλ DBλ₯Ό μ ν리μΌμ΄μ μ λ΄μ₯ν΄μ ν¨κ» μ€ννλ€κ³ 보면 λλ€. μ ν리μΌμ΄μ μ΄ μ’ λ£λλ©΄ μλ² λλ λͺ¨λλ‘ λμνλ λ°μ΄ν°λ² μ΄μ€λ ν¨κ» μ’ λ£λκ³ , λ°μ΄ν°λ λͺ¨λ μ¬λΌμ§λ€.
src/test/application.properties
μμ λ°μ΄ν°λ² μ΄μ€μ μ κ·Όνλ μ€μ μ 보λ₯Ό μμ κ³ μ€νμν€λ©΄, μ€νλ§ λΆνΈλ μλ² λλ λͺ¨λλ‘ μ κ·Όνλ DataSource
λ₯Ό λ§λ€μ΄μ μ 곡νλ€.
μ΄ λ μλ² λλ λͺ¨λλ₯Ό μ¬μ©νλ©΄, ITEM ν μ΄λΈμ λν΄μ λͺ¨λ₯΄κ³ μλ μνκ° λλ€. ν μ€νΈλ₯Ό μ€ννκΈ°μ ν μ΄λΈ μμ± SQLμ λ λ €λ λμ§λ§ μ€νλ§ λΆνΈλ μ΄μ λν κΈ°λ₯μ μ 곡νλ€.
src/test
μ schema.sql
μ λ§λ€κ³ ν
μ΄λΈ μμ± SQLμ μμ±νλ€.
μ΄λ‘μ¨ μ°λ¦¬λ ν μ€νΈλ₯Ό μν΄ μλ²λ₯Ό μ§μ μ€νμμΌ νμΈνμ§ μμλ λλ€. κ·Έλ¦¬κ³ μ€μ μλ² DBμ ν μ€νΈ DBλ₯Ό λΆλ¦¬νμκΈ° λλ¬Έμ μλ‘μκ² μν₯μ μ£Όμ§ μκ³ , λ‘€λ°±μ ν΅ν΄ ν μ€νΈκ°μλ μλ‘ μν₯μ μ£Όμ§ μλλ€.
κ²°κ΅ ν μ€νΈλ λ€λ₯Έ ν μ€νΈμ 격리λμ΄ μκ³ , λ°λ³΅ν΄μ μ€νν μ μκ² λμλ€.
TDD(Test-Driven-Development)
TDDλ λμνλ μ½λλ₯Ό μμ±νκΈ° μ μ ν μ€νΈλ₯Ό λ¨Όμ μμ±νκ³ , κ·Έ ν μ€νΈλ₯Ό ν΅κ³Όνλ μ½λλ₯Ό μμ±ν¨μΌλ‘μ¨ ν μ€νΈλ λμνλ μ½λλ₯Ό κ°λ°νλ λ°©λ²μ΄λ€.
TDDλ μΈ κ°μ§ λ¨κ³κ° ν μ¬μ΄ν΄λ‘ μ΄λ£¨μ΄μ§λ€.
ν μ€νΈ μμ±(λΉ¨κ° λΆ)
μ€ν κ°λ₯νκ² μ½λ μμ±(μ΄λ‘ λΆ)
리ν©ν λ§
λ¨Όμ μ»΄νμΌμ‘°μ°¨ λμ§ μλ μ½λλ₯Ό λμμΌλ‘ λ¨Όμ ν μ€νΈλ₯Ό μμ±νλ€. κ·Έ λ€μ ν μ€νΈ μ½λκ° μ»΄νμΌλκ³ μ€νκΉμ§ λλλ‘ μ½λλ₯Ό μμ±ν ν, ν μ€νΈκ° ν΅κ³Όλλ©΄ ν μ€νΈμ 보νΈμλ μ½λλ₯Ό λ€λ¬λλ€.
μλ₯Ό λ€μ΄ κ³μ°κΈ°μ λν ν
μ€νΈλ₯Ό νλ€κ³ κ°μ ν΄λ³΄μ. μμ§ Calculator
κ°μ²΄μ λ©μλλ μμ±νμ§ μμλ€. μ΄ λ μ°λ¦¬λ μ‘΄μ¬νμ§ μλ κ°μ²΄λ‘ μΈν΄ μ»΄νμΌμ‘°μ°¨ λμ§ μλλΌλ λ¨Όμ μμ±νκ³ μ»΄νμΌλΆν° λλλ‘ μ½λλ₯Ό μμ±ν΄λκ°λ€. μ¦, λ¨Όμ ν
μ€νΈλ₯Ό μ€νμμΌ°μ λ λΉ¨κ° λΆμ΄ λμ€λλ‘ μ½λλ₯Ό μμ±νλ€.
κ·Έ λ€μ μμ κ³Όμ μ ν΅ν΄ λμκ°λ μ½λκΉμ§ μμ±νλ€λ©΄, μ΄μ ν΄κ²°νλ μ½λλ₯Ό μμ±νλ€. μ΄ λ κ°λ₯ν λΉ λ₯΄κ² ν μ€νΈκ° ν΅κ³Όνλ μ½λλ₯Ό μμ±νλ€. μ΄ λ μ¬κΈ°μ βλΉ λ₯΄κ²βλΌλ λ§μ μ±λ₯μ μΌλ‘ λΉ λ₯΄κ²λΌλ λ»μ΄ μλλΌ, μ΄λ‘λΆμ λμ°λ μ½λλ₯Ό 빨리 μμ±νλΌλ λ»μ΄λ€.
μ μ½λμμ Sample ν΄λμ€λ₯Ό μμ±νκ³ myState
μ λ°νκ°μ΄ trueμΈμ§ νμΈνλ€. μ΄ λ, Sample
ν΄λμ€λ₯Ό μ μνμ§ μμλ€λ©΄ μ»΄νμΌμ‘°μ°¨ λμ§ μμ κ²μ΄λ€. λ°λΌμ ν
μ€νΈλ₯Ό μ€ννλ©΄ λΉ¨κ°λΆλ‘ λμ€κ² λλ€.
κ·Έλ¬λ©΄ μ΄μ μ΄ ν
μ€νΈλ₯Ό λ리기 μν΄μ Sample
ν΄λμ€λ₯Ό μμ±ν΄μΌ νλ€.
μ΄μ ν
μ€νΈ μ½λλ μ»΄νμΌλ κ²μ΄λ€. ν
μ€νΈ λ©μλλ μ€νλμ§λ§ μ€ν¨νκ² λλ€. 보λ€μνΌ myState
λ falseλ₯Ό λ°ννλλ°, ν
μ€νΈ μ½λμμλ trueκ° κΈ°λκ°μΌλ‘ μ€μ λμ΄μλ€. μ΄ λ TDDμ λ§μΆ° μ΅λν 빨리 λΉ¨κ°λΆμ μ΄λ‘λΆλ‘ λ§λ€λ €λ©΄ μ΄λ»κ² ν΄μΌν κΉ?
μ λ§ λ¨μνκ² μκ°νλ©΄ λ°νκ°μ trueλ‘ λ§λ€λ©΄ λλ€.
μ΄μ ν μ€νΈκ° μ±κ³΅νκ² λμ΄ μ΄λ‘λΆμ λμ°κ² λλ€. TDDμ λλ²μ§Έ λ¨κ³κΉμ§ μλ£νκ² λ μ μ΄λ€. μ΄μ 리ν©ν λ§μ ν΄λ³΄μ. μ΄ κ³Όμ μμ ν μ€νΈμ μλ λ°μ΄ν°μ μ½λμ μλ λ°μ΄ν°μ μ€λ³΅μ μ κ±°ν΄μΌνλ€.
ν
μ€νΈ μ½λμλ trueκ° μ‘΄μ¬νκ³ , Sample
ν΄λμ€μ myState
μμλ trueκ° μ‘΄μ¬νλ€. κ²°κ΅ μ€λ³΅μΌλ‘ trueκ° λ±μ₯νκ³ μλ€. μ΄λ₯Ό 리ν©ν λ§ ν΄λ³΄μ.
μ΄λ₯Ό ν΅ν΄ myState
λ νλ μ½λ©λ κ°μ΄ μλλΌ κ°μ²΄ λ΄λΆμ μνλ₯Ό λ°ννκ² λλ€. κ·Έλ¦¬κ³ μμ±μμ νλΌλ―Έν° μ΄λ¦μ μλ§κ² λ³κ²½νμλ€.
νλμ ν΄λμ€λ₯Ό μ μν΄κ°λ κ³Όμ μμ μ»΄νμΌμ΄ λμ§ μλλ€λ κ²μ μλ©΄μλ μ€ννκ³ , μ»΄νμΌλ§ λ λΏ ν μ€νΈλ λΉμ°ν μ€ν¨νλ€λ κ²μ μμ§λ§ ν μ€νΈλ₯Ό μ€ννλ€. μ¬μ€ λΉμ°ν κ³Όμ μ΄λΌ μ§λ£¨νκ³ κ·Έλ₯ 건λλ°μ΄λ λ κ² κ°λ€λ μκ°μ΄ λ λ€. κ²λ€κ° μμμ μ½λλ μλΉν λ¨μν ν΄λμ€λΌ TDDκ° κ·Έλ₯ νμνμ§ μλ€κ³ λκ»΄μ§λ€.
νμ§λ§ μ§λ£¨ν¨ μμλ λ΄κ° μκ°νλλ‘ μ½λκ° λμνλ€λ νμ μ μ»μ μ μλ€. myState
λ©μλλ μμ±μλ‘ κ±΄λ€μ€ μνλ₯Ό λ°ννλ€. μ΄ μ½λμ μμλ μλΉν λ¨μνμ§λ§, μ½λκ° κΈΈμ΄μ‘μ λ λ‘μ§ μ λ¬Έμ κ° λ°μν΄μ λλ €λ³΄κ³ κ°μ λ£μ΄λ³΄κ³ λ‘κ·Έλ₯Ό μ°μ΄λ³΄λ μν©μ΄ λ§λ€. μ΄ λ TDDμ λν΄ μ μν μΌνΈλ°±μ μ½λ λ³κ²½μ λν λλ €μμ μ§λ£¨ν¨μ λ°κΎΈλ κ³Όμ μ΄λΌ λ§νλ€.
μμ μν©μ²λΌ μ΄λ° μ½λλ μμ λ¨κ³λ‘ μΈλΆνν νμλ μμ§λ§, νμν κ²½μ° μμ λ¨κ³λ‘ λλμ΄ μ§νν μ€ μμμΌ νλ€.
λ¬Όλ‘ μΈμ λ TDDλ₯Ό ν΅ν κ°λ°μ΄ μΈμ λ μ’μ κ²μ μλλ€. TDD νλ‘μ°λ₯Ό ν΅ν κ°λ°μ κ·Έλ§νΌ ν μ€νΈμ 리μμ€κ° μλͺ¨λλ€. μ£Όμ΄μ§ κΈ°κ°μ΄ μ§§μλ°, TDD νλ‘μ°λ₯Ό μ μ©νμ¬ κ°λ°νλ€λ κ²μ λ°λμ§νμ§ μλ€. κ²°κ΅ ν μ€νΈ μ½λλ₯Ό μμ±νλ λΉμ©κ³Ό μμμ μΌλ‘ ν μ€νΈνλ λΉμ©μ λΉκ΅ν΄μΌ νλ€. μμ Sample ν΄λμ€λ μ¬μ€ λ°λ‘ Sample ν΄λμ€μ λν μ½λλ₯Ό μμ±ν΄λκ°λ κ²μ΄ ν¨μ¬ ν¨μ¨μ μ΄λ€. ν¬κ² 볡μ‘νμ§ μκ±°λ μκ·λͺ¨ νλ‘μ νΈμμ ν μ€νΈκ° μκΈ° λλ¬Έμ ν리ν°κ° λ¨μ΄μ§κΈ°λ μ½μ§μλ€.
μμνκ² κ°λ°μ΄λΌλ κ΄μ μμ TDDλ μΆ©λΆν μ’μ λ°©λ²μ΄μ§λ§, λͺ¨λ κ²μ κ³ λ €ν μ€μ μν©μμλ μ½κ² λμ νκΈ°λ μ΄λ ΅λ€κ³ μκ°νλ€.
μ°Έκ³
Last updated