一.安装及编译流程
1.下载LTP
LTP 项目目前位于 GitHub,项目地址:https://github.com/linux-test-project/ltp 。
获取最新版可以执行以下命令:
git clone https://github.com/linux-test-project/ltp.git
2.安装相关软件包
sudo apt-get install autoconf automake autotools-dev m4 gcc libssl-dev libaio-dev flex bison libcap-dev libregf-dev libdts-dev libdtools-ocaml-dev libnuma-dev libacl1-dev automake autoconf dma libmm-dev jfsutils libselinux1-dev xfslibs-dev netconfd numactl numad rpcbind nfs-kernel-server rsh-server sysstat
3.安装LTP步骤
cd ltp
make autotools
./configure
sudo make all
sudo make install
依次执行以上命令后,LTP 已经被正确安装到你的 Linux 系统中,默认安装位于 /opt/ltp/。
4.注意
需要注意的是,我们通过 git clone 命令下载的位于home目录下的ltp文件夹为 ltp源码文件夹,我将在后文简称为源码包。
通过执行一系列命令安装到 /opt 目录下的 ltp 文件夹为ltp安装文件夹,我将在后文简称为安装包。
二.目录结构
1.源码包
1.1.LTP 源码包目录结构描述
名称 | 说明 |
---|---|
INSTALL | LTP安装配置指导文档 |
README | LTP介绍 |
CREDITS | 记录对LTP有很大贡献的人 |
COPYING | GNU公开许可证 |
ChangeLog | 描述版本变化 |
ltpmenu | 规划执行LTP的图形化界面接口 |
Makefile | LTP顶层目录的Makefile,负责编译安装pan、testcases和tools |
runalltests.sh | 序运行全部测试用例并且报告结果的脚本 |
doc/* | 工程文档包含工具和库函数使用手册,描述各种测试 |
include/* | 通用的头文件目录 |
lib/* | 通用的函数目录 |
testcases/* | 包含在LTP下运行和bin目录下的所有测试用例和链接 |
testscripts/* | 存放分组的测试脚本 |
runtest/* | 为自动化测试提供命令列表 |
pan/* | 测试的驱动装置,具备随机和并行测试的能力 |
scratch/* | 存放零碎测试 |
tools/* | 存放自动化测试脚本和辅助工具 |
1.2.LTP 测试套件包含的内容
$ cd ltp/testcases/
$ ls
commands demoA kernel Makefile network realtime
cve kdump lib misc open_posix_testsuite
名称 | 说明 |
---|---|
commands | 常用命令测试 |
kernel | 内核模块及其相关模块 |
kdump | 内核现崩溃转储测试 |
network | 网络测试 |
realtime | 系统实时性测试 |
open_posix_testsuite | posix标准测试 |
misc | 崩溃、核心转出、浮点运算等测试 |
2.安装包
LTP安装包目录结构描述如下:
名称 | 说明 |
---|---|
bin | 存放LTP测试的一些辅助脚本 |
results | 测试结果默认存储目录 |
testcases | 测试项集 |
output | 测试日志默认存储目录 |
share | 脚本使用说明目录 |
runtest | 测试驱动(用于链接testscripts内的测试脚本和testcases测试项目) |
lib | 通用的库函数目录 |
三.测试执行
1.整体测试
可以测试所有的测试集,直接运行 runltp 命令将测试 ltp/scenario_groups/default 中的所有测试集,一次测试约 3 小时。
$ cd /opt/ltp
$ sudo ./runltp
也可以使用如下命令
$sudo ./runltp -t 8h |tee ~/runltp_test.log
-t:指定测试的持续时间
-t 60s = 60 seconds
-t 45m = 45 minutes
-t 24h = 24 hour
-t 2d = 2 days
|tee ~/runltp_test.log
把测试的日志打印在终端的同时收集到家目录下的runltp_test.log文件
查看测试结果
cd results/
vim LTP_RUN_ON-XXXX.log
可以到最后的统计
Total Tests: 2173
Total Skipped Tests:xxx
Total Failures: xxx
Kernel Version: xxx
Machine Architecture: mips64
Hostname: xxx
在output目录可以查看测试的fail项和tconf项
LTP_RUN_ON-XXXX.failed
LTP_RUN_ON-XXXX.tconf
2.测试集测试
当然我们可以只测试某个测试集,测试集可以在 ltp/runtest/ 下查看。
需要注意的是,如果我们测试某个测试集,runltp 需要指定 -f 参数。
例:
$sduo ./runltp -f mm //测试内存
- 1
3.单独测试
如果我们不想测试某个测试集,只想测试某个单独的测试,可以采用安装包测试或者源码包测试。下面以 access01 为例,讲解单独测试。
3.1.安装包测试
进入安装包,执行以下命令即可.
$ cd /opt/ltp/
$ sudo ./runltp -s access01
需要注意的是,如果我们测试某个测试,runltp 需要指定 -s 参数。
3.2.源码包测试
进入源码包,找到acess01胡位置,直接执行./access01即可.
$ cd ~/work/ltp/testcases/kernel/syscalls/access/
$ sudo ./access01
我们看到access01位于testcases目录下,实际上testcases目录下每个文件都是一个完整的可执行程序,可以在编译后的源码路径直接执行
4.测试结果
测试结果的输出类型如下:
Type | Description |
---|---|
BROK | 程序执行中途发生错误而使测试遭到破坏 |
CONF | 测试环境不满足而跳过执行 |
WARN | 测试中途发生异常 |
INFO | 输出通用测试信息 |
PASS | 测试成功 |
FAIL | 测试失败 |
5.测试结果分析
执行命令后,会输出许多内容,我们只需要关心最重要的部分.<<<test_start>>到<<<test_end>>中间的内容。这是一个小测试项的开始和结束标志,中间会打印测试的结果以及提示信息等。
5.1.例一测试通过的项
<<<test_start>>>
tag=read_all_dev stime=1611898350
cmdline="read_all -d /dev -p -q -r 3"
contacts=""
analysis=exit
<<<test_output>>>
tst_test.c:1263: TINFO: Timeout per run is 0h 05m 00s
read_all.c:446: TPASS: Finished reading files
Summary:
passed 1
failed 0
broken 0
skipped 0
warnings 0
<<<execution_status>>>
initiation_status="ok"
duration=0 termination_type=exited termination_id=0 corefile=no
cutime=1 cstime=1
<<<test_end>>>
根据这个信息我们主要分析哪些呢?
1.查看测试项:tag=read_all_dev
2.查看测试使用的命令:cmdline=read_all -d /dev -p -q -r 3
使用的read_all可执行文件参数是-d /dev -p -q -r 3 (参数的含义可以在源码中找到read_all.c),许多测试项是无参数的。
3.查看这个测试项一共有多个测试:Summary (上述的信息中只有passed=1其余是0,即此测试项一共只有1个测试)
4.如果3中有除了passed,需要查看test_output输出的信息,然后分析异常原因。
5.2.例二测试失败项
<<<test_start>>>
tag=read_all_sys stime=1611898352
cmdline="read_all -d /sys -q -r 3"
contacts=""
analysis=exit
<<<test_output>>>
tst_test.c:1263: TINFO: Timeout per run is 0h 05m 00s
Test timeouted, sending SIGKILL!
tst_test.c:1308: TINFO: If you are running on slow machine, try exporting LTP_TIMEOUT_MUL > 1
tst_test.c:1309: TBROK: Test killed! (timeout?)
Summary:
passed 0
failed 0
broken 1
skipped 0
warnings 0
<<<execution_status>>>
initiation_status="ok"
duration=300 termination_type=exited termination_id=2 corefile=no
cutime=3 cstime=5
<<<test_end>>>
通过上述信息可以看出:
1.测试项是read_all_sys
2.使用测试命令是read_all 参数是-d /sys -q -r 3
3.只有一个测试,并且出现了异常”broken 1“
4.查看test_output信息:提示测试是被杀死了,并不是正常结束。还提示可能是超时了。
从表面的信息是测试超时,测试进程被杀死。但是要找到根因,这需要进入源码分析。
如何分析?
1.找到测试项源码:
使用测试执行的文件搜索
uos@uos:~/ltp$ find -name read_all
./testcases/kernel/fs/read_all
./testcases/kernel/fs/read_all/read_all
uos@uos:~/ltp$ cd ./testcases/kernel/fs/read_all/
uos@uos:~/ltp/testcases/kernel/fs/read_all$ ls
Makefile read_all read_all.c
可以看出read_all这个执行文件是由read_all.c编译生成的。
2.打开read_all.c文件
查看测试项的功能 --> 了解参数的含义 --> 打点跟踪流程 --> 定位卡点(在哪里等待超时) --> 分析什么原因导致超时等待