์ด๋ฒ ๊ธ์ Eliotte Rusty Harold ์ Effective Unit Testing ๊ฐ์๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค. ์ ๋ ํ ์คํธ๋ ๋ฌด์์ธ์ง ์ ํ์ํ์ง ๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ํด์ผ ํจ๊ณผ์ ์ผ๋ก ์์ฑํ ์ ์๋์ง์ ๋ํ ๋ฐฉ๋ฒ์ ๋ฐฐ์ธ ์ ์์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ
์ ๊ธ์ ์ค๋ฅ๊ฐ ์์ ์ ์์์ผ๋ก ์๋ณธ์์์ ๋ฐ๋์ ์์ฒญํ์๊ธธ ๊ถ์ฅ๋๋ฆฝ๋๋ค.
์ด๋ฒ ๊ธ์์ ์์๋ณผ ๋ด์ฉ
- ์ฐ๋ฆฌ๋ ์ Unit Test๋ฅผ ์์ฑํด์ผ ํ๋๊ฐ?
- Unit Test๋ ๋ฌด์์ธ๊ฐ?
- ๋ง์ฝ ์ ํํ output์ ๋ชจ๋ฅธ๋ค๋ฉด?
- Input๊ณผ output์ ์ ๋ช ํ์ง ์๊ฒ ํ๋ ๋ชจ๋ ๊ฒ๋ค์ ์ ๊ฑฐํด๋ผ
- Test ๋ฅผ ๋จผ์ ์์ฑํด๋ผ!
- ์ ์ ๋ ํ ์คํธ์ธ๊ฐ?
- Unit์ ๋ํ ๋ ๋ฆฝ์ ์์ ์๋ฏธํ๋ค.
- Test ๊ทธ๋ฆฌ๊ณ Thread Safety
- ์ ๋ ํ ์คํธ์ ๋ํด ๊ฐ์ฅ ์ ๊ฒ ์๊ณ ์๋ ์ฌ์ค
- ์๋
- ํต๊ณผ๋ ํ ์คํธ๋ ์ถ๋ ฅ์ด ์์ด์ผ ํ๋ค.
- ์คํจํ ํ ์คํธ๋ ์ ๋ฆฌ๋ ์์ํ์ ์์ฑํด์ผ ํ๋ค.
- Flakiness (๋ฐํธ)
- System Skew
- test ์์ ์กฐ๊ฑด๋ฌธ์ ํผํด๋ผ
- ๋๋ฒ๊น
- ๋ฆฌํฉํ ๋ง
- ๊ฐ๋ฐ ๊ดํ
- ์ต์ข ์ ์ธ ์๊ฐ
์ฐ๋ฆฌ๋ ์ Unit Test๋ฅผ ์์ฑํด์ผ ํ๋๊ฐ?
- ์ฝ๋๊ฐ ์๋ํ๊ธธ ์ํ๊ธฐ ๋๋ฌธ์
- ์ฝ๋๊ฐ ์์ผ๋ก๋ ๊ณ์ ์๋ํ๊ธธ ์ํ๊ธฐ ๋๋ฌธ์
- ์์ ๊ฐ์ ๊ฐ์ง๊ณ ์ฝ๋๊ฐ ํ๋ฆฌ์ง๋ ์์๋์ง ๋๋ ค์ํ์ง ์์ผ๋ฉฐ ๊ฐ๋ฐ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด
- ์ฐ๋ฆฌ๋ ์ค์๋ฅผ ํ๊ธฐ ๋๋ฌธ์
Unit Test๋ ๋ฌด์์ธ๊ฐ?
Verify that a known, fixed input produces a known, fixed output
๊ณ ์ ๋ ์ ๋ ฅ๊ฐ์ ๋ฃ์ผ๋ฉด ์๋ ค์ง ๊ณ ์ ๋ ์ถ๋ ฅ์ ์์ฑํ๋์ง ํ์ธํ๋ ๊ฒ
๋ง์ฝ ์ ํํ output์ ๋ชจ๋ฅธ๋ค๋ฉด?
- ๋ง์ฝ ๊ฒฐ์ ๋ก ์ ์ธ ์ ๋ต ์ด๋ผ๋ฉด, ๊ทธ๊ฒ์ ํน์ฑํ๋ test๋ฅผ ์์ฑํด๋ผ
- ๋ง์ฝ output ์ด fuzzy(๊ฐ์ด ์ ๋งค๋ชจํธํ) ํ๊ฑฐ๋ ํ์คํ ์ ์๋์ง ์์๋ค๋ฉด, ๋ fuzzy ํ๊ณ ํ์คํ output ์ ์ ๋ต์ผ๋ก ํ๋ ๋ฌธ์ ๋ฅผ ํตํด ํ ์คํธํด๋ผ.
Input๊ณผ output์ ์ ๋ช ํ์ง ์๊ฒ ํ๋ ๋ชจ๋ ๊ฒ๋ค์ ์ ๊ฑฐํด๋ผ
- ์ ๋ random input์ ๋ฃ์ง ๋ง์๋ผ ํญ์ ๊ณ ์ ๋ ๊ฐ์ ๋ฃ์ด๋ผ
- ์ด๋ฆ์๋ ์์๋ฅผ ์ฌ์ฉํ์ง ๋ง์๋ผ. ๋ฆฌํฐ๋ด ํ์์ ์ซ์๋ ๋ฌธ์๋ฅผ ์ฌ์ฉํด๋ผ.
- ๋คํธ์ํฌ๋ ๋ฐ๋์ง ํ์ง ์์ file system์ ์ ๊ทผํ์ง ๋ง์๋ผ.
- ํ๊ฒฝ์ผ๋ก๋ถํฐ ํ ์คํธ๋ฅผ ๊ฒฉ๋ฆฌํด๋ผ Eg. Timzone, Gravitation constant(์ค๋ ฅ ์์), The speed of light (๋น์ ์๋)
Test ๋ฅผ ๋จผ์ ์์ฑํด๋ผ!
- ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๋ ๊ฒ์ ๋จ์ํ ํ ์คํธ๋ง์ ์ํ ๊ฒ์ด ์๋๋ค. ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๋ ๊ฒ์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฒ์ ๊ดํ ๊ฒ ์ด๋ค.
- ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๋ฉด ์ฌ์ฉ๋๋ ๊ฒ์ด ์๋๋ผ ์ ์ ์ ํจ๊ป ์์ํ๊ธฐ ๋๋ฌธ์ ๋ ๋์ API๋ฅผ ๋ง๋ค ์ ์๋ค.
- ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๋ฉด ๊ตฌํ์ ์จ๊ธฐ๊ณ ๋ด๋ถ ๊ตฌํ์ ์์ธํ ๋ด์ฉ์ ๋ ธ์ถํ๋ ๊ฒ์ ํผํ ์ ์๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ๋จ๋จํ๊ณ ๋ถ์์ง๊ธฐ ์ฌ์ด ๊ฒฐํฉ๋ ํ ์คํธ๊ฐ ๋๋ ๊ฒ์ ํผํ ์ ์๋ค.
์ ์ ๋ ํ ์คํธ์ธ๊ฐ?
- Unit ์ ํ๋๋ฅผ ์๋ฏธํ๋ค. ๊ฐ ํ ์คํธ๋ ์ ํํ ํ ๊ฐ์ง๋ฅผ ํ ์คํธํ๋ค.
- ๊ฐ๊ฐ์ ํ ์คํธ ๋ฉ์๋๋ ํ๋์ ํ ์คํธ์ด๋ค.
- ๋ชจ๋ฒ ์ฌ๋ก : ํ ์คํธ ๋ฉ์๋ ๋น ํ๋์ assert
- fixture ์์ setup ์ ๊ณต์ ํ๋ผ, ๊ฐ์ ๋ฉ์๋ ์์์๊ฐ ์๋๋ผ
- ํ๋์ ๋ชจ๋ธ ํด๋์ค์ ๋ํด ์ฌ๋ฌ๊ฐ์ ํ ์คํธ ํด๋์ค๋ฅผ ๊ฐ์ง ์ ์๋ค. ํ ๊ฐ์ง์ ํ ์คํธ ํด๋์ค์ ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ฃ์ด์ผ ํ๋ค๊ณ ๊ฐ๋ฐ ๊ฐ์ง ๋ง๋ผ.
Unit ๋ํ ๋ ๋ฆฝ์ ์์ ์๋ฏธํ๋ค.
- Test๋ ์ด๋ค ์์๋ก๋ ์คํํ ์ ์์ด์ผ ํ๋ค.
- Test๋ ๋ณ๋ ฌ ๋ค์ค ์ฐ๋ ๋์์๋ ์คํํ ์ ์์ด์ผ ํ๋ค.
- Test๋ ์๋ก์๊ฒ ๊ฐ์ญ๋ฐ์ง ์์์ผ ํ๋ค.
Test ๊ทธ๋ฆฌ๊ณ Thread Safety
- sychronization, semaphores, ํน๋ณํ data structures ๋ฅผ ์ฌ์ฉํ์ง ๋ง๋ผ
- test ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ง ๋ง์๋ผ
- ์์๊ฐ ์๋ static field ๋ฅผ ํ ์คํธ์ ์ฌ์ฉํ์ง ๋ง์๋ผ
- ํ ์คํธ ๋์ ๋ชจ๋ธ ์ฝ๋์ global state ๋ฅผ ์ฃผ์ํ๋ผ
- ๋ชจ๋ฒ ์ฌ๋ก : ํ๋์ ํ ์คํธ ๋ฉ์๋์ ํ๋์ assert
- fixture ์์ setup ์ ๊ณต์ ํ๋ผ, ๊ฐ์ ๋ฉ์๋์์๊ฐ ์๋๋ผ
์ ๋ ํ ์คํธ์ ๋ํด ๊ฐ์ฅ ์ ๊ฒ ์๊ณ ์๋ ๋ ์ฌ์ค
- test ๋ผ๋ฆฌ๋ ์ธ์คํด์ค ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด์๋ ์๋๋ค.
- ํ๋์ model class ์ ์ฌ๋ฌ๊ฐ์ง test class ๋ฅผ ๋ง๋ค ์ ์๋ค.
์๋
- ํ๋์ ํ ์คํธ๋ 1์ด ์ด๋ด์ ๋์ํด์ผ ํ๋ค.
- ํ๋์ complete suite ๋ 1๋ถ ์ด๋ด์ ๋์ํด์ผ ํ๋ค.
- ํฐ ํ ์คํธ๋ค์ ์ฌ๋ฌ๊ฐ์ง suite๋ก ๋ถ๋ฆฌํด๋ผ
- ์ด๊ฒ์ด ํ์ํ ์ด์ ๋ ๊ฐ๋ฐ์ ์ฝ๊ฒ ํ๊ธฐ ์ํจ์ด๋ค.
- ๋น ๋ฅด๊ฒ ์คํจํด๋ผ, ๊ฐ์ฅ ๋๋ฆฐ ํ ์คํธ๋ฅผ ๋ง์ง๋ง์ ๋ฐฐ์นํด๋ผ
ํต๊ณผ๋ ํ ์คํธ๋ ์ถ๋ ฅ์ด ์์ด์ผ ํ๋ค.
- ์ํ์ ํต๊ณผํ๋์ง์ ๋ํ ์ด๋ ํ ์ง๋ฌธ๋ ์์ด์๋ ์ ๋๋ค.
- ๋ง์ฝ ํ์ํ๋ค๋ฉด ํ ์คํธ์ loggers ๋ฅผ ๋ถ์ฌ๋ผ
- Maven ์ ์ด ๋ถ๋ถ์์ ํฌ๊ฒ ์๋ชปํ๊ณ ์๋ค.
์คํจํ ํ ์คํธ๋ ์ ๋ฆฌ๋ ์์ํ์ ์์ฑํด์ผ ํ๋ค.
- ์คํจํ ํ ์คํธ๋ ๋ช ํํ๊ณ ๋ชจํธํ์ง ์์ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ฃผ์ด์ผ ํ๋ค.
- Test ๋ฐ์ดํฐ๋ฅผ ๊ต๋์์ผ๋ผ
- ๋๊ฐ์ ๋ฐ์ดํฐ๋ก ๋ชจ๋ ํ ์คํธ๋ฅผ ํ์ง ๋ง๋ผ
- E.G. ๋ชจ๋ int ๋ค์ 3, 1117, -98, etc. ๋ฑ์ผ๋ก ์ค์ ํ์ง ๋ง๋ผ
- ์ด๊ฒ์ ์๋ฌ๊ฐ ์ ํ๋ ธ๋์ง ๋ฐ๋ก ํ์ ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ค๋ค.
Flakiness (๋ฐํธ)
Test์์ Flakiness๋ ์ด๋จ๋๋ ํต๊ณผํ๊ณ ์ด๋จ๋๋ ์คํจํ๋ Test๋ฅผ ๋ป ํ๋ค.
- ์ด๊ฒ์ ํผํ๊ธฐ ์ํด ๋งค์ฐ๋งค์ฐ ์ด์ฌํ ์ผํด๋ผ
- Flakiness ์ ์์ฒ
- Time dependence
- Network availability
- Explicit Randomness
- Multithreading
System Scew
- Flakiness ์ ์์ฒ
- Mutltithreading
- ๊ธฐ๋ณธ ์ด์ ์ฒด์ ์ ๋ํ ๊ฐ์
- ์ ์ ๋์ง ์์ ํ๋
- Floating poing roundoff
- Integer width
- Default character set
- etc.
test ์์ ์กฐ๊ฑด๋ฌธ์ ํผํด๋ผ
- test ์์ ์กฐ๊ฑด๋ฌธ์ ํผํด๋ผ
๋๋ฒ๊น
- ๋ฒ๊ทธ๋ฅผ ๊ณ ์น๊ธฐ ์ ์ ์คํจํ๋ ํ ์คํธ๋ฅผ ์์ฑํด๋ผ
- ๋ง์ฝ ํ ์คํธ๊ฐ ํต๊ณผํ๋ค๋ฉด, ๊ทธ ๋ฒ๊ทธ์ ๋ํ ๋์ ์๊ฐ์ ํ๋ฆฐ ๊ฒ ์ด๋ค.
๋ฆฌํฉํ ๋ง
- ๋ฆฌํฉํ ๋งํ๊ธฐ ์ ์ ํ ์คํธ๋ฅผ ์์ฑํด๋ผ์ฝ๋์ ๋ํ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ํ์ธํด๋ผ
- ๋ง์ฝ ์์ ํ์ง ์์ Refactoring ์ ํด์ผ ๋๋ค๋ฉด ์ถ๊ฐ์ ํ ์คํธ๋ฅผ ์์ฑํด๋ผ
๊ฐ๋ฐ ๊ดํ
- CI ๋ฅผ ์ฌ์ฉํด๋ผ (e.g. CI)
- submit queue ๋ฅผ ์ฌ์ฉํด๋ผ
- ์ ๋ ์คํจํ ํ ์คํธ๋ฅผ check in ํ์ง ๋ง๋ผ
- ๋ง์ฝ check in ํ๋ค๋ฉด rollback ์ ๋จผ์ ํ๊ณ ๊ทธ ๋ค์ ์ง๋ฌธํด๋ผ
- ํ ์คํธ ์ฝ๋๊ฐ green ์ด ๋๊ธฐ ์ ๊น์ง๋ ์ฝ๋๋ฅผ ๊ฒํ ํ์ง ๋ง์๋ผ.
์ต์ข ์ ์ธ ์๊ฐ
- ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํด๋ผ
- ๋ชจ๋ ํ ์คํธ๋ฅผ ๋ชจํธํ์ง ์๊ณ ์ฌํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด๋ผ
๋ง๋ฌด๋ฆฌํ๋ฉด์
์ด์์ผ๋ก Eliotte Rusty Harold ์ Effective Unit Testing ์ ๋ฆฌ 1ํ์ ๋ง๋ฌด๋ฆฌํ๊ฒ ์ต๋๋ค. Unit Test ๊ฐ ๋ฌด์์ธ์ง ์์๊ฐ์ค ์ ์๋ ์๊ฐ์ด ๋์ผ๋ฉด ํ๋ ๋ฐ๋์ ๋๋ค. ๋ค์ ๊ธ์์๋ ๋๋จธ์ง ๋ฒ์ญ๋ค์ ์์ฑํ๊ฒ ์ต๋๋ค. ๋ถ์กฑํ ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.