|
| 1 | +# [์คํ๋ง์บ ํ 2019] ๋ฌด์์ ํ
์คํธํ ๊ฒ์ธ๊ฐ? ์ด๋ป๊ฒ ํ
์คํธํ ๊ฒ์ธ๊ฐ? (by ๊ถ์ฉ๊ทผ) |
| 2 | + |
| 3 | +## ํ
์คํธ๋ก ๋ถํฐ ์ป์ ์ ์๋๊ฒ |
| 4 | + |
| 5 | +- ์์ ๊ฐ๊ณผ ์์ ๊ฐ |
| 6 | +- ๋์์? ํ์ฌ์ ๋ฏธ๋์ ๋, ๋๋ฃ |
| 7 | + |
| 8 | +# ๋ฌด์์ ํ
์คํธํ ๊ฒ์ธ๊ฐ? |
| 9 | + |
| 10 | +## ๋ก๋ ๊ตฌํ ์์ |
| 11 | + |
| 12 | +- ์๊ตฌ์ฌํญ |
| 13 | + - 6๊ฐ์ ์ซ์๋ฅผ ๋ฐํ, ์ค๋ณต๋์ง ์๋ ์ซ์, ๋๋คํ๊ฒ ๋ฐํ |
| 14 | + |
| 15 | + |
| 16 | + |
| 17 | +- ์ง๋ฌธ) ์ค๋ณต์ ๋ํด์๋ ํ
์คํธ ๋์ด์ผ ํ์ง ์์๊น์? |
| 18 | + - ๋๋ต) ์ ๋ Set ์ผ๋ก ๊ตฌํํด์ ์ค๋ณต์ด ๋์ฌ ์ ๊ฐ ์์ด์ |
| 19 | + - ์๋ ์๋ชป๋๋ค. ์๋๋ฉด **๊ตฌํ์ ์ธ์ ๊ฐ ์ด๋ป๊ฒ๋ ๋ณํ ์** ์๊ธฐ๋๋ฌธ์ด๋ค. (๋ฏธ๋์ ๋ด๊ฐ ๋ง๊ฐํ ์๋, ๋ฏธ๋ ๋๋ฃ๊ฐ ๋ฐ๊ฟ์๋) -> ๊ตฌํ์ด ์๋ **๋น์ฆ๋์ค ์ค๊ณ์ฌํญ์ ํ
์คํธํด์ผ์ง ์์ ๊ฐ, ์์ ๊ฐ**์ ์ป์ ์ ์๋ค |
| 20 | + |
| 21 | +## ๊ตฌํํ
์คํธ |
| 22 | + |
| 23 | +- ๋ง์ฝ private ๋ฉ์๋๋ฅผ public ๋ฉ์๋๋ก ๋ฐ๊ฟ์ ํ
์คํธํ๊ณ ์ํ๋ฉด ๊ตฌํํ
์คํธ๋ฅผ ํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋งค์ฐ ํผ |
| 24 | +- ์ด๋ด๊ฒฝ์ฐ์๋ ๊ทธ ํ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ์์ชฝ์ ๋น์ฆ๋์ค ํ
์คํธ๋ง ๋ํด์ง ์์ชฝ์ ๋ค์ฌ๋ค๋ณผ ํ์๋์๋ค. ๋ง์ฝ ์ถ๊ฐํ๋๊ฒ ์ด์ํ๋ค๋ฉด private ๋ฉ์๋๊ฐ ์์ชฝ์ ์๋๊ฒ ์ด์ํ๊ฑธ์๋ .. |
| 25 | + -  |
| 26 | + |
| 27 | +์ฆ ์์ฝํ๋ฉด, ์ฐ๋ฆฌ๊ฐ **๊ตฌํ์ด ์๋๋ผ,** **์ค๊ณ๋ฅผ ํ
์คํธ**ํด์ผํ๋ค. |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | +## Non Testable |
| 32 | + |
| 33 | +- "์ ์ดํ ์ ์๋ ์์ญ" |
| 34 | +- ์์ |
| 35 | + - Radndom, Shuffle, LocalDate.now() |
| 36 | + - ์ธ๋ถ ์ธ๊ณ |
| 37 | + - HTTP |
| 38 | + - ์ธ๋ถ ์ ์ฅ์ |
| 39 | + |
| 40 | +- ์ ํ
์คํธํ๊ธฐ ํ๋ ์ง? |
| 41 | + - ํ
์คํธ๋ ๊ณ ์ ๋์ด์๋๋ฐ ๊ทธ์ฌ์ด์ ์ธ๋ถ์ธ๊ณ๋ ๋ณํ๋ ์ ์๋ค. ๊ทธ๋ด๋ ํ
์คํธ๊ฐ ์คํจํ๊ฒ๋๋ค. |
| 42 | + - **์ ์ดํ ์ ์๋ ์์ญ์ ๋ฉฑ๋ฑํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ ์ ์๋ค**. |
| 43 | +- ๋ก๋ ์์ |
| 44 | + - ์ ์๊ตฌ์ฌํญ ์ค "๋๋คํ๊ฒ ๋ฐํ"์ค ๋๋ค์ ์ ์ดํ ์ ์์ผ๋ฏ๋ก ํ
์คํธ ๋ถ๊ฐ๋ฅํ๊ฒ์ด๋ค. |
| 45 | + - ์๊ตฌ์ฌํญ์ ์๋ชป ๋์ถํ์ ๊ฐ๋ฅ์ฑ์์. |
| 46 | + ๋ฐ๋ผ์ "๋๋คํ๊ฒ ๋ฐํ"์ "์๋ํ ์ ๋ต๋๋ก ๋ฐํ"์ผ๋ก ๋ณ๋ฑ ๋ค๋ฅด๊ฒ ํ์ด์ ํ
์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ค. |
| 47 | + - ์๋๋ ์ ๋ตํจํด์ผ๋ก ๋ฆฌํฉํฐ๋งํจ (ํ
์คํธ ๊ฐ๋ฅํ๊ฒ๋จ) |
| 48 | + -  |
| 49 | + |
| 50 | +**"ํญ์ ์ฑ๊ณตํ ์ ์๋๊ฒ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋ ๊ฒ์ ํ
์คํธ"** |
| 51 | + |
| 52 | +## ์ฌ๊ธฐ๊น์ง ์์ฝ |
| 53 | + |
| 54 | +- ๋ฌด์์ ํ
์คํธํ ๊ฒ์ธ๊ฐ? |
| 55 | + - **์ค๊ณ๋ฅผ ํ
์คํธํ์.** |
| 56 | + - **ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๋๊ฒ์ ํ
์คํธํ์.** |
| 57 | + |
| 58 | +# ์ด๋ป๊ฒ ํ
์คํธํ ๊ฒ์ธ๊ฐ? |
| 59 | + |
| 60 | +## 1. ํ
์คํธ ๊ฐ๋ฅํ ๊ฒ, ๋ถ๊ฐ๋ฅํ ๊ฒ |
| 61 | + |
| 62 | +> ํ
์คํธํ ์ ์๋ ๋ฉ์๋๋ ํ
ํธํ ์ ์๋ ๋ฉ์๋๊น์ง ์ค์ผ์ ์ํจ๋ค. |
| 63 | +
|
| 64 | +## ๋ฐฐ๋ฌํ ๊ณ์ฐ ์์ |
| 65 | + |
| 66 | + |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +- ์ฌ๊ธฐ์ ๊ฐ์ฅ ์์ชฝ ์๋ ๋ฉ์๋์ LocalDateTime.now()๋ ์ ์ดํ ์ ์๋ ์์ญ์ด ์๋ค. -> ๊ฒฐ๊ตญ ์ ์ฒด๊ฐ ํ
์คํธํ ์ ์๋ ์ฝ๋๋ก ์ค์ผ์ด๋๋ค. |
| 73 | + |
| 74 | + |
| 75 | + |
| 76 | + |
| 77 | + |
| 78 | +- isValid๋ฅผ ์ธ์๋ฅผ ๋ฐ์ ์ ์๊ฒ ๋ณ๊ฒฝํ๋ค. ๋๊ฒจ์ง ์๊ฐ์ ์ํด ์ ์ด๊ฐ ๋๋ฏ๋ก ํ
์คํธํ ์ ์๊ฒ๋๋ค. |
| 79 | + |
| 80 | + |
| 81 | + |
| 82 | +- ๊ณ์ ์ฌ๋ฆฐ๋ค. ์ด๋๊น์ง ์ฌ๋ฆด๊ฒ์ธ๊ฐ? |
| 83 | + - ์ฌ๊ธฐ์ Boundary Layer๋? ํ ๋ชจ๋๋ก์์ ์๋ฏธ๋ฅผ ์ง๋๋ ๊ฐ์ฅ ๋ฐ๊นฅ ์ชฝ (์ด๊ฑด ์ค๊ณ์ ๋ฐ๋ผ ๋ฑ ์ ์ํ๊ธฐ ํ๋ ๋ถ๋ถ) |
| 84 | + -  |
| 85 | + |
| 86 | +์ฆ **"ํ
์คํธ ๋ถ๊ฐ๋ฅํ ์์ญ์ Boundary Layer๋ก ์ฌ๋ ค์ ํ
์คํธ ๊ฐ๋ฅํ๋๋ก ๋ณ๊ฒฝ"** |
| 87 | + |
| 88 | +## 2. Java, Spring Framework |
| 89 | + |
| 90 | +- `@SpringBootTest` |
| 91 | + -  |
| 92 | + - Spring Context๊ฐ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ์์๋ค. |
| 93 | + - ๋น ๋ฅธ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์๋ค. |
| 94 | + - Spring Context๋ ์ธ์ด์ ๋ณธ์ง์ ๋ง๊ฐ์ ์ํค๊ฒํ ์ ์๋ค. |
| 95 | + |
| 96 | +**"Context, Framework ์ข
์์ ์ด์ง ์์ ํ
์คํธ ์ฐ์ "** |
| 97 | + |
| 98 | + |
| 99 | + |
| 100 | +## 3. Test Double |
| 101 | + |
| 102 | +> Test Double์ ํ
์คํธ ํ ์ ์๋ ์์ญ์ ๋ํ ์ธ๋ถ ์์ธ์ ๋ถ์ฌํ ์ ์๋๋ก ๋์์ค |
| 103 | +
|
| 104 | +- ๋ฌด์์ Test Double๋ก ์ฒ๋ฆฌํด์ผํ ๊น? |
| 105 | + |
| 106 | + -  |
| 107 | + |
| 108 | + > ์๊ฐ call stack ์ต์๋จ์ด๋ฉฐ 1, 2, 3, 4๋ฒ ์ฝ๋๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํ (4๋ฒ์ด ํ
์คํธ ํ๊ณ ์ถ์ ์์ญ) |
| 109 | +
|
| 110 | + -  |
| 111 | + |
| 112 | + - 4๋ฒ๋ง ํ
์คํธ ํ ๊บผ๋ ์ ์ธํ ์์ญ์ Test Double๋ก? |
| 113 | + |
| 114 | + - **Test Double์ ์ฌ์ฉํ๋ ๊ฒ์ ํ
์คํธ๊ฐ ๊ตฌํ์ ์์์ผ ํ๋ค๋๊ฒ** |
| 115 | + |
| 116 | + - ex) ๋ฐํ ํ์
or ์
๋ ฅ๊ฐ ๋ณ๊ฒฝํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. |
| 117 | + |
| 118 | + - **Test Double์ ๋จ์ฉ์ ๊ตฌํ ํ
์คํธ๋ก ์ ๋ํ ์ ์๋ค.** |
| 119 | + |
| 120 | +- **๊ทธ๋ผ Test Double์ ์ด๋ป๊ฒ ์ฐ์ง?** |
| 121 | + |
| 122 | + - **Boundary Context ๊น์ง ๋์ด์ฌ๋ ธ๋๋ฐ ํ
์คํธํ ์ ์๋ ์์ญ์ด ์กด์ฌํ ๋** |
| 123 | + - ํธ๋ฆฌํ์ง๋ง ์ฌ์ฉ์ ์์ํ์ฌ ์ต์ํ |
| 124 | + - ์์ ์๋ฐ ์ดํ๋ฆฌ์ผ์ด์
์ผ๋ก๋ ํ
์คํธํ ์ ์๋ ๊ฒ |
| 125 | + - -> ๋๋ถ๋ถ Embedded๋ก ๊ฐ๋ฅ |
| 126 | + - ex) ์ ์ฅ์ ์
์ถ๋ ฅ๊ฒ์ฆ(์ฟผ๋ฆฌ ์๋๊ฐ๋์ง), SPEC ๊ฒ์ฆ(๋ด๋ถ controller, ์ธ๋ถ API) |
| 127 | + |
| 128 | + |
| 129 | +## 4. Embedded |
| 130 | + |
| 131 | +- ์ข
๋ฅ |
| 132 | + |
| 133 | + |
| 134 | + |
| 135 | +- ํ
์คํธ์ Embedded ์์คํ
์ ๋์ผํ ๋ผ์ดํ ์ฌ์ดํด์ ๊ฐ๋๋ก ๊ตฌ์ฑ |
| 136 | + -  |
| 137 | + |
| 138 | + |
| 139 | + |
| 140 | + |
| 141 | + |
| 142 | +## 5. EndPoint Test |
| 143 | + |
| 144 | +- Spring Framework Support |
| 145 | + - MockMvc, REST Assured, WebTestClient |
| 146 | +- **ํ
์คํธ์ ๋ชฉ์ ์ ์์ฒญ๊ณผ ์๋ต ์คํฉ ๊ฒ์ฆ๋ง์ผ๋ก ์ ํํ๋๊ฒ ์ ์ ๊ฑด๊ฐ์ ์ข์๊ฒ์ด๋ผ๊ณ ์๊ฐ** (๋ค๋ฅผ ์์ ๋ชจ๋ฅด๊ฒ) |
| 147 | + -  |
| 148 | + - ๋ค์ ๋ก์ง์ ๋ค ์์์ผ๋๊ณ , ํ
์คํธ ๊ฐ๋ฅํ ์์ญ์ด์ฌ์ผํ๊ณ , case by case๋ ๋๋ฌด ๋ง๊ธฐ์ |
| 149 | + |
| 150 | +# TIP & RULE |
| 151 | + |
| 152 | +1. **ํ
์คํธ๊ฐ ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ์ํธ ๋
๋ฆฝ์ ์ผ๋ก ์์ฑ** |
| 153 | + 1. ๋ชจ๋ ํ
์คํธ์ ์์์ ๊ด๊ณ๋ฅผ ์๊ฐํ์ฌ ํ
์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ค์ |
| 154 | + 2. ๊ณต์ ๋๋ ์์์ ์ด๊ธฐํํ์ฌ ๋ค๋ฅธ ํ
์คํธ์ ์ํฅ์ ๋ฐ์ง ์๋๋ก |
| 155 | + 3. ๋จ๊ณ๊ฐ ํ์ํ๋ค๋ฉด JUnit5 ์ Dynamic Testfใ
กใน ์ถ์ฒ |
| 156 | +2. ํ
์คํธ ์์ ์๋์ ๋ชฉ์ ์ด ๋ค์ด๋๋๋ก ์์ฑ |
| 157 | + 1. ์ด๋ค ์กฐ๊ฑด์์, ๋ฌด์์ ์ํํ์๋, ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ์ง ์ ์ ์์ด์ผํ๋ค. (๊ฐ์ธ์ ์ผ๋ก @Before์ ์ ์ผ๋ฉด ํ์
ํ๊ธฐ ํ๋ฌ) |
| 158 | + 2. ํ
์คํธ ์ฝ๋ ์ญ์ ๊ฐ๋
์ด ์ค์ |
| 159 | +3. ํ
์คํธ ์ฝ๋๋ ๋ฆฌํฉํ ๋ง ๋์ |
| 160 | + 1. ์ฝ๋์์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ์๋ ๊ฐ ์์ ์ฑ, ์๊ตฌ์ฌํญ ์ ๋ฆฌ๋ฑ ๋น์ฆ๋์ค ์ฝ๋์ ๋์ผํ ์์ค์ ๋ฆฌํฉํ ๋ง์ด ํจ๊ป ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. |
| 161 | + |
| 162 | +# Reference |
| 163 | + |
| 164 | +- https://www.youtube.com/watch?v=YdtknE_yPk4 |
| 165 | + |
0 commit comments