Linux Kernel Selftests


内核在 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值