DevLog ๐ถ
[TDD] ์๋ฐ ํ ์คํธ ์ฝ๋, ๋จ์ ํ ์คํธ, ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ (feat. ์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์) ๋ณธ๋ฌธ
[TDD] ์๋ฐ ํ ์คํธ ์ฝ๋, ๋จ์ ํ ์คํธ, ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ (feat. ์๋์ฐจ ๊ฒฝ์ฃผ ๊ฒ์)
dolmeng2 2023. 2. 14. 00:13์ฐํ ์ฝ ์์ ๋ค์๋ ๋ด์ฉ ์ค์์ ๊ฐ๋จํ๊ฒ ๋ด ์๊ฐ์ ์ ๋ฆฌํ๊ณ ์ถ์ด์ ์์ฑํ๋ ๊ธ!
โจ ํ ์คํธ ์ฝ๋์ ๋ฒ์
ํ ์คํธ ์ฝ๋๋ ์ด๋ ์ ๋๋ก ์๊ฒ ๋ง๋ค์ด์ผ ๋ ๊น ๊ณ ๋ฏผ์ ๋ง์ด ํ๋ค. ์ฌ์ค ์ด์ ์๋ ํ ์คํธ ์ฝ๋๋ฅผ ๊ฑฐ์ ์์ฑํ ๊ฒฝํ๋ ์๊ณ , given-when-then๋ง ๊ตฌ๊ตฌ์ ์ ์๊ณ ์์์ด์ ํ ์คํธ ์ฝ๋์ ๋ฒ์๊น์ง๋ ์ ๋๋ก ์๊ฐํด ๋ณธ ์ ์์๋ค. (์ ์ง์ง ์๋์ด๋ค!)
๊ฐ์ธ์ ์ธ ์๊ฐ์ผ๋ก ํ ์คํธ ์ฝ๋๋ ํด๋น ๊ฐ์ฒด์ public ๋ฉ์๋์ ๋ํด์๋ ์ ๋ถ ํ ์คํธ๋ฅผ ํ๋ ๊ฒ ๋ง๋ค๊ณ ์๊ฐํ๋ค. ๋ฌผ๋ก , private ๋ฉ์๋๋ public์์ ํธ์ถํด์ ๊ฐ์ ์ ์ผ๋ก ํ ์คํธ ํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.
์ด๋ฐ์ ํ์ด ํ๋ก๊ทธ๋๋ฐ์ ์งํํ ๋, private ๋ฉ์๋๋ฅผ ํ ์คํธํ๋ ค๊ณ ๋ฆฌํ๋์ ๊น์ง ์จ๊ฐ๋ฉด์ ์งํํ๋ค.
์ฐ์ , Cars์ ๊ฒฝ์ฃผ์ ๋ํ ๋ฉ์๋์ด๋ค. Cars๋ Car์ ๋ํ ์ผ๊ธ ์ปฌ๋ ์ ๊ฐ์ฒด์ด๋ค.
์๊ฑฐ๋ Car์ ์์ง์์ ๋ํ ๋ฉ์๋์ด๋ค.
์ง๊ธ ๋ณด๋๊น ์ง์ง ์ด๊ฒ ๋ญ์ง...? ๋ผ๋ ์๊ฐ๋ฐ์ ์ ๋ ๋ค. ์ฌ์ค ์ด๋ฒ ๊ณผ์ ์์ ํต์ฌ ๋๋ฉ์ธ ๋ก์ง์ธ '์๋์ฐจ ์ ์ง'์ ๋ํ ๊ฒ์ธ๋ฐ, ๋ด๋ถ์์ ๋๋ค ๋๋ฒ๋ฅผ ์์ฑํด์ฃผ๋ฉด์ ์ด์ ๋ํด์ ํ ์คํธ๊ฐ ํ๊ธฐ ํ๋ ๊ฒ์ด์๋ค. ๊ทธ๋์ ์ ๋ ๊ฒ ๋ฆฌํ๋์ ์ ํตํด ์ ๊ทผํ๊ณ , ์ง์ ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ๋ ์์ผ๋ก ์งํ์ ํ๊ฒ ๋ ๊ฒ์ด๋ค. (๋ฌผ๋ก ์ ๋ ์ด๋ ๊ฒ ํ๋ฉด ์ ๋๋ค.) ์ค๋ฅธ์ชฝ ์ญ์ ์ฐ์นํ ์๋์ฐจ๋ฅผ ๋ฝ๋ ๊ฒ์ธ๋ฐ, ๋ด๋ถ์ ์ผ๋ก ์์น๊ฐ ์ธํ ๋์ด ์๋ ์๋์ฐจ๋ฅผ ์ป์ด์ฌ ์๊ฐ ์์ด์ ์ ๋ฐ ์์ผ๋ก ์ง์ ํ๋์ ๊ฐ์ ์ธํ ํด์ฃผ๋ ์์ผ๋ก ์งํํ๋ค.
๋น์ฐํ ๋ฆฌ๋ทฐ๋ ์ด๋ ๊ฒ ๋ฐ์ ์๋ฐ์ ์์๋ค. ๋ด ๋ฌธ์ ๋ ํฌ๊ฒ 2๊ฐ์ง์๋ค.
1. ๋๋ฉ์ธ์ ๋ํ ์ญํ ๊ณผ ์ฑ ์์ ์ ๋๋ก ๋๋์ง ์์ ๊ฒ
2. ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ์ ๋ํด์ ๋ถ๋ฆฌํ์ง ์์ ๊ฒ.
ํนํ 1๋ฒ์ ์ ๋ง ์ค์ํ ๋ถ๋ถ์ด์๋ค. ๋ฆฌ๋ทฐ์ด๋์ด ๋ง์ํด์ฃผ์ ๊ฒ์ฒ๋ผ, car๊ฐ ์์ง์ด๋์ง, ์์ง์ด์ง ์์์ง์ ๋ํ ํ ์คํธ๋ฅผ ๊ตณ์ด cars๊น์ง ์์ฑํ๋ฉด์ ์งํํ ํ์๊ฐ ์ ํ ์์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๋จ์ ํ ์คํธ์ ๋ํด์ ๋ค์ ์๊ฐํด๋ณด๋ ๊ณ๊ธฐ๊ฐ ๋ ๊ฒ ๊ฐ๋ค. ๊ธฐ์กด์๋ Cars์์ random number์ ๋ํด์ ์๋์ฐจ๋ฅผ ์์ง์ผ์ง ๋ง์ง ํ๋จํ๋๋ก ํ์ง๋ง, Car์๊ฒ ๋งค๊ฐ๋ณ์๋ก ํด๋น ๊ฐ์ ๋๊ฒจ์ฃผ๊ณ ๊ฐ์ฒด๊ฐ ์ง์ ์์ง์ผ์ง ๋ง์ง ํ๋จํ๋ ์์ผ๋ก ๊ตฌํํ์๋ค. '๊ฐ์ฒด์๊ฒ ์ง๋ฌธํ๋ผ.' ๋ผ๋ ๊ฒ์ ์ ๋๋ก ๊นจ๋ฌ์ ์ ์์๋ค. ๊ทธ๋์, ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์์ ํ์๋ค.
์ด ๋๋ถ์ ํ ์คํธ ์ฝ๋๋ ์ด๋ ๊ฒ ๊ฐ๋จํด์ก๋ค. ์ ํํ๊ฒ ํด๋น ์๋์ฐจ์ ์์ง์์ ๋ํด์๋ง ํ๋จํ๋ ์ง์ ํ '๋จ์ ํ ์คํธ'๊ฐ ๋ ๊ฒ์ด๋ค.
์๋ฌดํผ, ๋ง์ด ์กฐ๊ธ ์ ๊ฒ ๊ฐ์ง๋ง ๋จ์ ํ ์คํธ๋ ํด๋น ๊ฐ์ฒด์ ํ์์ ์ฑ ์์ ๋ช ํํ๊ฒ ์ค๊ณํ ์ํ๋ก, ํด๋น ๊ฐ์ฒด์ ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ๋ํด์๋ง ํ ์คํธํ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋ง์ฝ ๋จ์ ํ ์คํธ๊ฐ ์ง๋์น๊ฒ ๋ณต์กํด์ง๋ค๋ฉด, ๊ฐ์ฒด์ ์ค๊ณ๋ฅผ ๋ค์ ์์ ํ ํ์๊ฐ ์๋ค. ๊ฐ์ฒด๋ ๋ฌด์กฐ๊ฐ ํ ๋ฒ์ ํ ๊ฐ์ง ์ผ๋ง ํ๋๋ก ํ์๋ ๊ฒ!
โจ ํ ์คํธ ๋ฉ์๋์ ๋ค์ด๋ฐ
์ด๊ฑฐ๋ ํ์ด๋๋ ์๊ธฐ ๋๋ด๋ ๋ถ๋ถ์ด๊ณ , ๋ค์ค๊ฐ ์์ ์ค์ ์ธ๊ธ๋ ํด์ฃผ์ ๋ถ๋ถ์ด์๋ค. ์ฌ์ค ๋ ๊ฐ์ ๊ฒฝ์ฐ ํ ์คํธ ๋ฉ์๋ ์ญ์ given-when-then์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ์ ํธํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋์ ๋ค์์ ํด๋น ๋ฉ์๋๊ฐ ๋ฌด์จ ์ผ์ ํ๋์ง ์ด๋ฆ๋ง ๋ณด๊ณ ๋ ๋์ด๊ฐ ์ ์์ ์ ๋๋ก ์ ํํํ๊ณ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฌ๋, @DisplayName ์ด๋ ธํ ์ด์ ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ช๋ช ๋ถ๋ค์ ๊ตณ์ด ๊ทธ๋ ๊ฒ ์์ฑํ ํ์๊ฐ ์๋ค๊ณ ํ์ จ๋ค. ๋ฌผ๋ก ๋ง์ง๋ง, ํ๋ฉด์ ๋์์ง๋ ์ด๋ฆ์ ํด๋น ๋ฉ์๋๊ฐ ๋ฌด์จ ์ผ์ ํ๋์ง ์์ ํ๋ฏ์ด ํ์ด์ฐ๋ ๊ณต๊ฐ์ด๋ผ๊ณ ์๊ฐํ๊ณ , ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ๋ฅผ ๋๋ ธ์ ๋ (Intellij IDEA๋ก ๋น๋ ์) ํด๋น ํ ์คํธ์ ๋ํด ํ ๋์ ํ์ธํ๋ ์ฉ๋ ์ ๋๋ผ๊ณ ์๊ฐํ๋ค. ๋๋ ๋ฉ์๋ ๋ค์์ผ๋ก ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋น ๋ฉ์๋์ ๋ํด ํ๋จํ ์ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋ค์ด๋ฐ์ด ์ค์ํ๋ค๊ณ ์๊ฐํ๋ ์ชฝ์ ์๊ฒ ํ ํ๋ฅผ ๋์ง๊ณ ์ถ๋ค.
โจ ๋จ์ ํ ์คํธ
๋จ์ ํ ์คํธ ์ ์ค์ํ ๊ฑด ์ฒซ ๋ฒ์งธ๋ก, ํ ์คํธํ ์ ๋นํ ๊ฐ์ ์ฐพ๋ ๊ฒ์ด๋ค. ๋ฌด์์ ์๋ฌด ๊ฐ์ด๋ ํ ์คํธํ๋ ๊ฒ์ด ์๋๋ผ๋ ์ ์ด๋ค. 1~100๊น์ง์ 100๊ฐ์ ํ ์คํธ๋ฅผ ์งํํ๋ ๊ฒ๋ณด๋ค, ๊ฒฝ๊ณ๊ฐ์ ๋ํด์ ํ ์คํธ๋ฅผ ์งํํด์ฃผ๋ ๊ฒ์ด ๋ ์ข๋ค๊ณ ์๊ฐํ๋ค.
@ParameterizedTest
@ValueSource(ints = {0, 3})
@DisplayName("๋๋ค๊ฐ์ด 3 ์ดํ๋ฉด ์๋์ฐจ๊ฐ ์ ์งํ๋ค.")
void givenThreeLessNumber_thenCarStop(int randomNumber) {
// given
int initPosition = car.getPosition();
// when
car.move(randomNumber);
// then
assertThat(car.getPosition())
.isEqualTo(initPosition);
}
๋ ๊ฐ์ ๊ฒฝ์ฐ ์๋์ฐจ ์ ์ง์ ๋ํ ํ ์คํธ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด 0, 3์ ๋ํด์๋ง ํ ์คํธ๋ฅผ ์งํํ์๋ค. ๋๋ฉ์ธ ์ ์ฝ ์ฌํญ์ด 0~9 ์ฌ์ด์ ๊ฐ์ ๋ํด์ ํ๋จ์ด ๋๊ธฐ ๋๋ฌธ์, ์ ์ง์ ๋ํด์๋ 0~3, ์์ง์์ ๋ํด์๋ 4~9์ ๋ํด์ ์งํํ์๋ค. ์ด๋ ๊ฒ ๋ฒ์ ๋ด์์์ ์ต์, ์ต๋๊ฐ์ ๋ฃ์ด์ ํ ์คํธ๋ฅผ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๋ ๋ฒ์งธ๋ก๋, ๋ด๊ฐ ์ด๋ ํ ๋ก์ง์ ํ ์คํธํ ๊ฒ์ธ์ง ํ๋จํ๋ ๊ฒ์ด๋ค. ์ด์ ์ ๋์ ์ฝ๋ (= ๋ด ์ฝ๋)๋ฅผ ๋ณธ ๊ฒ์ฒ๋ผ, ์๋์ฐจ๋ฅผ ์์ง์ด๋ ๊ฒ์ ๋ํ ํ ์คํธ๋ฅผ ์งํํ๋๋ฐ ๊ตณ์ด cars๋ฅผ ์์ฑํ๋ฉด์๊น์ง ํ ์คํธ๋ฅผ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ๊ฐ์ธ์ ์ผ๋ก 2๊ฐ์ง๋ฅผ ์๊ฐํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
1. ์ด๋ค ๊ฐ์ฒด์ ์ฑ ์์ธ๊ฐ?
2. ํด๋น ๊ฐ์ฒด์ ์ด๋ค ํ์๋ฅผ ํ ์คํธํ ๊ฒ์ธ๊ฐ?
์ด๋ ๊ฒ ๋ฑ 2๊ฐ์ง๋ฅผ ํ ์คํธ ํ๋๋ฐ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ํ์ํ๋ค๋ฉด, ํ ๊ฐ์ฒด์ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ์ผ์ ํ๊ณ ์๋์ง ๊ฒ์ฆํด๋ด์ผ ํ๋ค. ๋ฌผ๋ก ! ๋จ์ ํ ์คํธ์ ์ด์ผ๊ธฐ์ด๋ค. ๐ ๊ทธ๋ฆฌ๊ณ , ์ด๋ ๊ฒ ์์ ๋จ์์ ๋ํด์ ํ ์คํธ๋ฅผ ์งํํ๋ค ๋ณด๋ฉด ์ด์ ์ ํ ์คํธํ๋ ํญ๋ชฉ๊ณผ ๋น์ทํ๊ฒ ํ ์คํธํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํด์ ๊ฐ๋ฐ์ ์ผ๋ก๋ ์ค๋ฅ์ ๋ํ ์์ธก์ด ์ฌ์์ง๋ค.
๊ฐ๋จํ๊ฒ ์์ฑํ๋ ค๊ณ ํ๋๋ฐ ์ฐธ ๊ธธ์ด์ก๋ค. TDD๋ ๋ค์ ๋ฏธ์ ์งํํ๋ฉด์ ๋๋ ๊ณต๋ถํด๋ณด๊ณ ์ ํ๋ค! ๋ ๊น๋ํ ์ฝ๋๋ฅผ ์ํด์ ํ์ดํ ...!
'โ๏ธ > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ถ๋ณ๊ฐ์ฒด๋ก ๋ง๋๋ ๊ฒ์ด ํญ์ ์ข์๊น? - Value Object vs Reference Object (0) | 2023.04.21 |
---|---|
[Java] Classic TDD vs Mockist TDD (0) | 2023.03.28 |
[Java] ConcurrentModificationException์ ์ธ์ ๋ฐ์ํ ๊น? iterator์ ๋์ ์๋ฆฌ ์ดํด๋ณด๊ธฐ (4) | 2023.03.06 |
[Java] ๋ฌธ์์ด - String pool๊ณผ String concatenation (6) | 2023.03.05 |
[Java] Method Naming Convention (0) | 2022.10.22 |