1# 内核测试框架 2 3  DragonOS提供了一个测试框架,旨在对内核的一些模块进行自动化测试。内核测试框架位于`ktest/`下。 4 5  我们可以使用这个测试框架,按照规范编写测试代码,然后在合适的地方使用`ktest_start()`创建一个全新的内核线程并发起测试。 6 7## 使用方法 8 9### 创建自动测试程序 10 11  假如您要对kfifo模块进行自动测试,您可以在`ktest/`下,创建一个名为`test-kfifo.c`的测试文件,并编写Makefile。 12 13  在`test-kfifo.c`中,包含`ktest_utils.h`和`ktest.h`这两个头文件。 14 15  您需要像下面这样,在`test-kfifo.c`中,创建一个测试用例函数表,并把测试用例函数填写到其中: 16```c 17static ktest_case_table kt_kfifo_func_table[] = { 18 ktest_kfifo_case0_1, 19}; 20``` 21 22  然后创建一个函数,作为kfifo测试的主函数。请注意,您需要将它的声明添加到`ktest.h`中。 23 24```c 25uint64_t ktest_test_kfifo(uint64_t arg) 26{ 27 kTEST("Testing kfifo..."); 28 for (int i = 0; i < sizeof(kt_kfifo_func_table) / sizeof(ktest_case_table); ++i) 29 { 30 kTEST("Testing case %d", i); 31 kt_kfifo_func_table[i](i, 0); 32 } 33 kTEST("kfifo Test done."); 34 return 0; 35} 36``` 37 38 39### 编写测试用例 40 41  您可以创建一个或多个测试用例,命名为:`ktest_kfifo_case_xxxxx`. 在这个例子中,我创建了一个测试用例,命名为:`ktest_kfifo_case0_1`.如下所示: 42 43```c 44static long ktest_kfifo_case0_1(uint64_t arg0, uint64_t arg1) 45``` 46 47  这里最多允许我们传递两个参数到测试函数里面。 48 49  那么,我们该如何编写测试用例呢? 50 51  我们主要是需要设置一些情节,以便能测试到目标组件的每个情况。为了检验模块的行为是否符合预期,我们需要使用`assert(condition)`宏函数,对目标`condition`进行校验。若`condition`为1,则表明测试通过。否则,将会输出一行assert failed信息到屏幕上。 52 53### 发起测试 54 55  我们可以在pid≥1的内核线程中发起测试。由于DragonOS目前尚不完善,您可以在`process/process.c`中的`initial_kernel_thread()`函数内,发起内核自动测试。具体的代码如下: 56 57```c 58ktest_start(ktest_test_kfifo, 0); 59``` 60 61  这样就发起了一个内核测试,它会创建一个新的内核线程进行自动测试,您不必担心第一个内核线程会被阻塞。 62   63 64## API文档 65 66### ktest_start 67 68`pid_t ktest_start(uint64_t (*func)(uint64_t arg), uint64_t arg)` 69 70#### 描述 71 72  开启一个新的内核线程以进行测试 73 74#### 参数 75 76**func** 77 78  测试函数. 新的测试线程将会执行该函数,以进行测试。 79 80**arg** 81 82  传递给测试函数的参数 83 84#### 返回值 85 86  测试线程的pid 87 88### assert 89 90`#define assert(condition)` 91 92#### 描述 93 94  判定condition是否为1,若不为1,则输出一行错误日志信息: 95 96``` 97[ kTEST FAILED ] Ktest Assertion Failed, file:%s, Line:%d 98``` 99 100### kTEST 101 102```#define kTEST(...) ``` 103 104#### 描述 105 106  格式化输出一行以`[ kTEST ] file:%s, Line:%d`开头的日志信息。 107 108 109### ktest_case_table 110 111`typedef long (*ktest_case_table)(uint64_t arg0, uint64_t arg1)` 112 113#### 描述 114  ktest用例函数的类型定义。 115