Chromium OS Autotest 客户端测试

Chromium OS Autotest 客户端测试(Client side test)


概述


背景

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的客户端测试用例
    • 对应到被测设备(DUT)上的目录是/usr/local/autotest/tests

先决条件

  • chroot环境
  • python知识

在客户端运行一个测试用例

当你有了Autotest后你将有两种方法运行测试用例,要么用你的chroot环境作为server要么直接在被测机器上直接运行。直接在被测机器
上运行的速度会更快,但至少需要先从服务器运行一次。

在chroot环境下使用test_that

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被测机器(DUT)上

在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*是运行时的一些消息输出。

编写一个Autotest

我们编写的测试目标是:

  • 运行hdparm -T 命令
  • 根据时间顺序搜索输出信息
  • 作为结果报告

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')

Emerge并运行

  • 在autotest-tests 的ebuild 中的IUSE_TESTS 变量增加+tests_kernel_HdParmBasic
#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./test_name/test_name/debug目录下,如:

  /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

导入helpers模块

你可以通过如下的方式导入一个客户端测试用例的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, cleanup 和 initialize

如果你的测试用例管理被测机器的任何状态,那可能需要初始化和清理工作。在下面的例子中,子进程用来进行它的清理工作。
因此编写的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
  ---------------------------------------

你可能感兴趣的:(chromiun,os,autotest)