CUnit を使う2018年10月5日 | |
はじめにC 言語用のユニットテストフレームワークである CUnit の使い方について。 環境Ubuntu 16.04 LTS インストール$ sudo apt-get install libcunit1-dev 使用例関数を 1 つ持つモジュールを考える。 module.c
#include "module.h"
int func(void)
{
return 1;
}
#include "module-test.h"
関数 func() は 1 を返す。最後でテストコードを取り込んでいる。テストコードは次のように書く。 module-test.h
#include <CUnit/CUnit.h>
static int Test_init(void)
{
return 0;
}
static int Test_term(void)
{
return 0;
}
static void Module_func(void)
{
CU_ASSERT_EQUAL(func(), 1);
}
void Module_test_register(void)
{
CU_pSuite suite;
suite = CU_add_suite("Module", Test_init, Test_term);
CU_add_test(suite, "func", Module_func);
}
テストの本体は Module_func() で、func() が 1 を返すことを確認している。Module_test_register() でテストを登録している。ヘッダーファイルは次のとおりである。 module.h #ifndef MODULE_H #define MODULE_H int func(void); void Module_test_register(void); #endif /* MODULE_H */ テストの main() 関数は次のようにする。 unit_test.c
#include <CUnit/Basic.h>
#include "module.h"
int main(void)
{
CU_initialize_registry();
Module_test_register();
CU_basic_run_tests();
CU_cleanup_registry();
return 0;
}
Module_test_regsiter() を呼び出して module のテストを登録している。CU_basic_run_tests() でテストが実行される。Makefile は次のようになる。 Makefile
all:
gcc -o unit_test unit_test.c module.c -lcunit
コンパイル、実行。
$ make
$ ./unit_test
CUnit - A unit testing framework for C - Version 2.1-3
http://cunit.sourceforge.net/
Run Summary: Type Total Ran Passed Failed Inactive
suites 1 1 n/a 0 0
tests 1 1 1 0 0
asserts 1 1 1 0 n/a
Elapsed time = 0.000 seconds
テストが 1 つ実行され、パスしている。 試しに func() の返り値を 0 にしてみよう。 module.c
int func(void)
{
return 0;
}
コンパイル、実行。
$ make
$ ./unit_test
CUnit - A unit testing framework for C - Version 2.1-3
http://cunit.sourceforge.net/
Suite Module, Test func had failures:
1. module-test.h:15 - CU_ASSERT_EQUAL(func(),1)
Run Summary: Type Total Ran Passed Failed Inactive
suites 1 1 n/a 0 0
tests 1 1 0 1 0
asserts 1 1 0 1 n/a
Elapsed time = 0.000 seconds
テストが失敗したことがわかる。 実用的には、プログラムのコンパイル時に自動的にテストを実行するのがよいのだろう。たとえば、Makefile を次のようにすればよいかもしれない。 Makefile
LIBS = -lcunit
OBJS = module.o
all: prog unit_test
prog: prog.o $(OBJS)
gcc -o $@ $^ $(LIBS)
unit_test: unit_test.o $(OBJS)
gcc -o $@ $^ $(LIBS)
./unit_test
.c.o:
gcc -c $<
コンパイル。
$ make
gcc -c prog.c
gcc -c module.c
gcc -o prog prog.o module.o -lcunit
gcc -c unit_test.c
gcc -o unit_test unit_test.o module.o -lcunit
./unit_test
CUnit - A unit testing framework for C - Version 2.1-3
http://cunit.sourceforge.net/
Suite Module, Test func had failures:
1. module-test.h:15 - CU_ASSERT_EQUAL(func(),1)
Run Summary: Type Total Ran Passed Failed Inactive
suites 1 1 n/a 0 0
tests 1 1 0 1 0
asserts 1 1 0 1 n/a
Elapsed time = 0.000 seconds
自動的にテストが実行され、コンパイルは成功したがテストには失敗したことがわかる。 | |
| PENGUINITIS | |