TDD - About " Test-Driven Developemnt"

λ‚˜λ‚˜'s BrainΒ·2023λ…„ 10μ›” 31일
1

κ°œλ…Study

λͺ©λ‘ 보기
7/21
post-thumbnail

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” "μš”κ΅¬μ‚¬ν•­μ„ κ΅¬μ²΄ν™”ν•œ μ‚°μΆœλ¬Ό" 이라고 λ³Ό 수 μžˆλ‹€. μš”κ΅¬μ‚¬ν•­μ„ ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ λ¨Όμ € μ •μ˜ν•œ λ’€ κΈ°λŠ₯을 κ°œλ°œν•˜λŠ” 방법둠을 TDD (=Test-Driven Developemnt) 라고 ν•œλ‹€.


πŸ’‘Test Codeλ₯Ό μ™œ μž‘μ„±ν•΄μ•Όν• κΉŒ ?

ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μ‹€μˆ˜λ‚˜ 였λ₯˜λ₯Ό λ°œκ²¬ν•˜κ³  이λ₯Ό 쀄이고 μˆ˜μ •ν•˜κΈ° μœ„ν•΄ μž‘μ„±ν•˜λŠ” 것이기 λ•Œλ¬Έμ— μ‘°κΈˆμ€ μ •μƒμ μœΌλ‘œ μž‘λ™λ˜λŠ” λΆ€λΆ„λ§Œμ„ ν…ŒμŠ€νŠΈλ‘œ 두지 μ•Šκ³ , μ˜ˆμ™Έμ μ΄κ³  , μ˜ˆμƒ 밖인 뢀뢄을 ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ μž‘μ„±ν•΄λ΄„μœΌλ‘œμ¨ μ‘°κΈˆμ€ 더 μ •ν™•ν•˜κ³  κΉ”λ”ν•œ μ½”λ“œκ°€ λ‚˜μ˜¬ 수 있게 ν•΄μ€€λ‹€.

πŸ”– Test Code 의 λͺ©ν‘œ

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μ΄μœ λŠ”, 잘 μž‘λ™ν•˜λŠ”, κΉ”λ”ν•œ μ½”λ“œλ₯Ό μ–»κΈ° μœ„ν•΄μ„œ 이닀.

μ™œ ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, κΉ”λ”ν•œ 잘 μž‘λ™ν•˜λŠ” κΉ”λ”ν•œ μ½”λ“œλ₯Ό 얻을 수 μžˆμ„κΉŒ?

ν…ŒμŠ€νŠΈλ₯Ό μ‰½κ²Œν•˜κΈ° μœ„ν•΄μ„œλŠ”, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œλ₯Ό ν…ŒμŠ€νŠΈν•˜κΈ° μ‰½κ²Œ μ§œμ•Όν•˜λ©° κ²°κ΅­ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 짜기 μœ„ν•΄ λ…Έλ ₯ν•˜λ‹€λ³΄λ©΄ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œκ°€ κΉ”λ”ν•΄μ§€λŠ”κ²ƒμ„ 확인할 수 μžˆμ„ 것이닀.


πŸ‘¨β€πŸ’» ν…ŒμŠ€νŠΈμ½”λ“œ μž‘μ„± 원칙 ?

λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” κ°€λŠ₯ν•˜λ©΄ κ°„κ²°ν•˜κ³  읽기 μ‰½κ²Œ μž‘μ„±ν•˜λŠ” 게 κ°€μž₯ μ’‹λ‹€. μ–΄λ– ν•œ μ˜λ„λ‘œ κΈ°λŠ₯ 검증을 μˆ˜ν–‰ν•˜λŠ”μ§€ μ˜λ„κ°€ λ“œλŸ¬λ‚˜λŠ” 것이 μ’‹κΈ°λ•Œλ¬Έμ— λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” 10쀄 μ΄ν•˜λ‘œ μž‘μ„±ν•˜κ³ , λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” 단일 κΈ°λŠ₯을 κ²€μ¦ν•˜λŠ” 것이 μ’‹λ‹€. λ˜ν•œ, ν•˜λ‚˜μ˜ ν…ŒμŠ€νŠΈ μ½”λ“œμ—μ„œ μ—¬λŸ¬ κ°€μ§€ κΈ°λŠ₯을 κ²€μ¦ν•˜λŠ” μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄, 였λ₯˜κ°€ λ°œμƒν•œ 지점 μ΄ν›„μ˜ ν…ŒμŠ€νŠΈλŠ” μ§„ν–‰λ˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” κ°€λŠ₯ν•˜λ‹€λ©΄ λ…λ¦½μ μœΌλ‘œ 싀행될 수 μžˆλŠ” ꡬ쑰둜 μž‘μ„±ν•˜λŠ” 것이 μ’‹λ‹€.

μ•„λž˜μ™€ 같은 βœ¨λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” 5κ°€μ§€ μ›μΉ™βœ¨μ„ μ€€μˆ˜ν•œλ‹€λ©΄, μ˜¬λ°”λ₯΄κ²Œ μž‘μ„±λœ λ‹¨μœ„ ν…ŒμŠ€νŠΈλΌκ³  λ³Ό 수 μžˆλ‹€.

⬇️

✨ λ‹¨μœ„ ν…ŒμŠ€νŠΈλŠ” 5κ°€μ§€ 원칙

Fast : λΉ λ₯΄κ²Œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€.

Isolated : 각 ν…ŒμŠ€νŠΈλŠ” λ…λ¦½μ μœΌλ‘œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•œλ‹€.

Repeatable : 맀번 μ‹€ν–‰ κ²°κ³ΌλŠ” 동일해야 ν•œλ‹€.

Self-Verifying : κ²°κ³ΌλŠ” Pass or Fail λ‘˜ 쀑 ν•˜λ‚˜μ˜ μƒνƒœ 값을 κ°€μ§„λ‹€.

Timely : λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ½”λ“œ μž‘μ„±λ³΄λ‹€ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ¨Όμ € μž‘μ„±ν•œλ‹€.


πŸ” "TDD" 의 μž₯점 νŒŒμ•…ν•΄λ³΄κΈ°

βœ… μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜λŠ” λ“±μ˜ μ‹œκ°„μ„ μ ˆμ•½ν•  수 μžˆλ‹€.

βœ… ν•„μš”ν•œ 데이터λ₯Ό 미리 κΈ°μž…ν•˜κ³ , ν…ŒμŠ€νŠΈκ°€ λλ‚˜κ³  μ •λ¦¬ν•˜λŠ”λ“±μ˜ 행동을 ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€.

βœ… λ‹¨μœ„ν…ŒμŠ€νŠΈμ˜ 경우 μˆ˜μ‹­ms 이기 λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈκ°€ 맀우 λΉ λ₯΄λ‹€.

βœ… λ¬Έμ„œλ‘œμ„œμ˜ 역할이 κ°€λŠ₯ν•˜λ‹€.
🚨 ν…ŒμŠ€νŠΈ μ½”λ“œλŠ”, κ°œλ°œμžκ°€ μž‘μ„±ν•œ λ©”μ†Œλ“œκ°€ μ–΄λ–»κ²Œ λ™μž‘ν–ˆμœΌλ©΄, μ–΄λ–€ κ²°κ³Όλ₯Ό λ°˜ν™˜ν–ˆμœΌλ©΄, ν•˜λŠ” 것을 μž‘μ„±ν•œ 것이기 λ•Œλ¬Έμ— 처음 μ½”λ“œλ₯Ό λ³΄λŠ” κ°œλ°œμžλ“€μ΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν†΅ν•΄μ„œ μ½”λ“œμ˜ λ™μž‘μ„ 쑰금 더 μˆ˜μ›”ν•˜κ²Œ 이해할 수 μžˆλ‹€.

βœ… κΉ”λ”ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ–»μ–΄λ‚Ό 수 μžˆλ‹€.

βœ¨πŸ‘¨β€πŸ’» JUnit μ‹€ν–‰ ꡬ쑰

JUnit은 μžλ°” λ‹¨μœ„ ν…ŒμŠ€νŠΈ μžλ™ν™”λ₯Ό μ§€μ›ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬

JUnit으둜 λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ, λ©”μ„œλ“œλ₯Ό μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ μž‘μ„±ν•  수 있으며, μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ§€μ •λœ λ©”μ„œλ“œ λ˜λŠ” 클래슀λ₯Ό μ‹€ν–‰ν•œλ‹€.

JUnit은 @BeforeClass둜 μ§€μ •λœ 클래슀λ₯Ό κ°€μž₯ λ¨Όμ € μ‹€ν–‰ν•˜κ³ , κ·Έ μ΄ν›„λ‘œλŠ” @Test, @Before, @After둜 μ§€μ •λœ λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€. ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€κ°€ λͺ¨λ‘ μ‹€ν–‰ μ™„λ£Œλ˜λ©΄ @AfterClass둜 μ§€μ •λœ ν΄λž˜μŠ€κ°€ μ‹€ν–‰λœλ‹€.

Annotation은 ν…ŒμŠ€νŠΈ λ©”μ„œλ“œ λ˜λŠ” 클래슀의 ν–‰μœ„λ₯Ό μ§€μ •ν•˜λŠ”κ²ƒμ΄λ©° Test FixtureλŠ” ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  λ•Œ, κ°μ²΄λ“€μ˜ μƒνƒœλ₯Ό κ³ μ •μ‹œν‚€λŠ” 것이닀.

πŸ“Œ Annotation μ§€μ • λŒ€μƒ μ„€λͺ…

@After λ©”μ„œλ“œ @Beforeμ—μ„œ μ„€μ •ν•œ ν…ŒμŠ€νŠΈ ν”½μŠ€μ³λ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
@AfterClass λ©”μ„œλ“œ @BeforeClass μ—μ„œ μ„€μ •ν•œ ν…ŒμŠ€νŠΈ ν”½μŠ€μ³λ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.
@Before λ©”μ„œλ“œ ν…ŒμŠ€νŠΈ ν”½μŠ€μ³λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€
@BeforeClass λ©”μ„œλ“œ 생성에 맋은 μ‹œκ°„μ΄ μ†Œμš”λ˜λŠ” ν”½μŠ€μ³λ₯Ό μ„€μΉ˜ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©λœλ‹€.
@Ignore λ©”μ„œλ“œ ν•΄λ‹Ή ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μ‹€ν–‰ν•˜μ§€ μ•Šλ„λ‘ ν•œλ‹€.
@RunWith ν…ŒμŠ€νŠΈ ν•  클래슀 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μ‹€ν–‰ν•  ν…ŒμŠ€νŠΈ λŸ¬λ„ˆλ₯Ό μ§€μ •ν•  수 μžˆλ‹€.
@Suite ν…ŒμŠ€νŠΈ ν•  클래슀 λ‹¨μœ„ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ“€μ„ λ¬Άμ–΄μ„œ 같이 μ‹€ν–‰ν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€.
@Test λ©”μ„œλ“œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ‘œ μ§€μ •ν•œλ‹€.

πŸ“œ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€μ—μ„œ κΈ°λŒ€ 좜λ ₯ κ°’κ³Ό μ‹€μ œ 좜λ ₯ 값을 λΉ„κ΅ν•˜λŠ” ꡬ문은 Assertμž…λ‹ˆλ‹€. 좜λ ₯ 값에 ν•΄λ‹Ήν•˜λŠ” λ³€μˆ˜μ˜ νƒ€μž…μ˜ μ’…λ₯˜κ°€ λ‹€μ–‘ν•˜λ―€λ‘œ, JUnitμ—μ„œ λ‹€μ–‘ν•œ λ³€μˆ«κ°’μ„ 비ꡐ할 수 μžˆλ„λ‘ μ—¬λŸ¬ μ’…λ₯˜μ˜ Assertꡬ문을 μ§€μ›ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

πŸ“Œ λ©”μ„œλ“œ μ„€λͺ…

assertEquals(expected,actual) : 두 객체의 equals κ²°κ³Όκ°€ 참인지 κ²€μ‚¬ν•œλ‹€.
assertTrue(actual) : 계산결과가 참인지 κ²€μ‚¬ν•œλ‹€.
assertFalse(actual) : 계산결과가 거짓인지 κ²€μ‚¬ν•œλ‹€.
assertNotNull(actual) : 계산결과가 null이 μ•„λ‹Œμ§€ κ²€μ‚¬ν•œλ‹€.
assertNull(actual) : 계산결과가 null인지 κ²€μ‚¬ν•œλ‹€.
assertSame(expected,actual) : 두 객체가 동일 객체인지 κ²€μ‚¬ν•œλ‹€.
assertNotSame(expected,actual) : 두 객체가 동일 객체가 μ•„λ‹Œμ§€ κ²€μ‚¬ν•œλ‹€.
fail("Test Fail") : ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ₯Ό μ‹€νŒ¨μ‹œν‚¨λ‹€.
assertArrayEquals(expected,actual) : 두 개의 λ°°μ—΄μ˜ equals 값이 참인지 κ²€μ‚¬ν•œλ‹€.

πŸ“Œ JUnit μ‹€ν–‰κ²°κ³Ό

JUnit ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μ‹€ν–‰ 결괏값은 Pass, Fail 그리고 Error μƒνƒœ 값을 κ°€μ§„λ‹€.

톡과(Pass)λŠ” Assert문이 ν†΅κ³Όλ˜μ—ˆμ„ λ•Œ κ°€μ§€λŠ” μƒνƒœ 값이닀.

μ‹€νŒ¨(Fail)λŠ” Assert문이 μ‹€νŒ¨ ν•œκ²½μš°μ΄λ‹€.

였λ₯˜(Error)λŠ” ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€ μ‹€ν–‰ μ‹œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ—¬ 였λ₯˜κ°€ λ°œμƒν•œ κ²½μš°μ΄λ‹€.


πŸ’‘ μ–Έμ œ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•˜λŠ”κ°€?

ν…ŒμŠ€νŠΈ μ½”λ“œλ„ μ†ŒμŠ€μ½”λ“œμ΄λ―€λ‘œ, μ˜λ„λ₯Ό λΆˆλΆ„λͺ…ν•˜κ²Œ μž‘μ„±ν•˜κ±°λ‚˜, 반볡적으둜 λ™μΌν•œ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λ©΄ λΉ„νš¨μœ¨μ΄ λ°œμƒν•œλ‹€.
κ·ΈλŸ¬λ―€λ‘œ, ν…ŒμŠ€νŠΈ μ½”λ“œλ„ μ§€μ†μ μœΌλ‘œ μœ μ§€λ³΄μˆ˜λ₯Ό μˆ˜ν–‰ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€. ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 검증할 λ•Œ, μ½”λ“œ 슀멜, 행동 슀멜 λ˜λŠ” ν”„λ‘œμ νŠΈ 슀멜이 λ°œκ²¬λœλ‹€λ©΄, ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” μˆ˜μ •λ˜μ–΄μ•Ό ν•œλ‹€.

즉, ν…ŒμŠ€νŠΈμ½”λ“œλ₯Ό λ΄„μœΌλ‘œμ¨, ν•΄λ‹Ή λ©”μ†Œλ“œλ₯Ό μž‘μ„±ν•œ κ°œλ°œμžκ°€ μ–΄λ–€μ˜λ„λ‘œ λ§Œλ“€μ—ˆμœΌλ©°, μ–΄λ–»κ²Œ λ™μž‘ν•˜κΈΈ μ›ν•˜λŠ”μ§€λ₯Ό μ•Œ 수 μžˆκ²Œλ„ ν•΄μ£ΌκΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” μŠ΅κ΄€μ„ λ“€μ—¬μ•Όν•œλ‹€.

좜처 : https://it-techtree.tistory.com/entry/reason-why-programmer-writes-unit-test#google_vignette
https://it-techtree.tistory.com/entry/How-to-write-java-test-code-using-junit

profile
"λ‘œμ»¬μ—μ„  λ¬Έμ œμ—†μ—ˆλŠ”λ°β€¦?"

0개의 λŒ“κΈ€