🚧

TDD (Test Driven Development), ν…ŒμŠ€νŠΈ 주도 κ°œλ°œμ΄λž€?

purpplee 2021. 11. 30. 16:05

2010년에 쓰인 πŸ‘‰  μ±„μˆ˜μ›λ‹˜μ˜ TDD μ‹€μ²œλ²•κ³Ό 도ꡬ 곡개 PDF λ₯Ό μ°Έκ³ ν•˜μ˜€λ‹€.

 

μ§€κΈˆκΉŒμ§€λŠ”...

λ‚΄κ°€ μ§€κΈˆκΉŒμ§€ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κ°œλ°œν•  λ•Œ ν–ˆλ˜ 방식은 쀑간쀑간 println 이든 congole.log λ“ , ν˜Ήμ€ logging λΌμ΄λΈŒλŸ¬λ¦¬λ“  μ½˜μ†”μ°½μ— 데이터λ₯Ό 찍어보며 μ½”λ“œλ₯Ό κ²€μ¦ν–ˆλ‹€. 이런 경우 μžμ‹ μ˜ 머리둜 λŒ€λΆ€λΆ„μ„ μ˜μ‘΄ν•΄μ•Όν•œλ‹€. κ²Œλ‹€κ°€ λ§Œμ•½ κΈ°λŠ₯이 μΆ”κ°€λ˜κ±°λ‚˜ μ½”λ“œμ˜ 일뢀뢄이 λ³€κ²½λœλ‹€λ©΄? λ‹€μ‹œ 둜그λ₯Ό 찍고 λ¬Έμ œλ˜λŠ” 뢀뢄을 μ‚΄νŽ΄λ³΄λŠ” μž‘μ—…μ„ λ°˜λ³΅ν•΄μ•Ό ν•œλ‹€. 여기에 μ½”λ“œμ˜ λͺΈμ§‘이 κ±°λŒ€ν•΄μ§„λ‹€λ©΄? λ””λ²„κΉ…ν•΄μ•Όν•˜λŠ” 뢀뢄을 μ°Ύμ•„λ‚΄κΈ° 더 μ–΄λ €μ›Œμ§„λ‹€. 정신차렀보면 μ–΄λŠμƒˆ 둜그 μ°λŠ” μ½”λ“œκ°€ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직만큼 μ ν˜€ μžˆλ‹€.

 

TDD, ν…ŒμŠ€νŠΈ 주도 개발

κ·Έλž˜μ„œ λ‚˜μ˜¨ 것이 ν…ŒμŠ€νŠΈκ°€ μ£Όλ„ν•˜λŠ” 개발, TDD λ‹€. ν…ŒμŠ€νŠΈκ°€ μ£Όλ„ν•œλ‹€λŠ” 건 ν•¨μˆ˜λ‚˜ λͺ¨λ“ˆμ„ λ§Œλ“€κΈ° 전에 ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € ν•œλ‹€λŠ” 것이닀. ν”„λ‘œλ•μ…˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€λ„ μ•Šμ•˜λŠ”λ° μ–΄λ–»κ²Œ ν…ŒμŠ€νŠΈν•˜μ§€? λΌλŠ” μ˜λ¬Έμ„ κ°€μ‘ŒλŠ”λ°, μ•„λž˜ μ„€λͺ…을 λ³΄λ‹ˆ 이해가 λ˜μ—ˆλ‹€.

 

ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € ν•˜λΌ!

int a, b λ₯Ό λ”ν•œ 합계λ₯Ό λ°˜ν™˜ν•˜λŠ” sum ν•¨μˆ˜λ₯Ό μƒκ°ν•΄λ³΄μž. μ •μƒμ μœΌλ‘œ λ™μž‘ν–ˆλ‹€λ©΄ sum(a,b) = (a+b) κ°€ true 일 것이닀. ν”„λ‘œλ•μ…˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ§€ μ•Šμ•„λ„ μ–΄λ–»κ²Œ ν…ŒμŠ€νŠΈν• μ§€ 감이 μž‘νžŒλ‹€. sum(1,2) = 3 / sum(6, 20) = 26 이 true 인지 false 인지 κ²€μ‚¬ν•˜λ©΄ λœλ‹€. μ•„λž˜ μ½”λ“œλ₯Ό μ°Έκ³ ν•˜μž.

public class Calculator {
	public int sum(int a, int b) {
		return 0;
	}

	public static void main(String[] args) {
		Calculator calc = new Calculator();
		System.out.println( calc.sum(10, 20) == 30);
		System.out.println( calc.sum(1, 2) == 3);
		System.out.println( calc.sum(-10, 20) == 10);
		System.out.println( calc.sum(0, 0) == 0);
	}
}
-----μ‹€ν–‰ κ²°κ³Ό-----
false
false
false
true

μ—¬κΈ°μ„œλŠ” main λ©”μ†Œλ“œκ°€ ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œμ²˜λŸΌ μ‚¬μš©λ˜μ—ˆλ‹€. ν…ŒμŠ€νŠΈ λŒ€μƒμΈ sum λ©”μ†Œλ“œλŠ” 컴파일 μ—λŸ¬κ°€ λ‚˜μ§€ μ•ŠλŠ” 빈 μƒνƒœμ΄λ‹€. λͺΈμ²΄ μ•ˆμ„ κ΅¬ν˜„ν•˜μ§€ μ•Šκ³  ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν–ˆλ‹€. 각각의 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λΌκ³  ν•œλ‹€. λͺΈμ²΄κ°€ κ΅¬ν˜„λ˜μ§€ μ•Šμ•˜μœΌλ‹ˆ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ“€μ€ λ‹Ήμ—°νžˆ μ‹€νŒ¨ν•œλ‹€. μΌλΆ€λŸ¬ μ‹€νŒ¨ν•˜λŠ” μ½”λ“œλ₯Ό μ§  것이닀.

 

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ“€μ€ λ°”λ‘œ μœ„μ—μ„œ λ§ν•œ μ’…λ£Œ 쑰건에 λ”°λ₯Έ 것이닀. 10+20 = 30 이 λ‚˜μ˜€λ©΄ μ’…λ£Œ, -10+20=10 이 λ‚˜μ˜€λ©΄ μ’…λ£Œ... ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν–ˆμœΌλ‹ˆ 이제 λͺΈμ²΄, μ‹€μ œ ν”„λ‘œλ•μ…˜ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•œλ‹€. 그리고 λ‹€μ‹œ λŒλ Έμ„ λ•Œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ“€μ΄ λͺ¨λ‘ true 둜 좜λ ₯되면 sum λ©”μ†Œλ“œλŠ” μ •μƒμ μœΌλ‘œ μž‘μ„±λλ‹€κ³  νŒλ‹¨ν•œλ‹€. μ΄ν›„μ—λŠ” ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•œ ν”„λ‘œλ•μ…˜ μ½”λ“œλ₯Ό μ€‘λ³΅λœ 둜직이 μ—†λŠ”μ§€, μ“Έλ°μ—†λŠ” 데이터가 듀어가진 μ•Šμ•˜λŠ”μ§€ μ‚΄νŽ΄λ³΄κ³  λ¦¬νŒ©ν† λ§ν•œλ‹€.

 

μ΄λ ‡κ²Œ λ©”μ†Œλ“œ λ‹¨μœ„λ‘œ ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό λ‹¨μœ„ ν…ŒμŠ€νŠΈ(unit test) 라고 ν•œλ‹€. λ‹¨μœ„ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•¨μœΌλ‘œμ¨ 이후에 λ°œμƒν•˜λŠ” ν…ŒμŠ€νŠΈ λ‹¨κ³„μ—μ„œμ˜ 결함 λΉ„μš©μ„ 쀄인닀. 결함은 빨리 발견될 수둝 적은 λΉ„μš©μœΌλ‘œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

 

또 μ—¬κΈ°μ„œλŠ” println 으둜 좜λ ₯ν–ˆμ§€λ§Œ, 이걸 μžλ™μœΌλ‘œ ν™•μΈν•΄μ£ΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬λ“€μ΄ μžˆμœΌλ‹ˆ κ·Έκ±Έ μ‚¬μš©ν•˜λ©΄ λœλ‹€. λ”°λΌμ„œ κ°œλ°œμžλ“€μ€ 둜그λ₯Ό ν•˜λ‚˜ν•˜λ‚˜ 찍지 μ•Šμ•„λ„ μ €λ ‡κ²Œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§Œ λ§Œλ“€μ–΄λ‘λ©΄ μžλ™μœΌλ‘œ ν…ŒμŠ€νŠΈν•  수 μžˆλŠ” 것이닀.

 

TDD 의 ν”„λ‘œμ„ΈμŠ€

μœ„μ—μ„œ μ‚΄νŽ΄λ³Έ κ²ƒμ²˜λŸΌ (ν”„λ‘œλ•μ…˜ μ½”λ“œκ°€ μ—†λŠ” 빈 ν•¨μˆ˜μ΄λ―€λ‘œ) μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  -> ν…ŒμŠ€νŠΈκ°€ ν†΅κ³Όν•˜λŠ” ν”„λ‘œλ•μ…˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ³  -> μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜λŠ” 사이클을 λ ˆλ“œ κ·Έλ¦° 사이클이라고 ν•œλ‹€.

 

좜처:https://trifulcas.com/tdd-desarrollo-guiado-por-pruebas/

 

 

뭐가 μ’‹μ„κΉŒ?

μœ„μ—μ„œ κ°„λž΅ν•˜κ²Œ λ§ν•˜κ³  λ„˜μ–΄κ°”λ˜ ν…ŒμŠ€νŠΈ 개발의 μž₯점은 μ•„λž˜μ™€ κ°™λ‹€.

  1. κ°œλ°œλ‹¨κ³„ μ΄ˆκΈ°μ— 문제λ₯Ό λ°œκ²¬ν•˜κ²Œ 도와쀀닀.
  2. λ‚˜μ€‘μ— μ½”λ“œλ₯Ό λ¦¬νŒ©ν† λ§ν•˜κ±°λ‚˜ λΌμ΄λΈŒλ ˆμ΄λ“œ λ“± κΈ°μ‘΄ κΈ°λŠ₯이 μ˜¬λ°”λ₯΄κ²Œ μž‘λ™ν•˜λŠ”μ§€ 확인할 수 μžˆλ‹€.
  3. λ‹¨μœ„ ν…ŒμŠ€νŠΈ 자체λ₯Ό λ¬Έμ„œλ‘œ μ‚¬μš©ν•  수 μžˆλ‹€.

 

이제 ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € ν•œλ‹€λŠ” 말이 무엇인지 이해가 λ˜μ—ˆλ‹€. μ–΄λ €μš΄ κΈ°μˆ μ„ μ“΄ 것도 μ•„λ‹ˆλ‹€. ν”„λ‘œλ•μ…˜ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° 전에 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό λ¨Όμ € μž‘μ„±ν•˜λŠ” 것이닀!

 

μ§„μ§œ κ°„λ‹¨ν• κΉŒ?

μ΄λ ‡κ²Œ κ°„λ‹¨ν•œ κ²ƒμ²˜λŸΌ λ§ν–ˆμ§€λ§Œ, TDD λ₯Ό μ μš©ν•˜κΈ° μ–΄λ €μš΄ 상황이 λ§Žλ‹€. 특히 μ˜μ‘΄κ΄€κ³„κ°€ λ§Žμ€ λͺ¨λ“ˆμ€ TDD λ₯Ό μ μš©ν•˜κΈ° μ–΄λ ΅λ‹€... κ·Έλž˜μ„œ μ΄μ „μ—λŠ” μ΅œμ†Œν•œμ˜ ν…ŒμŠ€νŠΈ μ½”λ“œλ§Œ μž‘μ„±ν–ˆμ—ˆλŠ”λ° μš”μ¦˜ μΆ”μ„ΈλŠ” λŒ€λΆ€λΆ„μ˜ μ„œλΉ„μŠ€ νšŒμ‚¬κ°€ ν…ŒμŠ€νŠΈ μ½”λ“œμ— κ΄€ν•΄ μš”κ΅¬ν•˜κ³  μžˆλ‹€κ³  ν•œλ‹€. μ½”λ”© ν…ŒμŠ€νŠΈλ₯Ό λ‹¨μœ„ ν…ŒμŠ€νŠΈλ‘œ λ³΄λŠ” κ²½μš°λ„ μžˆλ‹€κ³ ...

 

TDD 의 유의 사항

ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ˜ 이름

쒋은 μ½”λ“œλŠ” 항상 λ§ν•˜μ§€λ§Œ, μ‚¬λžŒμ΄ 읽기에도 νŽΈν•œ μ½”λ“œλ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” 후에 '이런 상황에 μ΄λ ‡κ²Œ ν…ŒμŠ€νŠΈ 되고 μžˆκ΅¬λ‚˜' λ₯Ό νŒŒμ•…ν•  수 μžˆλŠ” 쒋은 λͺ…μ„Έμ„œκ°€ λœλ‹€. λ”°λΌμ„œ 이름을 의미 있게 μ§“μž.

 

μΌ€μ΄μŠ€λŠ” λ§Žμ„ 수둝 쒋은 게 μ•„λ‹ˆλ‹€

μžλ™ν™”λœ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” μ†ŒμŠ€ν’ˆμ§ˆμ„ λ†’μ—¬μ£Όμ§€λ§Œ, κ·Έλ ‡λ‹€κ³  λ§Žμ€ 게 쒋은 건 μ•„λ‹ˆλ‹€. μ€‘λ³΅λœ μΌ€μ΄μŠ€λ‚˜ 더 이상 μ œλŒ€λ‘œ λ™μž‘ν•˜μ§€ μ•ŠλŠ” μΌ€μ΄μŠ€λŠ” 과감히 μ‚­μ œν•˜λŠ” 게 μ’‹λ‹€. 또 λͺ¨λ“  상황에 λŒ€ν•œ μΌ€μ΄μŠ€λ₯Ό λ§Œλ“€ ν•„μš”λ„ μ—†λ‹€. ν…ŒμŠ€νŠΈ 주도 개발이라고 ν•΄μ„œ ν…ŒμŠ€νŠΈμ—κ²Œ μ£Όλ„λ˜λŠ” κ°œλ°œμžκ°€ λ˜λΌλŠ” 건 μ•„λ‹ˆλ‹€.  ν…ŒμŠ€νŠΈλŠ” μ†Œν”„νŠΈμ›¨μ–΄κ°€ μ •μƒμ μœΌλ‘œ λ™μž‘ν•˜λŠ”μ§€ 확인을 μœ„ν•œ 보쑰 도ꡬ이닀.

 

μ—¬λŸ¬ 개의 fail ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό ν•œ λ²ˆμ— λ§Œλ“€μ§€ μ•ŠλŠ”λ‹€

개발 μ€‘μ—λŠ” μž‘μ„±ν•˜κ³  μžˆλŠ” ν•˜λ‚˜μ˜ ν΄λž˜μŠ€μ— ν•˜λ‚˜μ˜ μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈλ§Œ μœ μ§€ν•œλ‹€. ν•΄λ‹Ή μ‹€νŒ¨λ₯Ό μ„±κ³΅μ‹œν‚¨ ν›„ λ‹€μŒ μ‹€νŒ¨ μΌ€μ΄μŠ€λ₯Ό μž‘μ„±ν•˜λŠ” 게 μ’‹λ‹€. (λ¬΄μž‘μ • μ—¬λŸ¬ 개λ₯Ό μž‘μ„±ν•˜λ©΄ λ‹Ήμ—°νžˆ 쒋은 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μ“Έ 수 μ—†μœΌλ‹ˆ...)

 

ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λŠ” ν•˜λ‚˜λ§Œ ν…ŒμŠ€νŠΈν•˜λ„λ‘ ν•œλ‹€.

ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ λ©”μ†Œλ“œμ—μ„œ ν•˜λ‚˜ μ΄μƒμ˜ ν•­λͺ©μ„ ν•œκΊΌλ²ˆμ— ν…ŒμŠ€νŠΈν•˜λŠ”κ±΄ 쒋지 μ•Šλ‹€. getter, setter 성격 λΉ„μŠ·ν•˜λ‹ˆ λ‘˜ λ‹€ ν…ŒμŠ€νŠΈν•΄! λŠ” λ°”λžŒμ§ν•˜μ§€ λͺ»ν•œ ν…ŒμŠ€νŠΈλ‹€... 

 

이런 흐름을 μœ μ§€ν•˜λ©΄ μ’‹λ‹€.

μ‹œκ°„μ΄ 걸리더라도 ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ¬Έλ§₯에 맞게 잘 μ„€κ³„ν•˜κ³ , ν”„λ‘œλ•μ…˜ μ½”λ“œκ°€ 더렡더라도 μ΅œλŒ€ν•œ λΉ λ₯΄κ²Œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν†΅κ³Όν•˜λ„λ‘ μž‘μ„±ν•œ 이후 λ¦¬νŒ©ν† λ§μ„ ν•˜λŠ” 리듬을 μœ μ§€ν•˜λŠ” κ±Έ μΆ”μ²œν•œλ‹€.

 

λ°˜μ‘ν˜•