Bibi's DevLog ๐Ÿค“๐ŸŽ

TDD, ํ…Œ์ŠคํŠธ์ฝ”๋“œ ๊ฐœ๋… ๋ฐ Gradle, JUnit ์ดˆ๊ธฐ์„ค์ • ํ•˜๊ธฐ ๋ณธ๋ฌธ

๐Ÿ–ฅ BE ๋ฐฑ์—”๋“œ/Java ์ž๋ฐ”

TDD, ํ…Œ์ŠคํŠธ์ฝ”๋“œ ๊ฐœ๋… ๋ฐ Gradle, JUnit ์ดˆ๊ธฐ์„ค์ • ํ•˜๊ธฐ

๋น„๋น„ bibi 2021. 2. 10. 18:12

TDD์™€ ํ…Œ์ŠคํŠธ์ฝ”๋“œ

TDD (Test-Driven Development, ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ).

์ž๋ฐ” main๋ฉ”์†Œ๋“œ

: ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๊ณ , ๊ตฌํ˜„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  • production code : ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„์„ ๋‹ด๋‹นํ•˜๋Š” ์ฝ”๋“œ

  • test code : production code๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ

but..

main๋ฉ”์†Œ๋“œ๋กœ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒฝ์šฐ์˜ ๋ฌธ์ œ์ 

  • ํด๋ž˜์Šค ๋ฐ main๋ฉ”์†Œ๋“œ๊ฐ€ ์ปค์ ธ์„œ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค
  • ํ•œ ๋ฉ”์†Œ๋“œ์— ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๊ฐ€ ์žˆ์–ด ์–ด๋–ค ํ…Œ์ŠคํŠธ๊ฐ€ ์ด๋ฃจ์–ด์ง„ ๊ฒƒ์ธ์ง€ ์•Œ๊ธฐ ์–ด๋ ต๋‹ค
  • ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์ฝ˜์†”์—์„œ ์ผ์ผ์ด ์‚ฌ๋žŒ์ด ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค
  • ํ…Œ์ŠคํŠธ์ฝ”๋“œ๊ฐ€ pruduction code์™€ ํ•จ๊ป˜ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ๋‹ค

JUnit๊ณผ AssertJ

JUnit
: ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. (๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ํ•˜๋‚˜)

AssertJ
: ๋‹ค์–‘ํ•œ assertion์„ ์ œ๊ณตํ•˜๋Š” ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ.

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝํžˆ๋„๋ก ํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    ์ฆ‰, ์—๋Ÿฌ๋ฉ”์‹œ์ง€์™€ ํ…Œ์ŠคํŠธ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค€๋‹ค.
    (JUnit์ด ์ œ๊ณตํ•˜๋Š”๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค ๊ฐ€๋…์„ฑ์ด ํ›จ์”ฌ ๋†’์•„์ง„๋‹ค)

ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ gradle๊ณผ testํด๋” ์ดˆ๊ธฐ์„ค์ • ํ•˜๊ธฐ (Java8, IntelliJ)

ํ•จ๊ป˜ ์คŒ์—์„œ ๊ณต๋ถ€ํ•˜๋˜ ํ”„๋ ˆ๋””๊ฐ€ ๋„์›€์„ ์ฃผ์…จ๋‹ค. ์ฒœ์ฒœํžˆ ๊ฐ€๋ฅด์ณ ์ฃผ์…”์„œ ์••๋„์  ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค๐Ÿ™‡โ€โ™‚๏ธ๐Ÿ™‡โ€โ™‚๏ธ(์—˜-๋ฉ˜)

์•„๋ž˜๋Š” ๊ฐ€๋ฅด์ณ ์ฃผ์‹  ๋‚ด์šฉ์„ ๊ธฐ๋ก ๋ฐ ์ •๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

1

์ž๋ฐ”๋Š” ์ปดํŒŒ์ผ ์–ธ์–ด์ด๋‹ค.
์ฆ‰, .javaํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒŒ ์•„๋‹Œ, .java์˜ ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ์ธ .classํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.

javac ํŒŒ์ผ.java ๋ช…๋ น์œผ๋กœ ์ปดํŒŒ์ผ ํ•œ ๋’ค, java ํŒŒ์ผ.class๋กœ ์‹คํ–‰ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ์ฒ˜์Œ ์„ค์ •ํ•  ๋•Œ๋Š”,
IntelliJ์™€ ๊ฐ™์€ IDE์ž…์žฅ์—์„œ๋Š” ์‹คํ–‰ํ•  .classํŒŒ์ผ์ด ๋‹ด๊ธด ๊ฒฝ๋กœ๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค.
์ด๋ฅผ classpath ์„ค์ • ์ด๋ผ๊ณ  ํ•œ๋‹ค.

2

gradle ์‚ฌ์šฉํ•  ๋•Œ๋Š” classpath๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

  • ํ”„๋กœ์ ํŠธ์˜ build.gradleํŒŒ์ผ (์ฝ”๋ผ๋ฆฌ ์•„์ด์ฝ˜)์„ ๋ˆŒ๋Ÿฌ
    apply plugin: 'java'๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

  • gradle์€ ๊ธฐ๋ณธ์ ์œผ๋กœ buildํด๋” ๋‚ด๋ถ€์— ์ปดํŒŒ์ผ๋œ ์†Œ์Šค ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด ์ค€๋‹ค.
    ํ”„๋กœ์ ํŠธ์˜ build - classesํด๋”๋ฅผ ๋ˆŒ๋Ÿฌ srcํด๋”์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ์ปดํŒŒ์ผ๋œ ์†Œ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    ํ•ด๋‹น ํด๋”์— ํŒŒ์ผ&ํด๋”๊ฐ€ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋‹ค๋ฉด IDE๊ฐ€ gradle์„ ํ†ตํ•ด ์ œ๋Œ€๋กœ ๋นŒ๋“œ๋ฅผ ํ•ด ์ค€ ๊ฒƒ์ด๊ณ (์ปดํŒŒ์ผ์ด ์ž˜ ๋œ ๊ฒƒ), ์—†๋‹ค๋ฉด IDE๊ฐ€ ํ•ด๋‹น ํŒŒ์ผ&ํด๋”๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชฐ๋ผ ๋นŒ๋“œ๋ฅผ ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ(์ปดํŒŒ์ผ์ด ์ž˜ ๋˜์ง€ ์•Š์€ ๊ฒƒ)์ด๋‹ค.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ธํ…”๋ฆฌJ์—์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋Š” srcํด๋”๊ฐ€ ์ž๋™์œผ๋กœ ์žกํ˜€ ์žˆ์ง€๋งŒ,
    ๊ฐ€๊ธ‰์  ์•„๋ž˜์™€ ๊ฐ™์€ ํด๋”๊ตฌ์กฐ(ํ‘œ์ค€)๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค (gradle ์‚ฌ์šฉ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด)

    • ์†Œ์Šค ์ฝ”๋“œ : ํ”„๋กœ์ ํŠธ ํ•˜์œ„์— /src/main/java ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ฐ‘์— ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
    • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ : ํ”„๋กœ์ ํŠธ ํ•˜์œ„์— /src/test/java ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ๋ฐ‘์— ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.
  • ํ‘œ์ค€์‚ฌํ•ญ ์™ธ์— ๋ณ„๋„๋กœ ์„ค์ •ํ•˜๊ณ  ์‹ถ์€ ์˜ต์…˜์ด ์žˆ๋‹ค๋ฉด build.gradleํŒŒ์ผ ๋‚ด์— ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.
    gradle๋กœ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๋ฉด, gradle์€ ๋งค๋ฒˆ ์ดˆ๊ธฐํ™” ํ•œ ๋‹ค์Œbuild.gradle๋‚ด์šฉ์— ๋”ฐ๋ผ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    • ์šฐ๋ฆฌ๋Š” ๋ฏธ์…˜์—์„œ build.gradleํŒŒ์ผ์ด ์…‹ํŒ…๋˜์–ด ์ฃผ์–ด์กŒ์œผ๋‹ˆ ๊ทธ๋Œ€๋กœ ๋”ฐ๋ฅด๋ฉด ๋œ๋‹ค.

3

ํ…Œ์ŠคํŠธ ํด๋”์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

๊ฐ€๊ธ‰์  ์ธํ…”๋ฆฌJ์—์„œ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์ž.

  • ํ…Œ์ŠคํŠธ ํด๋”
    : src์•„๋ž˜์— test๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ์‹œ์ ์—, ์•„๋ž˜์— ํ‘œ์‹œ๋˜๋Š” ์ดˆ๋ก์ƒ‰ ํด๋”๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ์ƒ์„ฑ.

  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

    1. ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” .javaํŒŒ์ผ์—์„œ ํด๋ž˜์Šค๋ช…์„ ํด๋ฆญํ•œ ๋’ค,
      Alt + Insert ๋‹จ์ถ•ํ‚ค๋กœ Generate์ฐฝ์„ ์—ด๊ณ  Test๋ฅผ ๋ˆ„๋ฅธ๋‹ค.

    2. Testing library๋กœ JUnit5๋ฅผ ์ง€์ •ํ•˜๊ณ  OK๋ฅผ ๋‘ ๋ฒˆ ๋ˆ„๋ฅธ๋‹ค.

    3. /src/test/javaํด๋” ์•„๋ž˜์— main๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ํด๋ž˜์Šค๋ช…Test ๋ผ๋Š” ํ…Œ์ŠคํŠธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

    4. ํ•ด๋‹น ํด๋ž˜์Šค์— ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

4

JUnit ์‚ฌ์šฉ์„ฑ์„ ๋†’์—ฌ ์ฃผ๋Š” ์˜ต์…˜ (IntelliJ)

  1. Settings
  2. Build, Execution, Deployment
  3. Build tools - Gradle
  4. Build and run using๊ณผ Run tests using ํ•ญ๋ชฉ์„ Gradle์—์„œ IntelliJ IDEA๋กœ ๋ฐ”๊ฟ” ์ค€๋‹ค.