[E-Z] TDD Patterns

kenback TDD 3๋ถ€

25์žฅ. ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ ํŒจํ„ด

ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€?

๋จผ์ €, ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ช…์‚ฌ์  ์˜๋ฏธ์™€ ๋™์‚ฌ์  ์˜๋ฏธ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค.
ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค ๋Š” ๊ฒƒ์€ ์ž๋™ํ™” ํ…Œ์ŠคํŠธ์˜ ๋ช…์‚ฌ์  ์˜๋ฏธ๋ฅผ ์•”์‹œํ•˜๊ณ , ๋ณ€ํ™”๋ฅผ ํ…Œ์ŠคํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ˆ˜๋™์ ์ธ ํ…Œ์ŠคํŠธ์˜ ๋™์‚ฌ์  ์˜๋ฏธ๋ฅผ ์•”์‹œํ•œ๋‹ค.


ํ…Œ์ŠคํŠธ๋ฅผ ์–ธ์ œ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

ํ…Œ์ŠคํŠธ ๋Œ€์ƒ์ด ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ง์ „์— ์ž‘์„ฑํ•œ๋‹ค.

์–‘์„ฑ ํ”ผ๋“œ๋ฐฑ ๊ณ ๋ฆฌ(positive feedback loop)
์‹œ์Šคํ…œ์—์„œ ์–ด๋–ค ํ™œ๋™์„ ๋” ๋งŽ์ด ํ•˜๋„๋ก ๊ฒฉ๋ คํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ. ์ง์ˆ˜ ๊ฐœ์˜ ์Œ์  ์—ฐ๊ฒฐ์ด ์žˆ๋‹ค๋ฉด ์–‘์„ฑ ํ”ผ๋“œ๋ฐฑ์ด๋‹ค.

์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋งŽ์ด ๋ฐ›์œผ๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์ ์  ๋” ๋œธํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ณ , ์—๋Ÿฌ๋Š” ์ ์  ๋งŽ์•„์ง„๋‹ค. ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ŠคํŠธ๋ ˆ์Šค๋„ ๋‹ค์‹œ ๋งŽ์•„์ง„๋‹ค.
์ด ๊ณ ๋ฆฌ๋ฅผ ๋น ์ ธ๋‚˜์˜ค๋ ค๋ฉด ๋‹ค์Œ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ƒˆ๋กœ์šด ์š”์†Œ ๋„์ž…ํ•˜๊ธฐ
  • ๊ธฐ์กด ์š”์†Œ๋ฅผ ๋ฐ”๊พธ๊ธฐ
  • ํ™”์‚ดํ‘œ๋ฅผ ๋ฐ”๊พธ๊ธฐ

๊ธฐ์กด ์š”์†Œ ๋ฐ”๊พธ๊ธฐ: ์ž๋™ํ™” ํ…Œ์ŠคํŠธ

์ด ๊ฒฝ์šฐ์—” ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋กœ ๋ฐ”๊พธ๋ฉด ๋œ๋‹ค.
์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋ฐ›๊ธฐ ์‹œ์ž‘ํ•  ๋•Œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ด๊ณ , ๋‘๋ ค์›€์„ ์ง€๋ฃจํ•จ์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

โ€œ์Œ, ์•„๋ฌด ๋ฌธ์ œ ์—†๊ตฐ. ํ…Œ์ŠคํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ์ดˆ๋ก ๋ง‰๋Œ€์•ผ.โ€

์ŠคํŠธ๋ ˆ์Šค๋ฅผ ๋” ๋งŽ์ด ๋ฐ›์„์ˆ˜๋ก ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๊ณ , ์ž‘์—… ์ค‘์— ์—๋Ÿฌ๋ฅผ ๋‚ผ ์ผ์€ ์ค„์–ด๋“ค๋ฉด์„œ ์ŠคํŠธ๋ ˆ์Šค๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ค„์–ด๋“ ๋‹ค. ์ฆ‰, ๊ฐœ๋ฐœ์ž์˜ ๋ฉ˜ํƒˆ์„ ์œ„ํ•ด์„œ๋ผ๋„ ํ…Œ์ŠคํŠธ ์ž๋™ํ™”๋Š” ์ค‘์š”ํ•˜๋‹ค.

ํ™”์‚ดํ‘œ ๋ฐ”๊พธ๊ธฐ: ํ…Œ์ŠคํŠธ ์šฐ์„ 

ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ทœ์น™์„ ๋„์ž…ํ•œ๋‹ค.
ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ํ•˜๋ฉด ์ŠคํŠธ๋ ˆ์Šค๋Š” ์ค„๊ณ , ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.


ํ…Œ์ŠคํŠธํ•  ๋กœ์ง์„ ์–ด๋–ป๊ฒŒ ๊ณ ๋ฅผ ๊ฒƒ์ธ๊ฐ€?

๊ฐ๊ฐ์˜ ํ…Œ์ŠคํŠธ๋Š” ์„œ๋กœ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ด์–ด์•ผ ํ•œ๋‹ค.

์•ž ๋ถ€๋ถ„์—์„œ ์‹คํ–‰ํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๊ณ , ๊ทธ ์˜ํ–ฅ์œผ๋กœ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ์‹œ์Šคํ…œ์ด ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒฝ์šฐ๋Š” ๊ฝค ๋งŽ๋‹ค.
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ํ…Œ์ŠคํŠธ ์‚ฌ์ด์—์„œ ๋งค๋ฒˆ ์‹œ์Šคํ…œ์„ ์žฌ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์จ๋ดค์ง€๋งŒ, ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋Š” ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ข€ ๋” ์ž‘์€ ์Šค์ผ€์ผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ฃผ์–ด์ง„ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ํ™˜๊ฒฝ์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์„ธํŒ…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. ๊ฒฐ๊ตญ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ์ž‘์—…์ด ์‹œ์Šคํ…œ์„ ์‘์ง‘๋„๋Š” ๋†’๊ณ  ๊ฒฐํ•ฉ๋„๋Š” ๋‚ฎ์€ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ๋ชฉ๋ก ์ž‘์„ฑํ•˜๊ธฐ: ์ž‘์—… ๋ฒ”์œ„ ์กฐ์ •

๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

๊ตฌํ˜„ํ•ด์•ผ ํ•  ๊ฒƒ๋“ค์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋“ค์„ ์ƒ๊ฐํ•ด๋ณธ๋‹ค.

  • ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์˜ˆ๋“ค์„ ์ ๋Š”๋‹ค.
  • ํ•ด๋‹น ์š”๊ตฌ์‚ฌํ•ญ์— ๊ด€ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ผ์„ ์ ๋Š”๋‹ค.
  • ํด๋ฆฐ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ํ•ด์•ผ ํ•˜๋Š” ๋ฆฌํŽ™ํ† ๋ง ๋ชฉ๋ก์„ ์ ๋Š”๋‹ค.

๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋งŒ๋“ค์–ด๋‘” ํ…Œ์ŠคํŠธ๋Š” ๋ฆฌํŒฉํ† ๋ง์— ๋Œ€ํ•œ ๊ด€์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋งˆ๋ จ์ด๊ณ , ์ดˆ๋ก ๋ง‰๋Œ€๋ฅผ ๋น ๋ฅธ ์‹œ์ผ ๋‚ด์— ๋ณด๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— NO!
ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๊ฒŒ ํ•˜๋Š” ๊ณผ์ •์—์„œ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ด์ง„๋‹ค. ์ด๋ฅผ ํ•  ์ผ ๋ชฉ๋ก์— ์ ์–ด๋‘๋ฉด ๋œ๋‹ค.

์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ํ…Œ์ŠคํŠธ ํ•˜๋‚˜๋ฅผ ์„ฑ๊ณต์‹œํ‚ค๋Š” ๊ฒƒ์ด ์ฝ”๋“œ๋ฅผ releaseํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ค‘์š”ํ•˜๋‹ค.

๋‹จ์–ธ ์šฐ์„ 

ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋‹จ์–ธ๋ถ€ํ„ฐ ์ž‘์„ฑํ•œ๋‹ค.

  • ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์™„๋ฃŒ๋œ ์‹œ์Šคํ…œ์ด ์–ด๋–จ๊ฑฐ๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ์ด์•ผ๊ธฐ(user story)๋ถ€ํ„ฐ ์ž‘์„ฑํ•œ๋‹ค.
  • ํŠน์ • ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ธฐ๋Šฅ์ด ์™„๋ฃŒ๋˜๋ฉด ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ๋ถ€ํ„ฐ ์ž‘์„ฑํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์™„๋ฃŒ๋˜๋ฉด ํ†ต๊ณผํ•ด์•ผ ํ•  ๋‹จ์–ธ๋ถ€ํ„ฐ ์ž‘์„ฑํ•œ๋‹ค.

๋‹จ์–ธ์„ ๋จผ์ € ์ž‘์„ฑํ•˜๋ฉด ์ž‘์—…์„ ๋‹จ์ˆœํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์†Œ์ผ“์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์‹œ์Šคํ…œ๊ณผ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์„ ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•œ๋‹ค. ํ†ต์‹ ์„ ๋งˆ์นœ ํ›„ ์†Œ์ผ“์€ ๋‹ซํ˜€ ์žˆ๊ณ  ์†Œ์ผ“์—์„œ โ€œabcโ€๋ฅผ ์ฝ์–ด์•ผ ํ•œ๋‹ค.

TEST(socketTest, transactionTest){
    ASSERT_TRUE(reader.isClosed()); //reader์—์„œ socket์ด๋‹ค.
    ASSERT_EQ("abc", reply.contents()); //reply์—์„œ buffer์˜ ์กด์žฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. 
}
TEST(socketTest, transactionTest){
    Socket reader = Socket("localhost", defaultPort()); //์„œ๋ฒ„ ์ ‘์† ์ „์— ์„œ๋ฒ„๋ฅผ ์—ด์–ด์•ผ ํ•œ๋‹ค.
    Buffer reply = reader.contents();
    ASSERT_TRUE(reader.isClosed());
    ASSERT_EQ("abc", reply.contents());
}
TEST(socketTest, transactionTest){
    Server writer = Server(defaultPort(), "abc");
    Socket reader = Socket("localhost", defaultPort()); //์„œ๋ฒ„ ์ ‘์† ์ „์— ์„œ๋ฒ„๋ฅผ ์—ด์–ด์•ผ ํ•œ๋‹ค.
    Buffer reply = reader.contents();
    ASSERT_TRUE(reader.isClosed());
    ASSERT_EQ("abc", reply.contents());
}

์ž‘์€ ๋‹จ๊ณ„๋กœ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์œผ๋ฉฐ ํ…Œ์ŠคํŠธ์˜ ์•„์›ƒ๋ผ์ธ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.


ํ…Œ์ŠคํŠธํ•  ๋•Œ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

ํ…Œ์ŠคํŠธ๋ฅผ ์ฝ์„ ๋•Œ ๊ฐ€๋…์„ฑ ๋†’์€ ๋ฐ์ดํ„ฐ(๋ช…๋ฐฑํ•œ ๋ฐ์ดํ„ฐ)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์‚ฐ๋ฐœํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.: ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“ค์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๊ฐ„์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ด๋–ค ์˜๋ฏธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • 1๊ณผ 2 ์‚ฌ์ด์— ์–ด๋–ค ๊ฐœ๋…์  ์ฐจ์ด๊ฐ€ ์—†๋‹ค๋ฉด 1์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
  • ์—ฌ๋Ÿฌ ์˜๋ฏธ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์ƒ์ˆ˜๋ฅผ ์“ฐ์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋Œ€์•ˆ์€ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

(๋ช…๋ฐฑํ•œ) ๋ฐ์ดํ„ฐ์˜ ์˜๋„๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•  ๊ฒƒ์ธ๊ฐ€?

ํ…Œ์ŠคํŠธ ์ž์ฒด์— ์˜ˆ์ƒ๋˜๋Š” ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์„ ํฌํ•จํ•˜๊ณ  ์ด ๋‘˜์˜ ๊ด€๊ณ„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.
ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ๋จผ ํ›—๋‚  ์ฝ”๋“œ๋ฅผ ์ฝ์„ ๊ฐœ๋ฐœ์ž๋“ค๋„ ์ƒ๊ฐํ•ด์•ผ ํ•œ๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” ์€ํ–‰์˜ ํ™˜์ „ ๊ฑฐ๋ž˜ ์ฝ”๋“œ์ด๋‹ค.
ํ™˜์ „ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์ˆ˜์ˆ˜๋ฃŒ๋Š” 1.5%์ด๊ณ  USD์™€ GBP ํ™˜์œจ์€ 2:1์ด๋‹ค.

Bank bank = new Bank();
bank.addRate("USD", "GBP", STANDARD_RATE);
bank.commission(STANDARD_COMMISSION);
Money result = bank.convert(new Note(100, "USD"), "GBP");
ASSERT_EQ(new Note(49.25, "GBP"), result);

$100์„ ํ™˜์ „ํ•˜๋ฉด 50GBP - 1.5% = 49.25GBP์ด๋‹ค.


์ˆ˜์ˆ˜๋ฃŒ๋‚˜ ํ™˜์œจ๊ฐ™์€ ๊ฒฝ์šฐ, ๋” ๋ช…๋ฐฑํ•œ ๋ฐ์ดํ„ฐ๋กœ ๋งค์ง๋„˜๋ฒ„๋ฅผ ์“ธ ์ˆ˜๋„ ์žˆ๋‹ค.

๋งค์ง๋„˜๋ฒ„
์ƒ์ˆ˜๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ ์ ˆํ•œ ๊ธฐํ˜ธ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
Bank bank = new Bank();
bank.addRate("USD", "GBP", 2); //STANDARD_RATE
bank.commission(0.015); //STANDARD_COMMISSION
Money result = bank.convert(new Note(100, "USD"), "GBP");
assertEquals(new Note(100 / 2 * (1 - 0.015), "GBP"), result);

์ด ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ž…๋ ฅ๊ฐ’๊ณผ ์˜ˆ์ƒ๊ฐ’ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ๋‚˜๋ˆ—์…ˆ๊ณผ ๊ณฑ์…ˆ์„ ์ˆ˜ํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋œ๋‹ค.
๋‹จ์ผ ๋ฉ”์„œ๋“œ ๋ฒ”์œ„๋ผ๋ฉด, ์ด ๋ช…๋ฐฑํ•œ ๋ฐ์ดํ„ฐ๋Š” ์ฝ”๋“œ์— ๋งค์ง๋„˜๋ฒ„๋ฅผ ์“ฐ์ง€ ๋ง๋ผ๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ ์ธ ๊ทœ์น™์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์ด๋ฏธ ์ •์˜๋œ ๊ธฐํ˜ธ ์ƒ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ตณ์ด ์ œ๊ฑฐํ•˜์ง€ ๋ง๊ณ  ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.


26์žฅ. ๋นจ๊ฐ„ ๋ง‰๋Œ€ ํŒจํ„ด

ํ…Œ์ŠคํŠธ๋ฅผ ์–ธ์ œ ์–ด๋””์— ์ž‘์„ฑํ•  ๊ฒƒ์ธ์ง€, ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ์–ธ์ œ ๋ฉˆ์ถœ์ง€์— ๋Œ€ํ•œ ํŒจํ„ด์ด๋‹ค.

์‹œ์ž‘ ํ…Œ์ŠคํŠธ

์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ถ€ํ„ฐ ํ…Œ์ŠคํŠธํ•˜์ž.

ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ˜„์‹ค์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ํ•œ๊บผ๋ฒˆ์— ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

  1. ์ด ๊ธฐ๋Šฅ์„ ์–ด๋””์— ๋‘๋‚˜?
  2. input์€?
  3. output์€?

ํ˜„์‹ค์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ”๋กœ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ๋นจ๊ฐ•-์ดˆ๋ก-๋ฆฌํŒฉํ† ๋ง ์ฃผ๊ธฐ๋Š” ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

๋‹ค๊ฐํ˜• ์ถ•์†Œ๊ธฐ๋ฅผ TDD๋กœ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.
์ด ์ถ•์†Œ๊ธฐ๋Š” ๋‹ค๊ฐํ˜•์„ ์ž…๋ ฅํ•˜๋ฉด, ๋ชจ๋“  ๊ผญ์ง€์ ์„ ์ผ์ • ๋น„์œจ๋กœ ์ถ•์†Œ์‹œํ‚จ ๋‹ค๊ฐํ˜• ์ค‘ ๊ฐ€์žฅ ์ ๊ฒŒ ๊ผญ์ง€์ ์„ ๊ฐ€์ง€๋Š” ๋‹ค๊ฐํ˜•์„ ์ƒ์„ฑํ•ด๋‚ธ๋‹ค.

  1. ์–ด๋–ค ๋‹ค๊ฐํ˜•์€ ๋” ์ถ•์†Œํ•  ์ˆ˜ ์—†๋‹ค.
  2. ์ž…๋ ฅ์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ ์–ด์•ผ ํ•œ๋‹ค.
Reducer r = new Reducer(new Polygon());
ASSERT_EQ(0, r.result().npoints());

ํ•œ ๋‹จ๊ณ„ ํ…Œ์ŠคํŠธ

๋ชฉ๋ก์—์„œ ๋‹ค์Œ ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ ์–ด๋–ค ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•  ์ง€ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€?

๋ป”ํ•˜์ง€ ์•Š๊ณ , ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํ™•์‹ ์ด ๋“œ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋ฝ‘์„ ๊ฒƒ

์ƒํ–ฅ์‹, ํ•˜ํ–ฅ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” TDD๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋‹ค.

์ƒํ–ฅ์‹(bottom-up)
๋ชจ๋“ˆ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋ฉด์„œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ
ํ•˜ํ–ฅ์‹(top-down)
ํฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด ๊ตฌํ˜„ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ. ์ „์ฒด ์„ค๊ณ„ => ํ•˜์œ„ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์‹œ๊ฐ์ผ ๋ฟ์ด๋‹ค.

๋ฐฉํ–ฅ์„ฑ์„ ๊ฐ€์ง„๋‹ค๋ฉด,

์•„๋Š” ๊ฒƒ์—์„œ ๋ชจ๋ฅด๋Š” ๊ฒƒ์œผ๋กœ(known-to-unknown) ๋ฐฉ์‹์ด ์œ ์šฉํ•˜๋‹ค.

๋งํ•˜์ž๋ฉด, ์ง€์‹์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์ •๋ณด๋‚˜ ํ†ต์ฐฐ๋ ฅ์„ ์–ป๊ณ , ๊ทธ๋กœ ์ธํ•ด ๊ณ„์†ํ•ด์„œ ๋ฐœ์ „ํ•˜๊ณ  ์„ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

์„ค๋ช… ํ…Œ์ŠคํŠธ

ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์„ค๋ช…์„ ์š”์ฒญํ•˜๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์„ค๋ช…ํ•˜์ž.

TDD๋ฅผ ๋„๋ฆฌ ์“ฐ์ด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ๋‹ค.
์‚ฌ๋žŒ๋“ค์—๊ฒŒ โ€œTDD๋กœ ๋ฐ”๊ฟ”์„œ ํ•ด๋ด!โ€๋ผ๊ณ  ๋ฐ€์–ด๋ถ™์ด๋Š” ๊ฒƒ๋งŒํผ TDD๊ฐ€ ํผ์ง€๋Š” ๊ฒƒ์„ ํ™•์‹คํ•˜๊ฒŒ ๋ง‰๋Š” ๊ฒƒ์€ ์—†๋‹ค.
TDD์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์ ์„ ๋“œ๋Ÿฌ๋‚ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฌธํ™”๋กœ ์ •์ฐฉ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

โ€œFoo๋ฅผ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๊ณ , Boo๋ฅผ ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด 1์ด ๋‚˜์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. Foo๊ฐ€ ์ €๋ ‡๊ณ , Boo๊ฐ€ ์ €๋Ÿฌ๋ฉด 2์ž…๋‹ˆ๋‹ค.โ€

์ข€ ๋” ์ถ”์ƒ์ ์œผ๋กœ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
๋ˆ„๊ตฐ๊ฐ€ sequence diagram์„ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, ์ด ๋‹ค์ด์–ด๊ทธ๋žจ์— ๋‚˜ํƒ€๋‚œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

ํ•™์Šต ํ…Œ์ŠคํŠธ

์™ธ๋ถ€์—์„œ ๋งŒ๋“  ์†Œํ”„ํŠธ์›จ์–ด์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ API๊ฐ€ ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•ด์ค„ ๋งŒํ•œ ์ž‘์€ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

๋งŒ์•ฝ API๋ฅผ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ํ…Œ์ŠคํŠธ๋„ ๋ฐ”๋กœ ํ†ต๊ณผํ•  ๊ฒƒ์ด๋‹ค.
๋˜ํ•œ ํŒจํ‚ค์ง€์˜ ์ƒˆ ๋ฒ„์ „์ด ๋‚˜์˜ค๋ฉด, ์šฐ์„  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ด๋ณด๊ณ , Failํ•˜๋ฉด ์•ฑ์„ ์‹คํ–‰์‹œ์ผœ๋ณผ ํ•„์š”๋„ ์—†๋‹ค.

Record store(์™ธ๋ถ€ ํŒจํ‚ค์ง€)์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ๋ฐ›์•„์˜จ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

TEST(PackageTest, RecordStoreTest){
    RecordStore store;
    store = RecordStore.openRecordStore("testing", true);
    int id = store.addRecord(new unsigned char[2] {5, 6}, 0, 2);
    unsigned char* buffer = new unsigned char[2];
    ASSERT_EQ(2, store.getRecord(id, buffer, 0));
    ASSERT_EQ(5, buffer[0]);
    ASSERT_EQ(6, buffer[1]);
}

๋˜ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ

ํ˜„์žฌ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š” ํ…Œ์ŠคํŠธ์™€ ๋ฌด๊ด€ํ•œ ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ค๋ฅธ๋‹ค๋ฉด, ํ•  ์ผ ๋ชฉ๋ก์— ์ ์–ด๋‘๊ณ  ๋‹ค์‹œ ์ฃผ์ œ๋กœ ๋Œ์•„์˜ค์ž.

ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(regression test)

ํšŒ๊ท€ ํ…Œ์ŠคํŠธ
์†Œํ”„ํŠธ์›จ์–ด์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๋‚˜ ์ˆ˜์ • ์‚ฌํ•ญ์„ ํ…Œ์ŠคํŠธํ•จ
  1. ๊ธฐ์กด์— ์ž‘์„ฑ๋œ ํ…Œ์ŠคํŠธ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  2. ๋ณ€๊ฒฝ๋œ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „์„ ์ ์šฉํ•œ๋‹ค.
  3. ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์ƒ ๊ฒฐ๊ณผ์™€ ๋น„๊ตํ•œ๋‹ค.
  4. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์€ ๊ธฐ๋Šฅ๋“ค์„ ์‹๋ณ„ํ•˜๊ณ , ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜๊ณ  ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  5. ๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์˜ˆ์ƒํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•  ๋•Œ๊นŒ์ง€ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฐ˜๋ณตํ•œ๋‹ค.

ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์˜ ๊ฐ€์น˜๋Š”,

  1. ์•ฑ ์ฐจ์›์—์„œ๋Š” ์‹œ์Šคํ…œ ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋–ค ๊ฒƒ์„ ๊ธฐ๋Œ€ํ–ˆ๊ณ , ์–ด๋–ค ๊ฒƒ์ด ํ˜„์žฌ ์ž˜๋ชป๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  2. ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋งค์šฐ ํฐ ์Œ์ˆ˜์— ๋Œ€ํ•œ ๊ฒฐํ•จ ๋ณด๊ณ ์„œ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ •์ˆ˜ ๋กค์˜ค๋ฒ„๋ฅผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค.

์‹œ์Šคํ…œ ์žฅ์• ๋ฅผ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋ฆฌํŒฉํ† ๋งํ•ด์•ผ ํ•œ๋‹ค.

ํœด์‹

์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด, ์ผ๋‹จ ์ข€ ์‰ฌ์–ด๋„ ๋œ๋‹ค.

๋ฌผ๋ก  ๊ณ„์† ์‰ฌ๊ธฐ๋งŒ ํ•˜๋ฉด ์•ˆ๋˜๊ณ , ๋ฌด์—‡์„ ํ•ด์•ผ ํ•  ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋œป์ด๋‹ค.

๋‹ค์‹œ ํ•˜๊ธฐ

์ง„์งœ ๋ชจ๋ฅด๊ฒ ์œผ๋ฉด, ์ฝ”๋“œ๋ฅผ ๋‹ค ์ง€์šฐ๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ํ•˜์ž.

์‹ธ๊ตฌ๋ ค ์ฑ…์ƒ, ์ข‹์€ ์˜์ž

์˜์ž๋Š” ์ตœ๊ณ ๊ธ‰์œผ๋กœ ์จ๋ผ.

์ต์ŠคํŠธ๋ฆผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ถŒ์žฅํ•˜๋Š” ์‚ฌ๋ฌด์‹ค ๋ฐฐ์น˜๋Š” ํŒŒํ‹ฐ์…˜์ด ์—†๋Š” ๋„“์€ ๊ณต๊ฐ„ ๊ฐ€์šด๋ฐ์— ํฐ ํ…Œ์ด๋ธ”์„ ๋†“๊ณ , ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‘˜๋Ÿฌ ์•‰๋Š”๋‹ค.
๊ฐœ์ธ์ด ์‚ฌ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ปดํ“จํ„ฐ๋Š” ๊ตฌ์„์— ๋”ฐ๋กœ ๋ฐฐ์น˜ํ•œ๋‹ค.
์ด๋Ÿฌํ•œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€ ํŒ€ ๋‚ด ์˜์‚ฌ ์†Œํ†ต์„ ์›ํ™œํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉฐ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค€๋‹ค.