Skip to content

Latest commit

ย 

History

History
203 lines (146 loc) ยท 7.36 KB

2022-02-24-test-driven-development-1.md

File metadata and controls

203 lines (146 loc) ยท 7.36 KB

[Test Driven Development] Part 1, chapter 1

Preface


  • Test-Driven Development (TDD) ์˜ ๋ชฉํ‘œ๋Š” Clean Code ์ด๋‹ค

  • Clean Code ๊ฐ€ ์˜๋ฏธ ์žˆ๋Š” ๋ชฉํ‘œ์ธ ์ด์œ 

    1. ๋ฒ„๊ทธ์˜ ๋Šช์„ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ์˜ ์™„์„ฑ์„ ์˜ˆ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค

    2. ์ž‘์„ฑํ•˜๋ ค๋Š” ์ฝ”๋“œ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ค€๋‹ค (๋‚˜๋ฌด๋ณด๋‹ค๋Š” ์ˆฒ)

  • Rules for Development with TDD

    1. ์ž‘์„ฑํ•œ automated test ๊ฐ€ ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ (์ฝ”๋“œ ์ž‘์„ฑ ์ „ ์‹คํŒจํ•˜๋Š” automated test ์ž‘์„ฑ)

    2. ์ค‘๋ณต์ฝ”๋“œ ์ œ๊ฑฐ

  • TDD๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค‘ ๊ฒฐ์ •๊ณผ ํ”ผ๋“œ๋ฐฑ ์‚ฌ์ด์˜ ์ž๊ฐํ•˜๋Š” ๊ณผ์ •์ด์ž ๊ทธ ์‚ฌ์ด์˜ ๊ฐญ์„ ๋ฉ”๊ฟ”์ฃผ๋Š” ๊ธฐ์ˆ ์ด๋‹ค


Introduction


์–ด๋Š ๊ธˆ์š”์ผ, ๋งค๋‹ˆ์ €๊ฐ€ ๊ณ ๊ฐ Peter๋ฅผ ์†Œ๊ฐœ์‹œ์ผœ์ค€๋‹ค. ํ”ผํ„ฐ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ž์‚ฐ๊ด€๋ฆฌ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ WyCash๋ฅผ ์“ฐ๊ณ  ์žˆ๋‹ค.

ํ”ผํ„ฐ๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์— ๋งŒ์กฑํ•˜์ง€๋งŒ USD๋งŒ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์— ๋”ํ•ด์„œ ๋‹ค๋ฅธ ํ†ตํ™”๋“ค๋„ ์ง€์›๊ฐ€๋Šฅํ•œ ์ง€ ๋ฌป๋Š”๋‹ค.


์ด ์ฑ…์—์„œ๋Š” ์ด ๋ฌธ์ œ๋ฅผ Test-Driven Development(TDD)๋ฅผ ํ†ตํ•ด ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๊ฐ„๋‹จํ•œ rule๋งŒ ๋”ฐ๋ฅด๋ฉด ๋œ๋‹ค.

1. ์ฝ”๋“œ ์ž‘์„ฑ ์ „์— ์‹คํŒจํ•˜๋Š” ์˜คํ† ๋ฉ”์ด์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ผ
2. Duplication์„ ์ œ๊ฑฐํ•ด๋ผ


Part 1: The Money Example


ํ˜„์žฌ ์ง€์›ํ•˜๋Š” ๋ฆฌํฌํŠธ๋Š” ๋‹ค์–‘ํ•œ ํ†ตํ™”๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜ค๋ฅธ์ชฝ ๋ฆฌํฌํŠธ์™€ ๊ฐ™์ด ์—…๋ฐ์ดํŠธ ๋˜์–ด์•ผ ํ•œ๋‹ค

ํ˜„์žฌ ์ง€์›ํ•˜๋Š” ๋ฆฌํฌํŠธ ๋‹ค์–‘ํ•œ ํ†ตํ™”๊ฐ€ ํ‘œ๊ธฐ๋œ ๋ฆฌํฌํŠธ ํ™˜์ „์œจ
ํˆฌ์ž ๋Œ€์ƒSharesPriceTotal
AAPL10002525000
MSFT40010040000
ํˆฌ์ž ๋Œ€์ƒSharesPriceTotal
AAPL100025 USD25000 USD
MSFT400150 KRW60000 KRW
Total55000 USD
FromToRate
KRWUSD1.5

์ƒˆ๋กœ์šด ๋ฆฌํฌํŠธ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๊ธฐ๋Šฅ๋“ค์ด ํ•„์š”ํ• ๊นŒ?

๋ฐ”๊พธ์–ด ๋งํ•ด์„œ ์–ด๋–ค ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ํ†ต๊ณผํ–ˆ์„ ๋•Œ ์ž‘์„ฑํ•œ ์ฝ”๋“œํ‹€ ํ†ตํ•ด ์ž์‹ ๊ฐ ์žˆ๊ฒŒ ์ƒˆ๋กœ์šด ๋ฆฌํฌํŠธ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์ง€์›ํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

  • ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ํ†ตํ™”๋กœ ์ด๋ฃจ์–ด์ง„ ๋ˆ์„ ํ™˜์œจ๋กœ ๋น„๊ตํ•ด ๋”ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค

  • ์ฃผ์–ด์ง„ Shares ์™€ Price ๋ฅผ ๊ณฑํ•ด์„œ Total์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•œ๋‹ค

์ด ๋‘๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐ”๊พธ์–ด to-do list๋กœ ๋ณ€ํ™˜ํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

@ To-do list
$5 + 10 KRW = $10 (ํ™˜์œจ์ด 2:1์ผ ๋–„)
$5 * 2 = $10

๋‘ ๋ฒˆ์งธ ๊ณฑ์…ˆ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์™„๋ฒฝํ•œ interface๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

  public void testMultiplication() {
    Dollar five = new Dollar(5);
    five.times(2);
    assertEquals(10, five.amount);
  }

์ฝ”๋“œ ์ž‘์„ฑ ํ›„์˜ to-do list

@ To-do list
$5 + 10 KRW = $10 (ํ™˜์œจ์ด 2:1์ผ ๋–„)
$5 * 2 = $10
Make "amount" private
Dollar side-effects?
Money rounding?

์ด ์ฝ”๋“œ๋Š” ํ˜„์žฌ ์ปดํŒŒ์ผ๋„ ์•ˆ ๋˜์ง€๋งŒ ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ์ฝ”๋“œ๊ฐ€ ์ปดํŒŒ์ผ ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ๊ฒƒ๋“ค์„ ๊ณ ์ณ์•ผ ํ• ๊นŒ?
์ด 4๊ฐ€์ง€ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • No class Dollar
  • No constructor
  • No Method times(int)
  • No field amount

์ด ์—๋Ÿฌ๋“ค์„ ๊ณ ์น˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค

  • No class Dollar
  class Dollar
  • No constructor
  Dollar(int amount) {}
  • No Method times(int)
  void times(int multiplier) {}
  • No field amount
  int amount;

์œ„์™€ ๊ฐ™์ด ๊ณ ์นœ ํ›„ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ปดํŒŒ์ผ์€ ๋˜์ง€๋งŒ ํ…Œ์ŠคํŠธ๋Š” ์‹คํŒจํ•œ๋‹ค. 10์„ ์˜ˆ์ƒํ–ˆ์ง€๋งŒ ์‹ค์ œ ๊ฐ’์€ 0์ด ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ…Œ์ŠคํŠธ ์‹คํŒจ๋Š” ๊ณผ์ •์ด๋‹ค. ์–ด๋–ค ๊ฒƒ์ด ๋ฌธ์ œ์ธ์ง€ ์•„๋Š” ๊ฒƒ์€, ๋ฌธ์ œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๋Š” ์ฑ„ ์‹คํŒจํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ซ๋‹ค.

์ด์ œ ์šฐ๋ฆฌ์˜ ๋ฌธ์ œ๋Š” ๋‹ค์–‘ํ•œ ํ†ตํ™” ์ง€์› ์—์„œ ํ˜„์žฌ ํ…Œ์ŠคํŠธ pass, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹ค์Œ ํ…Œ์ŠคํŠธ pass๋กœ ๋ณ€ํ–ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ํ…Œ์ŠคํŠธ ์‹คํŒจ๋ฅผ ๋‹ค์Œ ์ฝ”๋“œ๋กœ ๊ณ ์น  ์ˆ˜ ์žˆ๋‹ค.

  int amount = 10;

๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€๊ธฐ ์ „์— ์šฐ๋ฆฌ๋Š” ์ด ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•ด์•ผ ํ•œ๋‹ค. ์•„๋ž˜ cycle ์„ ์žŠ์ง€ ๋ง์ž.

  1. ์ž‘์€ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
  2. ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰ > ์‹คํŒจ
  3. ์ž‘์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ
  4. ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์‹คํ–‰ > ์„ฑ๊ณต
  5. Duplication ์ œ๊ฑฐ๋ฅผ ์œ„ํ•ด ๋ฆฌํŒฉํ† ๋ง 

amount์— 10์ด๋ผ๋Š” ๊ฐ’์„ ์ฃผ๋ฉด์„œ ์šฐ๋ฆฌ๋Š” 1๋ฒˆ๋ถ€ํ„ฐ 4๋ฒˆ๊นŒ์ง€ ์™„์„ฑํ–ˆ๋‹ค. 5๋ฒˆ์„ ์ง„ํ–‰ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์–ด๋””์—์„œ duplication์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊นŒ?

๋ณดํ†ต duplication์€ ์ฝ”๋“œ๋“ค ์‚ฌ์ด์—์„œ ๋ณด์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ํ…Œ์ŠคํŠธ์˜ ๋ฐ์ดํ„ฐ์™€ ์ฝ”๋“œ์˜ ๋ฐ์ดํ„ฐ ์‚ฌ์ด์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ์ฐพ๊ธฐ ์–ด๋ ต๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊พธ๋ฉด ์–ด๋–จ๊นŒ?

  int amount = 5 * 2;

10์€ ์šฐ๋ฆฌ๋„ ๋ชจ๋ฅด๋Š” ์‚ฌ์ด์— ์šฐ๋ฆฌ์˜ ๋จธ๋ฆฟ ์†์—์„œ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด๋‹ค. ์ด์ œ 5์™€ 2๋Š” ๋‘ ๊ตฐ๋ฐ(ํ…Œ์ŠคํŠธ, ์ฝ”๋“œ)์— ์กด์žฌํ•œ๋‹ค. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ด duplication ์„ ์—†์•จ ์ˆ˜ ์žˆ์„๊นŒ?

@ To-do list
$5 + 10 KRW = $10 (ํ™˜์œจ์ด 2:1์ผ ๋–„)
$5 * 2 = $10
Make "amount" private
Dollar side-effects?
Money rounding?

๋งŒ์•ฝ ๊ฐ’์„ times() ๋ฉ”์†Œ๋“œ ์•ˆ์œผ๋กœ ์›€์ง์ด๋ฉด?

  int amount;

  void times(int multiplier) {
    amount = 5 * 2;
  }

ํ…Œ์ŠคํŠธ๋Š” ์—ฌ์ „ํžˆ ํ†ต๊ณผํ•œ๋‹ค. ๋„ˆ๋ฌด ์ž‘์€ ์ฝ”๋“œ ๋ณ€ํ™”๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฐ€?

TDD๋Š” ์ž‘๋”” ์ž‘์€ ๊ณผ์ •์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ ์ž‘๋”” ์ž‘์€ ๊ณผ์ •์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์ž.

๋งค ๋ฒˆ ์ด๋Ÿฐ ๊ณผ์ •์„ ๊ฑฐ์น  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๋งค ๋ฒˆ ํฐ ๊ณผ์ •๋“ค๋งŒ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ๊ทธ ์†์˜ ์ž‘์€ ๊ณผ์ •๋“ค์ด ์ ํ•ฉํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์œผ๋กœ 5๋Š” ์–ด๋””์„œ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ธ๊ฐ€? Constructor๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์ด๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

  Dollar(int amount) {
    this.amount = amount;
  }

์ด์–ด์„œ ์ด์ œ๋Š” times()์—์„œ ์ด ๊ฐ’์„ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

  void times(int multiplier) {
    amount = amount * 2;
  }

๋‹ค์Œ์œผ๋กœ multiplier๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์ด 2์ด๋ฏ€๋กœ ์ด ์—ญ์‹œ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค

  void times(int multiplier) {
    amount = amount * multiplier;
  }

๋งˆ์ง€๋ง‰์œผ๋กœ Java syntax๋ฅผ ์•ˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค

  void times(int multiplier) {
    amount *= multiplier;
  }

์ด๋ ‡๊ฒŒ to-do list ์ค‘ ํ•˜๋‚˜๋ฅผ ์ง€์šธ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

@ To-do list
$5 + 10 KRW = $10 (ํ™˜์œจ์ด 2:1์ผ ๋–„)
$5 * 2 = $10**
Make "amount" private
Dollar side-effects?
Money rounding?

ETC.
Dependency and Duplication; ์˜์กด์„ฑ๊ณผ ์ค‘๋ณต๋œ ์ฝ”๋“œ
์ฆ์ƒ์„ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋” ์ข‹์ง€ ์•Š์€ ๋ฌธ์ œ๋“ค์ด ์ผ์–ด๋‚˜๋Š” ์‹ค์ƒํ™œ์˜ ๋ฌธ์ œ๋“ค๊ณผ๋Š” ๋‹ฌ๋ฆฌ, ํ”„๋กœ๊ทธ๋žจ์—์„œ์˜ ์ฆ์ƒ ์ œ๊ฑฐ๋Š” ์˜์กด์„ฑ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ ๊ณผ ๊ฐ™๋‹ค.
TDD์˜ ๋‘๋ฒˆ์งธ ๋ฃฐ์ด 'Duplication์„ ์ œ๊ฑฐํ•˜๋ผ'์ธ ์ด์œ ๋Š” ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ, ๋‹ค์Œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ์‹œ ์•„์ฃผ ์ž‘์€ ์ฝ”๋“œ ๋ณ€ํ™”๋งŒ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์„ฑ๊ณต์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.