C์–ธ์–ด์—์„œ Mock Object ํšจ๊ณผ ๋‚ด๊ธฐ

318 views
Skip to first unread message

June Kim

unread,
Dec 14, 2008, 12:08:50โ€ฏAM12/14/08
to xp...@googlegroups.com
๋ช‡ ๋…„ ์ „๋ถ€ํ„ฐ c์–ธ์–ด์—์„œ mock object ํšจ๊ณผ ๋‚ด๊ธฐ๋กœ ๊ณ ๋ฏผ์„ ์ข€ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์•„๋ž˜์—์„œ "run-time +
compile-time" ๊ฐ™์€ ๊ฒƒ์ด ์ œ๊ฐ€ ๋งŒ๋“  ํ•ด๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๊ณ ์š”(๋งŒ๋“ ์ง€๋Š” 4๋…„ ์ •๋„ ๋œ ๋“ฏ).

xper ์œ„ํ‚ค ๊ฐ™์€ ๊ณณ์— ์ •๋ฆฌํ•ด์„œ ์˜ฌ๋ฆด ์˜ˆ์ •์ธ๋ฐ, ์ผ๋‹จ ์˜๊ฒฌ ๋ชจ์œผ๋Š” ์ฐจ์›์—์„œ ๊ฐ„๋žตํžˆ ์—ฌ๊ธฐ ์ •๋ฆฌํ•ด ์”๋‹ˆ๋‹ค.

== run-time polymorphism ==
* ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์‚ฌ์šฉ
- cgreen ์Šคํƒ€์ผ http://www.lastcraft.com/mock_callbacks.php
- naive object struct ์‚ฌ์šฉ(ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž self๋ฅผ struct๋กœ ํ•ด์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ‰๋‚ด๋ƒ„) : Io
์–ธ์–ด ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๊ตฌํ˜„์ด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž˜ ๋˜์–ด ์žˆ์Œ

== compile-time polymorphism ==
* DEFINE/IFDEF ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์ปดํŒŒ์ผ ์˜ต์…˜์— ๋”ฐ๋ผ production code์™€ mock code์˜ ๋‹ค๋ฅธ ๋ฒ„์ „์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ํ•จ

== link-time polymorphism ==
* ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์„ production์šฉ, mock์šฉ์œผ๋กœ ์ง์œผ๋กœ ๋งŒ๋“ฆ. make all, make test ๋“ฑ์œผ๋กœ ํ•ด์„œ
๋นŒ๋“œํ•  ๋•Œ ์„œ๋กœ ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ ํŒŒ์ผ์ด ๋งํฌ๋˜๋„๋ก.
* ์ฃผ์˜์ : link-time ๊ฒฝ์šฐ, ์–ด๋–ค ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ mock์œผ๋กœ, ์–ด๋–ค ํ…Œ์ŠคํŠธ์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋ฅผ real๋กœ
์„ ํƒ์ ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด, unit-level test์™€ integration/system-level
test๊ฐ€ ์„ž์—ฌ ์žˆ๋Š” ๊ฒฝ์šฐ). ์ด ๋•Œ ๋ฐฉ๋ฒ•์€ ๊ทธ๊ฒƒ๋“ค์„ ๋ถ„๋ฆฌํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์‹คํ–‰ํŒŒ์ผ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐ ์‹คํ–‰ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๊ณ  ๊ทธ
๊ฒฐ๊ณผ๋“ค์„ aggregate/parsingํ•ด์„œ reportํ•ด์•ผ ํ•œ๋‹ค.

== hybrid ==
=== run-time + compile-time ===
* function copying/modifying : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ค‘์—์„œ ์ปค๋ฉ˜ํŠธ ์†์— ์ผ์ •ํ•œ DSL(python์˜
EDSL)๋กœ mockํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜๋ฅผ ๊ธฐ์ˆ ํ•˜๋ฉด ์ž๋™์œผ๋กœ production ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ณต์‚ฌํ•ด ์˜ค๋˜, ๊ทธ ์ค‘ ๋‚ด๊ฐ€
์›ํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์— ๋Œ€ํ•ด์„œ๋Š” ์ธ์ž๊ฐ’์—์„œ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›๋„๋ก ํ•จ.
์˜ˆ๋ฅผ ๋“ค์–ด, write_multiple_char('=',80)ํ•˜๋ฉด ํ™”๋ฉด์— =๊ฐ€ 80๊ฐ€ ์ฐํ˜€์•ผ ํ•œ๋‹ค๋ฉด, wmc๋Š”
write_char('=')๋ฅผ 80๋ฒˆ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. wmc๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•œ๋‹ค.

// f=TargetFunction("blah.c","write_multiple_char") <-- blah.c๋Š” wmc๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” ํŒŒ์ผ
// f.addMockCall("write_char")
// f.copy() <-- code generation์„ ๊ฑฐ์น˜๋ฉด ์ด ์ž๋ฆฌ์—
_MOCK_write_multiple_char๋ผ๋Š” ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ๋“ค์–ด์˜จ๋‹ค

void mock_write_char(char c)
{
mock_write_char_called++;
}

void test_wmc_calls_wc()
{
_MOCK_write_multiple_char('=',80, mock_write_char);
assert_equal(80,mock_write_char_called);
}

=== compile-time + link-time ===
* CMock ์Šคํƒ€์ผ (http://cmock.sf.net) : ์ž๋™์œผ๋กœ expect ํ•จ์ˆ˜์™€ ๊ฐ€์งœ ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค์–ด ์ฃผ๊ณ , ๋งํฌํ•  ๋•Œ ๋ฐ”๊ฟ”์น˜๊ธฐ

์˜ˆ๋ฅผ ๋“ค์–ด ์œ„ wmc ๊ฒฝ์šฐ, write_char๊ฐ€ ์„ ์–ธ๋œ ํ—ค๋” ํŒŒ์ผ์ด ์žˆ๋‹ค๋ฉด, ์ž๋™์œผ๋กœ ๊ทธ ํ—ค๋” ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋‹ค์Œ ํ•จ์ˆ˜๋“ค์„ ์ƒ์„ฑํ•œ๋‹ค.

write_char
write_char_Expect

์ด ๋•Œ ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

void test_wmc_calls_wc()
{
int i;
for(i=0;i++;i<80)
write_char_Expect('=');
write_multiple_char('=',80);
}

Jooyung Han

unread,
Dec 14, 2008, 7:56:53โ€ฏPM12/14/08
to xp...@googlegroups.com
CMock ๋ฐฉ๋ฒ•์€ ๋งค๋ ฅ์ ์ด๊ธด ํ•˜์ง€๋งŒ, ๋นŒ๋“œ๊ณผ์ •์— ์ถ”๊ฐ€์ ์ธ ์Šคํ…์ด ์ถ”๊ฐ€๋˜์–ด ์กฐ๊ธˆ ๊บผ๋ ค์ง€๋„ค์š”.

๋ฐ˜๋ฉด Cgreen์˜ mock implementation ๋ฐฉ๋ฒ•์€ ๊ต‰์žฅํžˆ ํšจ์šฉ๊ฐ€์น˜๊ฐ€ ๋†’๋‹ค๊ณ  ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  seam์„ ๋งŒ๋“ค์–ด
mock์„ ๋„ฃ์„์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋งค๋ฒˆ record-play ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๊ท€์ฐฎ์€ ์ƒํ™ฉ์ด์—ˆ๋Š”๋ฐ, Cgreen์„ ์ด์šฉํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋ 
๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ์‰ฝ๊ฒŒ seam์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ function to function pointer ๋ฆฌํŒฉํ„ฐ๋ง์ด
ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. http://www.odd-e.com/blog/2007/12/function-to-function-pointer-r.html


2008/12/14 June Kim <june...@gmail.com>:

--
Jooyung Han

June Kim

unread,
Dec 14, 2008, 9:25:58โ€ฏPM12/14/08
to xp...@googlegroups.com
function pointer๋ฅผ ์“ฐ๋ฉด(DI๋ฅผ ์จ์„œ ํ˜ธ์ถœํ•˜๋ ค๋Š” ํ•จ์ˆ˜์—๊ฒŒ fp๋ฅผ argument๋กœ ๋งค๋ฒˆ ์ „๋‹ฌํ•˜๊ฑด, ํ˜น์€
global๋กœ ๋‘ฌ์„œ ์ „์ฒด ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๊ฑด -- bas vodde์˜ ์˜ˆ) ์‹ซ์–ดํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ๋”๊ตฐ์š”.

1. ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. (์ด๊ฑด global๋กœ ๋‘๊ณ  ๋งˆ์น˜ ํ•จ์ˆ˜ ์“ฐ๋“ฏ ํ•˜๋Š” ๊ฑธ ์“ฐ๋ฉด ๋œ๋‹ค๊ณ  ํ•˜๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅ)
2. ์†๋„ ๋ฌธ์ œ (๋ณดํ†ต mockํ•˜๋Š” ๋Œ€์ƒ์ด low-level์ด๊ธฐ ์‰ฌ์šด๋ฐ, ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ performance-criticalํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ.)
3. ์™ ์ง€ ์‹ซ๋‹ค

2๋ฒˆ์ด๋‚˜ 3๋ฒˆ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ฒฐ๊ตญ์€ compile-time ํ˜น์€ link-time polymorphism์„ ์„ž์–ด์“ฐ๊ฒŒ ๋˜๋”๊ตฐ์š”.

2008/12/15 Jooyung Han <jooyu...@gmail.com>:

๊ฐ•์„์ฒœ

unread,
Dec 15, 2008, 9:16:53โ€ฏPM12/15/08
to xper
link time polymorphism ์„ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์„ ์ƒ๊ฐํ•ด๋ณด๋ฉด

* ๊ธฐ์กด ์ฝ”๋“œ๊ฐ€ 'interface' ์˜ ๊ฐœ๋…์ด ์—†๋˜ ๊ฒฝ์šฐ - public interface ์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ๊ณ ๋ฏผํ•˜๊ณ  ์ถ”ํ›„ ๋ฐ”
๊ฟ” ์“ด๋‹ค๋Š” ๊ฐœ๋…์ด ์—†์ด ๋ชจ๋…ธ๋ฆฌํ‹ฑํ•œ ๋””์ž์ธ์ธ ๊ฒฝ์šฐ

* interface ์ถ”์ถœ์กฐ์ฐจ ํž˜๋“  ๊ฐ€์šด๋ฐ ์ตœ๋Œ€ํ•œ legacy code ๋ฅผ ๋œ ๊ฑด๋“œ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ - ์ด๊ฒŒ ์ข€
ํฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

* ์ฃผ๋ณ€์—์˜ C/C++ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋ฐœ์ž๋“ค์˜ ๊ฒฝ์šฐ OO ๋””์ž์ธ ๊ณ ๋ฏผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด๊ฒŒ ๋” ์นœ์ˆ™ํ•œ ๋“ฏ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก 
'link time polymorphism' ์ด๋ผ๋Š” ์šฉ์–ด๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ;)


On 12์›”15์ผ, ์˜ค์ „11์‹œ25๋ถ„, "June Kim" <junea...@gmail.com> wrote:
> function pointer๋ฅผ ์“ฐ๋ฉด(DI๋ฅผ ์จ์„œ ํ˜ธ์ถœํ•˜๋ ค๋Š” ํ•จ์ˆ˜์—๊ฒŒ fp๋ฅผ argument๋กœ ๋งค๋ฒˆ ์ „๋‹ฌํ•˜๊ฑด, ํ˜น์€
> global๋กœ ๋‘ฌ์„œ ์ „์ฒด ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•˜๊ฑด -- bas vodde์˜ ์˜ˆ) ์‹ซ์–ดํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค์ด ๋งŽ๋”๊ตฐ์š”.
>
> 1. ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง„๋‹ค. (์ด๊ฑด global๋กœ ๋‘๊ณ  ๋งˆ์น˜ ํ•จ์ˆ˜ ์“ฐ๋“ฏ ํ•˜๋Š” ๊ฑธ ์“ฐ๋ฉด ๋œ๋‹ค๊ณ  ํ•˜๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅ)
> 2. ์†๋„ ๋ฌธ์ œ (๋ณดํ†ต mockํ•˜๋Š” ๋Œ€์ƒ์ด low-level์ด๊ธฐ ์‰ฌ์šด๋ฐ, ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ performance-criticalํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ.)
> 3. ์™ ์ง€ ์‹ซ๋‹ค
>
> 2๋ฒˆ์ด๋‚˜ 3๋ฒˆ์„ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๊ฒฐ๊ตญ์€ compile-time ํ˜น์€ link-time polymorphism์„ ์„ž์–ด์“ฐ๊ฒŒ ๋˜๋”๊ตฐ์š”.
>

> 2008/12/15 Jooyung Han <jooyung....@gmail.com>:


>
> > CMock ๋ฐฉ๋ฒ•์€ ๋งค๋ ฅ์ ์ด๊ธด ํ•˜์ง€๋งŒ, ๋นŒ๋“œ๊ณผ์ •์— ์ถ”๊ฐ€์ ์ธ ์Šคํ…์ด ์ถ”๊ฐ€๋˜์–ด ์กฐ๊ธˆ ๊บผ๋ ค์ง€๋„ค์š”.
>
> > ๋ฐ˜๋ฉด Cgreen์˜ mock implementation ๋ฐฉ๋ฒ•์€ ๊ต‰์žฅํžˆ ํšจ์šฉ๊ฐ€์น˜๊ฐ€ ๋†’๋‹ค๊ณ  ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋“  seam์„ ๋งŒ๋“ค์–ด
> > mock์„ ๋„ฃ์„์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๋งค๋ฒˆ record-play ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๊ท€์ฐฎ์€ ์ƒํ™ฉ์ด์—ˆ๋Š”๋ฐ, Cgreen์„ ์ด์šฉํ•˜๋ฉด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ๋ 
> > ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
>
> > ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ, ์‰ฝ๊ฒŒ seam์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ function to function pointer ๋ฆฌํŒฉํ„ฐ๋ง์ด
> > ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.http://www.odd-e.com/blog/2007/12/function-to-function-pointer-r.html
>

> > 2008/12/14 June Kim <junea...@gmail.com>:


> >> ๋ช‡ ๋…„ ์ „๋ถ€ํ„ฐ c์–ธ์–ด์—์„œ mock object ํšจ๊ณผ ๋‚ด๊ธฐ๋กœ ๊ณ ๋ฏผ์„ ์ข€ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์•„๋ž˜์—์„œ "run-time +
> >> compile-time" ๊ฐ™์€ ๊ฒƒ์ด ์ œ๊ฐ€ ๋งŒ๋“  ํ•ด๋ฒ• ์ค‘ ํ•˜๋‚˜์ด๊ณ ์š”(๋งŒ๋“ ์ง€๋Š” 4๋…„ ์ •๋„ ๋œ ๋“ฏ).
>
> >> xper ์œ„ํ‚ค ๊ฐ™์€ ๊ณณ์— ์ •๋ฆฌํ•ด์„œ ์˜ฌ๋ฆด ์˜ˆ์ •์ธ๋ฐ, ์ผ๋‹จ ์˜๊ฒฌ ๋ชจ์œผ๋Š” ์ฐจ์›์—์„œ ๊ฐ„๋žตํžˆ ์—ฌ๊ธฐ ์ •๋ฆฌํ•ด ์”๋‹ˆ๋‹ค.
>
> >> == run-time polymorphism ==
> >> * ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์‚ฌ์šฉ

> >> - cgreen ์Šคํƒ€์ผhttp://www.lastcraft.com/mock_callbacks.php

Jooyung Han

unread,
Dec 18, 2008, 3:14:43โ€ฏAM12/18/08
to xp...@googlegroups.com
๊น€์ฐฝ์ค€ ๋‹˜์ด ๊ธ€์„ ์˜ฌ๋ ค์ฃผ์‹  ๊ฒƒ์„ ๊ณ„๊ธฐ๋กœ ์ €ํฌ ํŒ€ ์œ„ํ‚ค์— ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด๋ณธ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

--- Mock in C --
๋ณดํ†ต์€ Mock ๊ฐ์ฒด๋ผ๊ณ  ๋งŽ์ด ๋ถ€๋ฅด์ง€๋งŒ, C์—์„œ๋Š” Mock ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Mock์€ ์กฐ๊ธˆ ๋” ๋˜‘๋˜‘ํ•œ Test double ์ด๋‹ค..

Test double์ด ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์œผ๋ฏ€๋กœ, mock ํ•จ์ˆ˜๊ฐ€ ๋“ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.

* Link-time substitution
* Run-time substitution
** function pointers
** virtual table

์–ด๋–ป๊ฒŒ ๋˜‘๋˜‘ํ• ๊นŒ?

* record and play ๋ฐฉ์‹์„ ์ง€์›ํ•œ๋‹ค.
** record: ์ด๋ ‡๊ฒŒ ํ˜ธ์ถœ๋  ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ๊ฐ’์„ returnํ•  ๊ฒƒ์ด๋‹ค... ๋ผ๋Š” ๊ฒƒ์„ setup ๋‹จ๊ณ„์— ์ง€์ •ํ•ด๋‘๊ณ ,
(์ด๊ฒƒ๋“ค์„ expectation์ด๋ผ ๋ถ€๋ฅธ๋‹ค.)
** play: exercise ๋‹จ๊ณ„์—์„œ Function under test ๋ฅผ ํ˜ธ์ถœํ–ˆ์„๋•Œ, ์œ„์™€ ๊ฐ™์ด ๋™์ž‘ํ•ด์ค€๋‹ค.
* self-verification ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
** record ํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉ๋  ๊ฒฝ์šฐ, fail๋กœ ๊ฐ„์ฃผํ•œ๋‹ค.
** ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜ธ์ถœ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ–ˆ๋Š”๋ฐ ๋ถˆ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๊ฑฐ๋‚˜, ์ง€์ •๋œ ๊ฐ’๊ณผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

์ด๋งŒํผ ๋˜‘๋˜‘ํ•œ ๋…€์„์ด ํ•„์š”์—†์„ ๋•Œ๋Š”, ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

* call count ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค.
* call sequence ๋ฅผ ๋กํ•œ๋‹ค. (string append)
* last call param์„ ์ €์žฅํ•œ๋‹ค.
* ...

Mock์˜ ๋™์ž‘์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋„๋ก ์ง€์›ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

* CMock - header ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ํ•ด๋‹น interface api ๋“ค์— ๋Œ€ํ•œ mock ํ•จ์ˆ˜ ๋ฐ expect ํ•จ์ˆ˜๋ฅผ ์ž๋™
์ƒ์„ฑํ•˜์—ฌ Link time polymorphism์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. Make๋ฅผ ์ž˜ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
* Cgreen - ํ•จ์ˆ˜๋ช…๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ช…์„ ๊ธฐ์ค€์œผ๋กœ expectation์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

์œ„ ๊ฐ๊ฐ์˜ ๊ฒฝ์šฐ, ์ง์ ‘ mock์˜ record and play ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ ๋„, ๋˜‘๋˜‘ํ•œ mock์„ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ ์€,

* CMock - ruby ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , link-time ์— ํŠนํ™”๋˜์–ด ์žˆ๋‹ค. Make๊ตฌ์„ฑ์ด ์–ด๋ ต๋‹ค.
* Cgreen - ํ˜„์žฌ๊นŒ์ง€ intptr_t ํ˜ธํ™˜ ํƒ€์ž…๋งŒ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๋“ค๋กœ๋ถ€ํ„ฐ ๋‹ค์Œ์˜ ์žฅ์ ์„ ์ทจํ•  ์ˆ˜ ์žˆ๋‹ค.

* CMock - ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ ์ž๋™์ƒ์„ฑ์„ ๋นŒ๋“œ์‹œ์— ํ•˜์ง€ ์•Š๊ณ , CppUTest์˜ script์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ํšจ๊ณผ์ ์ผ ๊ฒƒ์ด๋‹ค.
* Cgreen - ํ˜„์žฌ double type์€ boxing/unboxing ํ˜•ํƒœ๋กœ ์ง€์›ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด
์‚ฌ์šฉ์ž ์ •์˜ํƒ€์ž…์œผ๋กœ๊นŒ์ง€ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. CppUTest ์˜ plug-in์œผ๋กœ ์ถ”๊ฐ€ํ•˜๋ฉด CppUTest์—์„œ๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜
์žˆ์„ ๊ฒƒ์ด๋‹ค.


2008/12/16 ๊ฐ•์„์ฒœ <free...@gmail.com>:

--
Jooyung Han

Reply all
Reply to author
Forward
0 new messages