Autotest是一个用来测试Linux内核的开源项目。Autotest作为一个分布式系统,通过集成web接口、数据库、服务器和客户机本身
负责管理多个客户机的状态。Autotest查找client/tests和client/site_tests中的所有目录,查找以“control.”开头的简单python文件。
这些文件包含变量列表和对job.run_test()的调用。control文件中的变量告诉文件何时调度测试用例,对run_test()的调用告诉autotest
如何调用测试用例。每个测试用例都是作业(job)的一部分。Autotest创建此作业(job)对象并fork一个子进程去执行其control文件。
测试用例在的你Linux环境下的一个重要的位置,并且映射到被测设备的相似的目录位置:
/src/third_party/autotest/files/client/site_tests/
:autotest的客户端测试用例
/usr/local/autotest/tests
当你有了Autotest后你将有两种方法运行测试用例,要么用你的chroot环境作为server要么直接在被测机器上直接运行。直接在被测机器
上运行的速度会更快,但至少需要先从服务器运行一次。
test_that
是在Chromium OS设备上运行autotest用例的命令,它替换了以前的旧命令run_remote_tests
。
test_that.py usage:
[-h] [-w WEB] [-x MAX_RUNTIME_MINS] [--oldrpc] [--fast]
[--args ARGS] [--results_dir RESULTS_DIR] [--pretend]
[--no-experimental] [--enforce-deps] [--debug]
[--iterations ITERATIONS] [--ssh_verbosity {0,1,2,3}]
[--ssh_options SSH_OPTIONS] [-b BOARD] [-m MODEL]
[-i BUILD] [-p POOL] [--autotest_dir AUTOTEST_DIR]
[--no-quickmerge] [--whitelist-chrome-crashes]
[--ssh_private_key SSH_PRIVATE_KEY]
REMOTE TEST [TEST ...]
使用 test_that(常用用法):
在指定host地址和board板卡信息的机器上运行testName的测试用例:
test_that -b board dut_ip[:port] TEST
运行一个名为audio_Aplay
的测试用例:
$ test_that -b ${BOARD} 172.18.92.102 audio_Aplay
运行一个套件suite:audio
,确保套件在/src/third_party/autotest/files/site_utils/attribute_whitelist.txt
文件中
$ test_that -b ${BOARD} 172.18.92.102 suite:audio
运行名称与正则表达式匹配的所有测试^login_.*$
$ test_that -b ${board} ${host} e:login_.*
运行控制文件filename与正则表达式匹配的所有测试^.*control.dummy$
$ test_that -b ${board} ${host} f:.*control.dummy
可以使用CTRL-C
向目标机发送一个SIGINT信号,停止自动测试。
在Chromium OS的机器上需要使用autotest,首先需要在chroot环境下以sever运行一次autotest,这将会将autotest的测试用例推
送到Chromium OS的机器上,否则/usr/local/autotest
可能不存在于设备上,之后在Chromium OS的机器上运行如下命令:
$/usr/local/autotest/bin/autotest_client /usr/local/autotest/tests/*testName*/control
以client的形式运行名为testName的autotest用例。
对于只做了python上的修改,test_that使用autotest_quickmerge
复制你的python修改到sysroot上。因此不需要运行rcp/scp
去将更改推送到你的被测设备上。
最快速的修改方法是直接在客户机上修改测试例程。但如果您发现Chromium OS设备上的文本编辑器用起来不爽,则可以在
本地编辑好该文件,然后使用rcp / scp之类的复制工具将其发送到DUT。方法如下:
首先增加修改到一个测试用例的python脚本文件中
之后将其复制到被测机器的/usr/local/autotest/tests
目录下
rcp path/to/test_name.py root@:/usr/local/autotest/tests/test_name/
通过调用autotest_client来运行它
在autotest
运行完成后,将会通过pass/failure判断测试结果。
......
18:03:18 INFO | autoserv| tko parser: ADD: GOOD
18:03:18 INFO | autoserv| Subdir: audio_Aplay
18:03:18 INFO | autoserv| Testname: audio_Aplay
18:03:18 INFO | autoserv| completed successfully
18:03:18 INFO | autoserv| tko parser: parsing test None CLIENT_JOB.0
18:03:18 INFO | autoserv| tko parser: ADD: GOOD
18:03:18 INFO | autoserv| Subdir: None
18:03:18 INFO | autoserv| Testname: CLIENT_JOB.0
18:03:18 INFO | autoserv| tko parser: parsing test ---- SERVER_JOB
18:03:18 INFO | autoserv| Attempting to autodetect if host is of type CrosHost
18:03:20 INFO | autoserv| There are no orphaned crashes; deleting /tmp/test_that_results_3PeN5R/results-1-audio_Aplay/crashinfo.172.18.92.102
18:03:21 INFO | autoserv| get_network_stats: at-end RXbytes 17011178 TXbytes 1129708
---------------------------------------------------------------------------
/tmp/test_that_results_3PeN5R/results-1-audio_Aplay [ PASSED ]
/tmp/test_that_results_3PeN5R/results-1-audio_Aplay/audio_Aplay [ PASSED ]
---------------------------------------------------------------------------
Total PASS: 2/2 (100%)
......
之后test_that将会创建一个目录存放测试日志:
Logging the data into test_report.html file.
18:03:22 INFO | Finished running tests. Results can be found in /tmp/test_that_results_3PeN5R or /tmp/test_that_latest
该目录将包含每个测试运行的目录。每个目录都包含与该测试运行相关的日志。
在/tmp/test_that_latest/debug/
目录下,是刚才运行的测试的日志文件,其中*.DEBUG
是最详细的输出,*.WARNING
是运行
测试中的警告,*.ERROR
是运行时的错误信息,*.INFO*
是运行时的一些消息输出。
我们编写的测试目标是:
1. 在
client/site_tests
下创建一个目录,名叫kernel_HdParmBasic
2. 在
kernel_HdParmBasic
目录下创建一个control文件,这是hdparm测试的最小控制文件:
AUTHOR = "wangjiahao"
NAME = "kernel_HdParmBasic"
TIME = "SHORT"
TEST_TYPE = "client"
DOC = """
This test uses hdparm to measure disk performance.
"""
job.run_test('kernel_HdParmBasic', named_arg='kernel test')
3. 创建一个测试用例的python文件:
最小的测试用例必须至少有一个包含了测试用例的实现的run_once()方法,这需要从test.test中继承。大多数的测试用例同样
需要初始化(initialize)和清理(cleanup )方法。例,创建文件client/site_tests/kernel_HdParmBasic/kernel_HdParmBasic.py
:
import logging
from autotest_lib.client.bin import test
class kernel_HdParmBasic(test.test):
version = 1
def initialize(self):
logging.debug('initialize')
def run_once(self, named_arg=''):
logging.debug(named_arg)
def cleanup(self):
logging.debug('cleanup')
#third_party/chromiumos-overlay/chromeos-base/autotest-tests/autotest-tests-9999.ebuild
IUSE_TESTS="${IUSE_TESTS}
# some other tests
# some other tests
# ...
+tests_kernel_HdParmBasic
"
cros_workon autotest-test
cros_workon-coral_cvte --board=lumpy start autotest-tests
emerge autotest-tests
emerge-coral_cvte chromeos-base/autotest-tests
如果上述命令由于dependency problems
失败了,尝试cros_workon-coral_cvte --board=${BOARD} autotest-chrome
,并
在上述命令后面增加chromeos-base/autotest-chrome
运行test_that
test_that -b ${BOARD} DUT_IP kernel_HdParmBasics
result
目录包含了许多日志文件,你需要找到相应的测试名称对应的目录(比如kernel_HdParmBasic
),之后去分析客户端
测试的日志信息。其中的(DEBUG, INFO, ERROR)文件取决于你想要查看哪种类型的日志。注意:日志文件了类型优先级按
照debug
<info
<warning
<error
的顺序输出,如果想要查看完整的日志信息,请查看debug 日志文件。
客户端测试的日志文件应该在:/tmp/test_that.
目录下,如:
/tmp/test_that./kernel_HdParmBasic/kernle_HdParmBasic/debug
你可以通过在运行test_that
命令时增加--results_dir_root option
选项更改result的路径。当然也可以查看最新的日志文件目录,
该目录为/tmp/test_that_latest
。
在DEBUG
的日志文件中,你可能会看到类似如下的信息:
01/18 12:22:46.716 DEBUG| kernel_HdParmBasic:0025| Your logging message
你可以通过如下的方式导入一个客户端测试用例的helper模块:
from autotest_lib.client. import
可以通过查看框架提供的autotest库。
kernel_HdParmBasic
需要test.test,因此需要从client / bin
下导入test
模块。
看一下之前编写的最简单的测试用例,他的要求是:
运行hdparm -T 命令
from autotest_lib.client.bin import test, utils
根据时间顺序搜索输出信息
作为结果报告
import logging, re
如果你的测试用例管理被测机器的任何状态,那可能需要初始化和清理工作。在下面的例子中,子进程用来进行它的清理工作。
因此编写的run_once()方法如下:
import logging, re
from autotest_lib.client.bin import test, utils
class kernel_HdParmBasic(test.test):
"""
Measure disk performance: both disk (-t) and cache (-T).
"""
version = 1
def run_once(self):
if (utils.get_cpu_arch() == "arm"):
disk = '/dev/mmcblk0'
else:
disk = '/dev/sda'
logging.debug("Using device %s", disk)
result = utils.system_output('hdparm -T %s' % disk)
match = re.search('(\d+\.\d+) MB\/sec', result)
self.write_perf_keyval({'cache_throughput': match.groups()[0]})
result = utils.system_output('hdparm -t %s' % disk)
match = re.search('(\d+\.\d+) MB\/sec', result)
self.write_perf_keyval({'disk_throughput': match.groups()[0]})
注意:使用了write_perf_keyval
(性能关键值(performance keyvals
))这个方法代替了之前的日志记录语句(logging.debug)。
关键值(keyvals)将会写到客户端被测机器的/usr/local/autotest/results/default/kernel_HdParmBasic/results/keyval
文件中,并会在
服务器运行run_remote_tests
时在控制台打印出来。
---------------------------------------
kernel_HdParmBasic/kernel_HdParmBasic cache_throughput 4346.76
kernel_HdParmBasic/kernel_HdParmBasic disk_throughput 144.28
---------------------------------------