内核测试框架
DragonOS提供了一个测试框架,旨在对内核的一些模块进行自动化测试。内核测试框架位于ktest/
下。
我们可以使用这个测试框架,按照规范编写测试代码,然后在合适的地方使用ktest_start()
创建一个全新的内核线程并发起测试。
使用方法
创建自动测试程序
假如您要对kfifo模块进行自动测试,您可以在ktest/
下,创建一个名为test-kfifo.c
的测试文件,并编写Makefile。
在test-kfifo.c
中,包含ktest_utils.h
和ktest.h
这两个头文件。
您需要像下面这样,在test-kfifo.c
中,创建一个测试用例函数表,并把测试用例函数填写到其中:
static ktest_case_table kt_kfifo_func_table[] = {
ktest_kfifo_case0_1,
};
然后创建一个函数,作为kfifo测试的主函数。请注意,您需要将它的声明添加到ktest.h
中。
uint64_t ktest_test_kfifo(uint64_t arg)
{
kTEST("Testing kfifo...");
for (int i = 0; i < sizeof(kt_kfifo_func_table) / sizeof(ktest_case_table); ++i)
{
kTEST("Testing case %d", i);
kt_kfifo_func_table[i](i, 0);
}
kTEST("kfifo Test done.");
return 0;
}
编写测试用例
您可以创建一个或多个测试用例,命名为:ktest_kfifo_case_xxxxx
. 在这个例子中,我创建了一个测试用例,命名为:ktest_kfifo_case0_1
.如下所示:
static long ktest_kfifo_case0_1(uint64_t arg0, uint64_t arg1)
这里最多允许我们传递两个参数到测试函数里面。
那么,我们该如何编写测试用例呢?
我们主要是需要设置一些情节,以便能测试到目标组件的每个情况。为了检验模块的行为是否符合预期,我们需要使用assert(condition)
宏函数,对目标condition
进行校验。若condition
为1,则表明测试通过。否则,将会输出一行assert failed信息到屏幕上。
发起测试
我们可以在pid≥1的内核线程中发起测试。由于DragonOS目前尚不完善,您可以在process/process.c
中的initial_kernel_thread()
函数内,发起内核自动测试。具体的代码如下:
ktest_start(ktest_test_kfifo, 0);
这样就发起了一个内核测试,它会创建一个新的内核线程进行自动测试,您不必担心第一个内核线程会被阻塞。