1、简介
内核源码的多个子系统都有自己的自测工具,到目前为止,断点、cpu热插拔、efivarfs、IPC、KCMP、内存热插拔、mqueue、网络、powerpc、ptrace、rcutorture、定时器和虚拟机子系统都有自测工具。另外,用户态内存的自测工具可以利用 testusercopy 模块来测试用户态内存到内核态的拷贝过程。
kselftest是Linux源代码中在tools / testing / selftests中提供的测试框架,能够测试内核的特定部分。测试脚本用C语言或Shell脚本编写,并在用户空间中运行以测试内核的特定部分。一些测试脚本可以验证部分Linux内核子系统、库和API,包括cpufreq,gpio,网络,rtc,watchdog,cgroup,ftrace,futex,ipc等。kselftests在用户空间运行。可以用Test Harness在用户空间编写、运行测试。在内核空间中运行的测试需要用到Test Module。
Kselftest具有以下特性:
- 能够快速的运行测试 (目标是在20分钟内完成)
- 能够运行不同的测试组
- 测试源代码保存在内核源代码树中,任何使用内核源代码的人都可以轻松地访问它
2、运行自检(热插拔测试以受限模式运行)
编译测试:
$ make -C tools/testing/selftests
运行测试:
$ make -C tools/testing/selftests run_tests
使用单个命令编译和运行测试,可使用:
$ make kselftest
从用户特定的对象目录编译并运行(make O=dir):
$ make O=/tmp/kselftest kselftest
生成并运行KBUILD_OUTPUT目录(make KBUILD_OUTPUT=):
$ make KBUILD_OUTPUT=/tmp/kselftest kselftest
3、运行部分自测
可以在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
4、安装自检
可以使用kselftest_install.sh工具在默认位置(tools/testing/selftests/kselftest或用户指定的位置)安装自测。
要在默认位置安装自测:
$ cd tools/testing/selftests
$ ./kselftest_install.sh
要将自检安装在用户指定的位置:
$ cd tools/testing/selftests
$ ./kselftest_install.sh install_dir
5、运行已安装的自测
Kselftest安装以及Kselftest压缩包提供了一个名为“ run_kselftest.sh”的脚本来运行测试。
只需执行以下操作即可运行已安装的Kselftests。某些测试需要root特权。
6、实践
6.1、查看帮助
# ./run_kselftest.sh -h
Usage: ./run_kselftest.sh [OPTIONS]
-s | --summary Print summary with detailed log in output.log
-t | --test COLLECTION:TEST Run TEST from COLLECTION
-c | --collection COLLECTION Run all tests from COLLECTION
-l | --list List the available collection:test entries
-d | --dry-run Don't actually run any tests
-h | --help Show this usage info
6.2、查看所有用例
# ./run_kselftest.sh -l
amd-pstate:run.sh
breakpoints:step_after_suspend_test
breakpoints:breakpoint_test
cgroup:test_memcontrol
cgroup:test_kmem
cgroup:test_core
cgroup:test_freezer
cgroup:test_kill
……
6.3、运行某个指定的测试用例
# ./run_kselftest.sh -t size:get_size
TAP version 13
1..1
# selftests: size: get_size
# TAP version 13
# # Testing system size.
# ok 1 get runtime memory use
# # System runtime memory report (units in Kilobytes):
# ---
# Total: 526544212
# Free: 45069516
# Buffer: 4372
# In use: 481470324
# ...
# 1..1
ok 1 selftests: size: get_size
6.4、运行某个指定的测试用例集
# ./run_kselftest.sh -c tpm2
TAP version 13
1..3
# selftests: tpm2: test_smoke.sh
ok 1 selftests: tpm2: test_smoke.sh # SKIP
# selftests: tpm2: test_space.sh
ok 2 selftests: tpm2: test_space.sh # SKIP
# selftests: tpm2: test_async.sh
ok 3 selftests: tpm2: test_async.sh # SKIP