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);
}
๋ฐ๋ฉด 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
1. ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค. (์ด๊ฑด global๋ก ๋๊ณ ๋ง์น ํจ์ ์ฐ๋ฏ ํ๋ ๊ฑธ ์ฐ๋ฉด ๋๋ค๊ณ ํ๋ฉด ํด๊ฒฐ ๊ฐ๋ฅ)
2. ์๋ ๋ฌธ์ (๋ณดํต mockํ๋ ๋์์ด low-level์ด๊ธฐ ์ฌ์ด๋ฐ, ์ด๋ฐ ๊ฒ๋ค์ performance-criticalํ ๊ฒฝ์ฐ๊ฐ ์์.)
3. ์ ์ง ์ซ๋ค
2๋ฒ์ด๋ 3๋ฒ์ ํด๊ฒฐํ๋ ค๋ฉด ๊ฒฐ๊ตญ์ compile-time ํน์ link-time polymorphism์ ์์ด์ฐ๊ฒ ๋๋๊ตฐ์.
2008/12/15 Jooyung Han <jooyu...@gmail.com>:
* ๊ธฐ์กด ์ฝ๋๊ฐ '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
--- 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