内核在
tools/testing/selftests/
目录下包含一组“self tests”。这些旨在作为小型测试,以练习内核中的各个代码路径。测试旨在在构建,安装和引导内核之后运行。
在某些系统上,热插拔测试可能永远挂起,以等待CPU
和内存准备好脱机。创建一个特殊的热插拔目标以运行所有范围的热插拔测试。在默认模式下,热插拔测试在有限范围内的安全模式下运行。在受限模式下,cpu-hotplug
测试在单个cpu
上运行,而不是在所有具有热插拔功能的cpus
上运行,并且内存热插拔测试在具有热插拔功能的内存的2%
而不是10%
上运行。
运行自检(热插拔测试以受限模式运行)
要构建测试:
$ make -C tools/testing/selftests
要运行测试:
$ make -C tools/testing/selftests run_tests
要使用单个命令构建和运行测试,请使用:
$ make kselftest
请注意,某些测试将需要root特权。
从用户特定的对象目录构建并运行(make O=dir)
:
$ make O=/tmp/kselftest kselftest
生成并运行KBUILD_OUTPUT
目录(make KBUILD_OUTPUT=
):
$ make KBUILD_OUTPUT=/tmp/kselftest kselftest
上面的命令运行测试并打印通过/失败摘要,以使您更容易理解测试结果。请在/tmp/testname
文件中找到每个测试的详细测试结果。
运行部分自测
您可以在make
命令行上使用“ TARGETS
”变量来指定要运行的单个测试或要运行的测试列表。
要仅运行针对单个子系统的测试:
$ make -C tools/testing/selftests TARGETS=ptrace run_tests
您可以指定多个测试来构建和运行:
$ make TARGETS="size timers" kselftest
从用户特定的对象目录构建并运行(make O=dir)
:
$ make O=/tmp/kselftest TARGETS="size timers" kselftest
生成并运行KBUILD_OUTPUT
目录(make KBUILD_OUTPUT=
):
$ make KBUILD_OUTPUT=/tmp/kselftest TARGETS="size timers" kselftest
上面的命令运行测试并打印通过/失败摘要,以使您更容易理解测试结果。请在/tmp/testname
文件中找到每个测试的详细测试结果。
有关所有可能目标的列表,请参见顶级工具tools/testing/selftests/Makefile
。
运行全方位热插拔自测
要构建热插拔测试:
$ make -C tools/testing/selftests hotplug
要运行热插拔测试:
$ make -C tools/testing/selftests run_hotplug
请注意,某些测试将需要root特权。
安装自检
您可以使用kselftest_install.sh
工具在默认位置(tools/testing/selftests/kselftest
或用户指定的位置)安装自测。
要在默认位置安装自测:
$ cd tools/testing/selftests
$ ./kselftest_install.sh
要将自检安装在用户指定的位置:
$ cd tools/testing/selftests
$ ./kselftest_install.sh install_dir
运行已安装的自测
Kselftest
安装以及Kselftest
压缩包提供了一个名为“ run_kselftest.sh
”的脚本来运行测试。
您只需执行以下操作即可运行已安装的Kselftests
。请注意,某些测试需要root
特权:
贡献新测试
kselftest_harness.h
文件包含有用的帮助程序来构建测试。可以使用tools/testing/selftests/seccomp/seccomp_bpf.c
中的测试作为示例。
Example
#include "../kselftest_harness.h"
TEST(standalone_test) {
do_some_stuff;
EXPECT_GT(10, stuff) {
stuff_state_t state;
enumerate_stuff_state(:c:type:`state`);
TH_LOG("expectation failed with state: ``s``", state.msg);
}
more_stuff;
ASSERT_NE(some_stuff, NULL) TH_LOG("how did it happen?!");
last_stuff;
EXPECT_EQ(0, last_stuff);
}
FIXTURE(my_fixture) {
mytype_t *data;
int awesomeness_level;
};
FIXTURE_SETUP(my_fixture) {
self->data = :c:func:`mytype_new()`;
ASSERT_NE(NULL, self->data);
}
FIXTURE_TEARDOWN(my_fixture) {
mytype_free(self->data);
}
TEST_F(my_fixture, data_is_good) {
EXPECT_EQ(1, is_my_data_good(self->data));
}
TEST_HARNESS_MAIN
帮助
TH_LOG(fmt, ...)
参数:
fmt
格式字符串
...
可选参数
描述:
TH_LOG(format, ...)
可在测试中使用的可选调试日志记录功能。通过定义TH_LOG_ENABLED可以启用或禁用日志记录。
E.g.,
#define TH_LOG_ENABLED 1
如果未提供定义,则默认情况下启用日志记录。
如果无法为运行测试的进程打印错误消息(例如,不允许写入stderr),则仍然有可能获得测试失败的ASSERT_*号。
可以通过编写_metadata->no_print = true来启用此行为;
在无法打印的检查序列之前。当发生错误时,测试过程将使用断言编号作为参数来调用_exit(2),
而不是打印错误消息并调用abort(3),然后由父进程打印。
TEST(test_name)
定义测试功能并创建注册存根
参数:
test_name
test name
描述:
TEST(name) { implementation }
通过名称定义测试。名称必须唯一,并且测试不能并行运行。包含block的实现是一个函数,作用域应这样对待。尽早返回可能只是简单的“返回”;声明。
EXPECT_* 和ASSERT_* 在 TEST() { } 中是有效的.
TEST_SIGNAL(test_name, signal)
参数:
test_name
test name
signal
signal number
描述:
TEST_SIGNAL(name, signal) { implementation }
通过名称和期望的术语信号定义测试。名称必须唯一,并且测试不能并行运行。包含block的实现是一个函数,作用域应这样对待。尽早返回可能只是简单的“返回”;声明。
EXPECT_* 和ASSERT_* 在 TEST() { } 中是有效的.
FIXTURE_DATA(datatype_name)
包装结构名称,以便我们少传递一个参数
参数:
datatype_name
datatype name
描述:
FIXTURE_DATA(datatype name)
当需要数据的类型时,可以使用此调用。通常,除非将自身直接传递给帮助者,否则不需要这样做。
FIXTURE(fixture_name)
每个灯具调用一次以设置数据并注册
参数:
fixture_name
fixture name
描述:
FIXTURE(datatype name) {
type property1;
...
};
将提供给TEST_F()定义的测试的数据定义为self。应该使用FIXTURE_SETUP()和FIXTURE_TEARDOWN()进行填充和清理。
FIXTURE_SETUP(fixture_name)
准备test的设置功能。包含_metadata,以便ASSERT_*方便使用
参数:
fixture_name
fixture name
描述:
FIXTURE_SETUP(fixture name) { implementation }
填充固件所需的“设置”功能。使用FIXTURE_DATA()定义的数据类型的实例将作为实现公开给自己。
ASSERT_ *在此上下文中有效,并且会阻止执行任何相关的夹具测试。
裸露的“return”;语句可能用于提早返回。
FIXTURE_TEARDOWN(fixture_name)
参数:
fixture_name
fixture name
描述:
FIXTURE_TEARDOWN(fixture name) { implementation }
填充夹具所需的“teardown”功能。用FIXTURE_DATA()定义的数据类型的实例将作为自身公开,以供实现清除。
裸露的“return”;语句可能用于提早返回。
TEST_F(fixture_name, test_name)
为基于夹具的测试用例发出测试注册和帮助程序
参数:
fixture_name
fixture name
test_name
test name
描述:
TEST_F(fixture, name) { implementation }
定义依赖夹具的测试(例如,属于测试用例的一部分)。与TEST()极为相似,不同的是self是暴露给夹具以供实现使用的数据类型的设置实例。
TEST_HARNESS_MAIN()
简单的包装程序即可运行测试工具
参数:
描述:
TEST_HARNESS_MAIN
使用一次即可将main()附加到测试文件。
操作
在TEST() 和TEST_F()中使用的运算符。 ASSERT_ *调用将立即停止测试执行。 EXPECT_ *调用将发出失败警告,请注意并继续。
ASSERT_EQ(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_EQ(expected, measured): expected == measured
ASSERT_NE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_NE(expected, measured): expected != measured
ASSERT_LT(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_LT(expected, measured): expected < measured
ASSERT_LE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_LE(expected, measured): expected <= measured
ASSERT_GT(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_GT(expected, measured): expected > measured
ASSERT_GE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_GE(expected, measured): expected >= measured
ASSERT_NULL(seen)
参数:
seen
measured value 被检测值
描述:
ASSERT_NULL(measured): NULL == measured
ASSERT_TRUE(seen)
参数:
seen
measured value 被检测值
描述:
ASSERT_TRUE(measured): measured != 0
ASSERT_FALSE(seen)
参数:
seen
measured value 被检测值
描述:
ASSERT_FALSE(measured): measured == 0
ASSERT_STREQ(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_STREQ(expected, measured): !strcmp(expected, measured)
ASSERT_STRNE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
ASSERT_STRNE(expected, measured): strcmp(expected, measured)
EXPECT_EQ(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_EQ(expected, measured): expected == measured
EXPECT_NE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_NE(expected, measured): expected != measured
EXPECT_LT(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_LT(expected, measured): expected < measured
EXPECT_LE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_LE(expected, measured): expected <= measured
EXPECT_GT(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_GT(expected, measured): expected > measured
EXPECT_GE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_GE(expected, measured): expected >= measured
EXPECT_NULL(seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_NULL(measured): NULL == measured
EXPECT_TRUE(seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_TRUE(measured): 0 != measured
EXPECT_FALSE(seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_FALSE(measured): 0 == measured
EXPECT_STREQ(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_STREQ(expected, measured): !strcmp(expected, measured)
EXPECT_STRNE(expected, seen)
参数:
expected
expected value 期望值
seen
measured value 被检测值
描述:
EXPECT_STRNE(expected, measured): strcmp(expected, measured)