리ν©ν λ§μ μν νμμ μΈ μ ν쑰건μ κ²¬κ³ ν ν
μ€νΈλ₯Ό νλ κ²μ΄λ€. λΉμ μ΄ λ¦¬νν λ§μ μλμΌλ‘ ν΄μ€ μ μλ ν΄μ κ°μ§κ³ μλ€κ³ νλλΌλ μ¬μ ν ν
μ€νΈκ° νμνλ€. λͺ¨λ κ°λ₯ν 리νν λ§μ μλμΌλ‘ ν΄μ£Όλ ν΄μ΄ λμ€λλ°λ μ€λ μκ°μ΄ 걸릴 κ²μ΄λ€.
λλ μ΄κ²μ λ¨μ μΌλ‘ λ³΄μ§ μλλ€. λλ λ΄κ° 리νν 리λ₯Ό νλ μ€μ΄ μλλΌ νλλΌλ, μ’μ ν
μ€νΈλ νλ‘κ·Έλλ° μλλ₯Ό λΉμ½μ μΌλ‘ ν₯μμν¨λ€λ κ²μ λ°κ²¬νλ€. μ΄κ²μ λ§μ νλ‘κ·Έλλ¨Έλ€μ ν΅λ
κ³Όλ λ°λλλ€λ μ μμ λλΌμ΄ κ²μ΄λ€. κ·Έλ κΈ° λλ¬Έμ, μ κ·Έλ¬νμ§μ λν μ΄μ λ₯Ό μ€λͺ
ν λ§ν κ°μΉκ° μλ€.
The Value of Self-testing Code ¶
νλ‘κ·Έλλ¨Έλ€μ΄ μκ°μ μ°λ κ²μ κ°λ§ν μ΄ν΄λ³΄λ©΄, μ€μ μ½λλ₯Ό μ°λ μκ°μ μμ λΆλΆμ΄κ³ λλΆλΆμ μκ°μ λλ²κΉ
μ μλΉνλ€. κ·Έλ¦¬κ³ λ²κ·Έλ₯Ό μ°Ύλ λ° λ§μ μκ°μ 보λ΄κ³ μμ νλ κ²μ κΈλ°©μ΄λ€. λͺ¨λ νλ‘κ·Έλλ¨Έλ€μ λ²κ·Έλ₯Ό μ°Ύλλκ³ λ°€μμλ μ΄μΌκΈ°λ€μ νλ λ μ΄μμ κ°μ§κ³ μμ κ²μ΄λ€. ^^; κ²λ€κ° λ²κ·Έ νλλ₯Ό μ‘μλ μ¬μ ν λ€λ₯Έ κ³³μμ λ²κ·Έκ° μκΈΈ κ°λ₯μ±μ΄ μλ€. μ΄λ κ² λλ©΄ λ²κ·Έλ₯Ό μ‘λλ° λ§μ μκ°μ μλΉνλ€.
λλ‘νμ¬κΈ self-testing codeλ‘μ κΈΈμ μμνκ² ν κ³κΈ°λ OOPSLA '92μ ν μ΄μΌκΈ°λΆν°μλ€. κ·Έλ λκ΅°κ° (μλ§λ Dave Thomas)"ν΄λμ€λ μκΈ° μμ μ ν
μ€νΈμ½λλ₯Ό κ°μ§κ³ μμ΄μΌ νλ€" λΌλ λ§μ νλ€. μ΄ λ§μ ν
μ€νΈλ₯Ό ꡬμ±νκΈ° μν μ’μ λ°©λ²μΌλ‘ μ¬κ²¨μ‘λ€. λλ λͺ¨λ ν΄λμ€μ ν΄λμ€ μ€μ€λ‘λ₯Ό ν
μ€νΈνλ λ©μλλ€ (testλΌ νλ€.)λ€μ κ°μ§λλ‘ λ§λ€μλ€.
κ·Έλ λλ increment developmentλ¨κ³μ μμκ³ , λλ λ§€λ² increment μ μλ£ν λ ν΄λμ€λ€μ test methodλ€μ μΆκ°νλ€. κ·Έλ νλ νλ‘μ νΈλ κ½€ μμμκ³ , μ°λ¦¬λ μ°λ¦¬μ increment μ£ΌκΈ°λ νμ£Ό λ¨μμ λμλ€. ν
μ€νΈμ μ€νμ λ κ½€ μμνκ² λμλ€. νμ§λ§ ν
μ€νΈλ€μ μ€ννκΈ° μ¬μ μ§λ§, ν
μ€νΈλ₯Ό νλ κ²μ μ¬μ ν μ§κ²¨μ΄ μΌμ΄μλ€. μ΄κ²μ λ΄κ° 체ν¬ν΄μΌ νλ λͺ¨λ ν
μ€νΈλ€μ΄ console μ κ²°κ³Όλ₯Ό μΆλ ₯νλλ‘ λ§λ€μ΄μ‘κΈ° λλ¬Έμ΄λ€. λλ κ½€ κ²μΌλ₯Έ μ¬λμ΄κ³ , λλ μΌμ νΌνκΈ° μν΄ κ½€ μ΄μ¬ν μΌμ μ€λΉνλ€. λλ μ΄ ν΄λμ€λ€μ΄ νλ¦°ν
ν΄μ£Όλ κ²μ 체ν¬νλ λμ , μ»΄ν¨ν°κ° ν
μ€νΈλ₯Ό μννλλ‘ νλ€.λ΄κ° ν μΌμ ν
μ€νΈ μ½λμ λ΄κ° κΈ°λνλ κ²°κ³Όλ₯Ό μμ±νκ³ , κ·Έ λΉκ΅λ₯Ό μννλ κ²μ΄λ€. μ, λλ λͺ¨λ ν΄λμ€λ€μ test methodλ₯Ό μνν μ μμκ³ , λͺ¨λ μΌμ΄ μ λλ©΄ λ¨μ§ 'OK' κ° μΆλ ₯λλ κ²μ νμΈνλ©΄ λμλ€. μ΄ ν΄λμ€λ μ§κΈ μ€μ€λ‘ μκΈ° μμ μ ν
μ€νΈλ₯Ό νλ€.
λͺ¨λ ν
μ€νΈκ° μλνλμλμ§ νμΈνκ³ ν
μ€νΈλ€μ κ²°κ³Όλ₯Ό ν
μ€νΈ μ½λ μ€μ€λ‘ 체ν¬νλλ‘ ν΄λΌ.
μ΄μ ν
μ€νΈλ μ»΄νμΌ λ§νΌμ΄λ κ°λ¨ν΄μ‘λ€. λλ μ»΄νμΌ ν λ λ§λ€ ν
μ€νΈλ₯Ό νλ€.κ·Έλ¦¬κ³ κ³§ λλ λ²κ·Έλ₯Ό λ°λ‘λ°λ‘ μ°ΎμλΌ μ μμλ€. λλ λ΄κ° λλ²κΉ
μ νλλ° κ·Έλ¦¬ λ§μ μκ°μ μλΉνμ§ μμμμ μκ² λμλ€. λ§μΌ λ΄κ° μ΄μ ν
μ€νΈμ μν΄ μ£Όμνλλ‘ ν, λ²κ·Έκ° μλ μ½λλ₯Ό μΆκ°νμ κ²½μ°, ν
μ€νΈλ₯Ό μ€νν λ λ°λ‘ λ³Ό μ μμλ€.
μ΄ μ¬μ€μ μμκ°μλ‘ λλ ν
μ€νΈμ μ’ λ μ κ·Ήμ μ΄ λμλ€. incrementκ° λκ°κΈ°λ₯Ό κΈ°λ€λ¦¬λ λμ μ, λλ μ‘°κ·Έλ§ν κΈ°λ₯μ μΆκ°ν λ λ§λ€ ν
μ€νΈλ₯Ό νλ€. λ§€λ² λλ μ κΈ°λ₯λ€μ μΆκ° νκ³ , κ·Έλ€μ λν ν
μ€νΈλ€μ μννλ€. μ΄ λΉμ λλ λλ²κΉ
μ μλΆμ΄μμ μλΉνμ§ μμλ€.
test suiteλ λ²κ·Έλ₯Ό μ°Ύλ μκ°μ μ€μ¬μ£Όλ κ°λ ₯ν λ²κ·Έ νμ§κΈ°μ΄λ€.
λ¬Όλ‘ λ€λ₯Έ μ΄λ€λ‘ νμ¬κΈ μ΄ κ³Όμ μ λ°λ₯΄λλ‘ μ€λνλ κ²μ μ½μ§ μλ€. ν
μ€νΈ μ½λλ₯Ό λ§λλ κ²μ κ·Έ μμ΄ λ§λ€.
κ·Έλ¦¬κ³ μ΄κ²μ΄ μ€μ λ‘ νλ‘κ·Έλλ° μλλ₯Ό λμΈλ€λ κ²μ κ²½νν΄λ³΄μ§ μμΌλ©΄ self-testing μ½λλ μ¬λλ€μ΄ μ΄ν΄ν΄μ£Όμ§ λͺ»νλ€. κ·Έλ¦¬κ³ ν μ€νΈκ° μλμ΄λΌλ©΄ μ΄κ²μ μ§λ£¨ν κ²μ΄λ€. νμ§λ§ ν μ€νΈκ° μλνλλ€λ©΄ ν μ€νΈ μ½λλ₯Ό μ°λ κ²μ κ½€ μ¬λ―Έμλ μΌμ΄ λ κ²μ΄λ€.
κ·Έλ¦¬κ³ μ΄κ²μ΄ μ€μ λ‘ νλ‘κ·Έλλ° μλλ₯Ό λμΈλ€λ κ²μ κ²½νν΄λ³΄μ§ μμΌλ©΄ self-testing μ½λλ μ¬λλ€μ΄ μ΄ν΄ν΄μ£Όμ§ λͺ»νλ€. κ·Έλ¦¬κ³ ν μ€νΈκ° μλμ΄λΌλ©΄ μ΄κ²μ μ§λ£¨ν κ²μ΄λ€. νμ§λ§ ν μ€νΈκ° μλνλλ€λ©΄ ν μ€νΈ μ½λλ₯Ό μ°λ κ²μ κ½€ μ¬λ―Έμλ μΌμ΄ λ κ²μ΄λ€.
μ¬μ€ ν
μ€νΈ μ½λλ₯Ό μμ±νκΈ° μν κ°μ₯ μ’μ λλ νλ‘κ·Έλλ°μ μμνκΈ° μ μ΄λ€. μ΄λ€ κΈ°λ₯μ μΆκ°ν΄μΌν λ, ν
μ€νΈ μ½λλ₯Ό μμ±νλ κ²μΌλ‘ μμνλ€. μ΄κ²μ λ·κ±Έμμ§ μΉλ κ²μ΄ μλλ€. κ·Έ κΈ°λ₯μ μΆκ°νκΈ° μν΄μ μ΄λ€ κ²λ€μ΄ νν΄μ ΈμΌ νλμ§ μ€μ€λ‘μκ² λ¬Όμ΄λ³΄λ κ²μ΄ λλ€. κ·Έλ¦¬κ³ ν
μ€νΈ μ½λλ₯Ό μ°λ κ²μ ꡬν보λ€λ μΈν°νμ΄μ€μ μ§μ€ν μ μκ² ν΄μ€λ€. (κ·Έλ¦¬κ³ μ΄κ²μ μΈμ λ μ’μ κ²μ΄λ€)
ν
μ€ν
μ½λλ ExtremeProgramming μ μ€μν λΆλΆμ΄λ€. Beck, XP. μ΄ μ΄λ¦μ λΉ λ₯΄κ³ κ²μΌλ₯Έ ν΄μ»€κ°μ νλ‘κ·Έλλ¨Έλ€μκ² λ§μ μ£Όλ¬Έκ³Ό κ°μ κ²μ΄λ€. νμ§λ§, extreme programmerλ€μ ν
μ€νΈμ λν΄ λ§€μ° νμ μ μ΄λ€. κ·Έλ€μ κ°λ₯ν ν μννΈμ¨μ΄κ° λΉ λ₯΄κ² λ°μ νκΈ° μνκ³ , κ·Έλ€μ ν
μ€νΈλ€μ΄ λΉμ μ μλ§ κ° μ μλ ν λΉ λ₯΄κ² κ° μ μλλ‘ λμμ€ κ²μ μλ€.
μ΄μ λμμ μ΄μΌκΈ°λ μΆ©λΆνλ€ λ³Έλ€. λΉλ‘ λ΄κ° self-testing codeλ₯Ό μμ±νλ κ²μ΄ λͺ¨λμκ² μ΄μ΅μ΄ λλ€κ³ μκ°νλλΌλ, κ·Έκ²μ μ΄ μ±
μ ν΅μ¬μ΄ μλλ€. μ΄ μ±
μ Refactoringμ κ΄ν κ²μ΄λ€. Refactoringμ testλ₯Ό μꡬνλ€. λ§μΌ Refactoring νκΈ° μνλ€λ©΄, test codeλ₯Ό μμ±ν΄μΌ νλ€.
Refactoring