单为了提高nginx自己编写的模块的质量,可以通过单元测试进行增强。
注意:这里示例的单元测试目录和nginx源码在同一级;
安装cmocka
去官网下载最新的源码,目前最新的是1.1.7版本
gunzip -d cmocka-1.1.7.tar.xz ; tar -xvf cmocka-1.1.7.tar
cd cmocka-1.1.7
mkdir build; cd build ; cmake ; make install
依赖软件安装
yum install libxml2 libxslt cmake -y
编写测试用例
单元测试代码也是以nginx module的模式存在,所以需要单独创建一个目录用于存放单元测试代码。
mkdir tests;
创建config文件,内容如下,编译测试文件test.c
NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
$ngx_addon_dir/test.c \
"
CORE_LIBS="$CORE_LIBS -lcmocka"
编写测试代码test.c
#include <stdarg.h>
#include <stddef.h>
#include <setjmp.h>
#include <stdint.h>
#include <cmocka.h>
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdint.h>
#include <setjmp.h>
#include <cmocka.h>
static void torture_string_equal(void **state)
{
assert_string_equal("wurst", "wurst");
}
static void torture_string_not_equal(void **state)
{
assert_string_not_equal("wurst", "brot");
}
int main(void) {
const struct CMUnitTest tests[] = {
cmocka_unit_test(torture_string_equal),
cmocka_unit_test(torture_string_not_equal),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}
编译测试用例
进入到nginx的源码工程中,将nginx.c里的main函数重命名为unittest_main_setup并在nginx.h中进行申明,之所以这么做是因为,单元测试编译后是一个
独立的二进制可执行文件,如果不把nginx.c里的main函数命名修改,将无法编译通过。
./configure --add-module=../tests
make;
mv objs/nginx objs/test
运行测试用例
经过编译测试用例阶段,已在objs目录生成一个可执行测试用例文件test
./objs/test