嵌入式自动化测试框架Fuego:添加新测试

禹昊穹
2023-12-01

步骤概述

要将新测试添加到Fuego,您需要执行以下步骤:

  1. 确定测试名称和类型
  2. 制作测试目录
  3. 获取测试的源(或二进制)
  4. 编写测试脚本
  5. 添加测试的test_specs(如果有)
  6. 将日志处理添加到测试中
  7. (如果是基准测试)添加parser.py以及标准和参考文件
  8. 为测试创建Jenkins测试配置

确定测试名称

创建测试的第一步是确定测试名称。Fuego支持两种类型的测试:功能测试和基准测试。功能测试通过或失败,而基准测试则产生一个或多个代表系统性能测量的数字。
通常,测试的名称将是测试类型和标识测试本身的名称的组合。以下是一些示例:bonnie是流行的磁盘性能测试。在fuego系统中此测试的名称为Benchmark.bonnie。运行posix测试套件的一部分的测试是功能测试(通过或失败),在Fuego中被称为Functional.posixtestsuite。测试名称应为一个字(不能有空格)。

该名称用作测试材料在Fuego系统中的目录名称。

创建测试目录

主测试目录位于/fuego-core/engine/tests/<test_name>
因此,如果您刚刚创建了一个名为foo的新功能测试,则将创建目录:

/fuego-core/engine/tests/Functional.foo

获取测试源

测试程序本身的实际创建超出了Fuego的范围。Fuego旨在执行现有的测试程序,该程序已经存在源代码或脚本。
本页介绍如何将此类测试程序集成到Fuego测试系统中。

Fuego中的测试程序以源代码形式提供,因此可以针对被测试目标使用的任何处理器体系结构进行编译。此源可以是tarfile的形式,也可以是对git存储库的引用以及一个或多个补丁的形式。

通过手动下载测试源并创建tarfile,为测试创建tarfile。或者,请注意测试源的git存储库参考。

tarball

如果您以tarfile的形式使用source,则将tarfile的名称(称为tarball)添加到测试脚本中。
压缩文件可以被压缩。支持的压缩方案及其关联的扩展为:

  • 未压缩(扩展名='.tar'
  • 用gzip压缩(扩展名='.tar.gz''.tgz'
  • 用bzip2压缩(扩展名='.bz2'
    例如,如果测试源位于tarfile 'foo-1.2.tgz'中,则应在测试脚本中添加以下行,以引用此源:
 tarball=foo-1.2.tgz

git

如果您使用在线git存储库中的源代码,则可以通过在测试脚本中添加变量gitrepogitref来引用此源代码。
在这种情况下,gitrepo是用于访问源的URLgitref是指提交代码(特定的版本)的提交ID(哈希,标记,版本等)。

例如,如果您的测试程序是从在线foo存储库中的源代码构建的,而您想使用该版本的1.2版(在存储库中的master分支上标记为v1.2),则您可能拥有测试脚本中的某些如下所示行。

  gitrepo=http://github.com/sampleuser/foo.git
  gitref=master/v1.2

基于脚本的源

一些测试非常简单,可以作为单个脚本(在板上运行)实现。对于这些测试,不需要其他源,脚本可以直接放置在测试的主目录中。在部署阶段,脚本直接从测试主目录而不是从测试构建目录发送到开发板。

测试脚本

测试脚本是一个小的脚本,编写了shell脚本语言并称为fuego_test.sh。它指定了包含测试程序的源tarfile,并提供了构建,部署,执行和评估测试程序结果所需功能的实现。
功能测试的测试脚本应包含以下内容:

  • 来源参考(tarball或gitrepo和gitref)
  • 函数test_pre_check(可选)
  • 函数test_build
  • 函数test_deploy
  • 函数test_run
  • 函数test_processing
    test_pre_check函数是可选的,用于检查测试环境以及目标配置和设置是否正确,以便运行测试。

示例测试脚本

这是fuego_test.sh测试Functional.hello_world 的脚本。该脚本演示了测试脚本的许多核心元素。

#!/bin/bash

tarball=hello-test-1.0.tgz

function test_build {
    make
}

function test_deploy {
    put hello  $BOARD_TESTDIR/fuego.$TESTDIR/
}

function test_run {
    report "cd $BOARD_TESTDIR/fuego.$TESTDIR; ./hello $FUNCTIONAL_HELLO_WORLD_ARG"
}

function test_processing {
    log_compare "$TESTDIR" "1" "SUCCESS" "p"
}

基本测试功能的说明

基本测试功能(test_build,test_deploy,test_run和test_processing)非常简单。每个语句包含一些语句以完成测试执行的这一阶段。
您可以在以下链接中找到有关这些功能的更多信息:

测试规范和计划

每个测试的另一个要素是“测试规范”。文件用于定义一组参数,这些参数用于为特定用例定制测试。
您必须为此测试定义测试规范,并将其添加到适当的测试计划中。

系统中的每个测试都必须具有一个测试规范文件。该文件用于列出测试的可自定义变量。

如果测试程序没有可自定义的变量,或者不需要任何变量,那么至少必须定义一个“默认”测试规范,并且没有测试变量。

测试规格文件为:

  • 在测试目录中名为spec.json
  • JSON格式
  • 提供一个testName属性,以及一个specs属性,它是一个列表
  • 可以包含您想要的任何命名规范,但必须至少定义测试的“默认”规范
    • 请注意,如果需要,“默认”规范可以为空。

这是一个没有定义变量的示例。

{
    "testName": "Benchmark.OpenSSL",
    "specs": {
        "default": {}
    }
}

这是Functional.hello_world示例的spec.json,它定义了三个规范:

{
    "testName": "Functional.hello_world",
    "specs": {
        "hello-fail": {
            "ARG":"-f"
        },
        "hello-random": {
            "ARG":"-r"
        },
        "default": {
            "ARG":""
        }
    }
}

接下来,您可能需要向一个testplan文件中添加一个条目。这些文件位于目录/fuego-core/engine/overlays/testplans

选择您想要包括此测试的测试计划,然后编辑相应的文件。例如,要将您的测试添加到使用“默认”测试计划时执行的测试列表中,请在testplan_default.json文件中添加一个default条目。

请注意,如果不是“测试”列表中的最后一个逗号,则应在输入后添加逗号。

请阅读测试规格和计划以获取更多详细信息。

测试结果解析器

每个测试还应该提供某种机制来解析测试程序的结果,并确定测试是否成功。
对于简单的功能测试,您可以使用log_compare函数来指定要在测试日志中搜索的模式,以及应该找到该模式的次数以指示测试成功。这是通过测试脚本中的test_processing函数完成的 。

这是对log_compare的调用示例:

function test_processing {
    log_compare "$TESTDIR" "11" "^TEST.*OK" "p"
}

本示例查找模式^TEST.*OK,该模式在测试日志中找到以单词TEST开头并在同一行后跟字符串OK的行。查找此模式11次。
log_compare可用于解析具有面向行输出的简单测试的日志。

对于具有更复杂输出的测试以及对于生成数值结果的基准测试,您必须添加一个名为parser.pypython程序,该程序扫描测试日志并生成Fuego系统其他部分使用的数据结构。

有关此程序的信息, 请参见parser.py

提供条件和参考信息

您还应该向Fuego提供信息,以指示如何评估测试的最终分辨率。
对于功能测试,通常只有在测试中所有单个测试用例通过的情况下,整个测试才通过。即,一个测试用例中的一个错误表示整体测试失败。但是,对于基准测试,结果评估更为复杂。需要指定哪些数字构成测试的成功与失败。

另外,对于非常复杂的功能测试,可能会有复杂的结果,例如,某些结果应忽略。

您可以通过为测试创建一个“ criteria.json ”文件来指定用于评估测试结果的标准。

最后,您可能希望添加一个文件,该文件指示有关测试结果的某些信息。此信息放置在“ reference.json ”文件中以进行测试。

请查看这些文件的链接,以进一步了解它们是什么以及如何编写它们,并为您的系统自定义它们。

Jenkins工作定义文件

创建测试的最后一步是为其创建Jenkins作业。
一个Jenkins工作向Jenkins描述了要在哪个板上运行测试,要传递给测试的变量(包括测试规范(或变体))以及要运行的测试脚本。

Jenkins作业是使用命令行工具ftc创建的。

Jenkin工作名为 <node_name>.<spec>.<test_type>.<test_name>

您可以使用以下命令创建Jenkins作业:

$ ftc add-jobs -b myboard -t Functional.mytest [-s default]

ftc add-jobs子命令使用“ -b”指定板,“-t”指定测试,并使用“ -s”指定将用于此Jenkins作业的测试规范。

在这种情况下,将创建的Jenkins作业的名称为:

myboard.default.Functional.mytest

这将在 /var/lib/jenkins/jobs/<job_name>目录中创建一个名为config.xml的文件。

发布测试

普遍感兴趣的测试应提交以包含在fuego-core中。
现在,执行此操作的方法是创建一个提交并将该提交发送到fuego邮件列表,以进行审查,并希望由fuego维护者接受和集成。

将来,将提供一台服务器,供测试开发人员共享在“测试市场”中创建的测试。测试可用于浏览和下载,其他开发人员的结果可与您自己的结果进行比较。对于使用ftc package-test功能打包测试,已经有了初步的支持。将来将提供有关此服务的更多信息。

技术细节

本节包含有关测试的技术详细信息。

目录结构

Fuego使用的目录结构记录在Fuego目录中

文件

一个测试包含以下文件或项目:

文件或项目格式位置说明测试类型
config.xmlJenkins XML/var/lib/jenkins/jobs/{test_name}具有测试的Jenkins(前端)配置所有
压缩文件tar格式/fuego-core/engine/tests/{test_name}拥有测试程序的源代码所有
补丁补丁格式/fuego-core/engine/tests/{test_name}零个或多个补丁来自定义测试程序(在解压缩阶段应用所有
基本脚本外壳脚本/fuego-core/engine/tests/{test_name}/fuego_test.sh是在Fuego中实现不同测试阶段的Shell脚本所有
测试规格JSON格式/fuego-core/engine/tests/{test_name}/spec.json具有可用于此测试的变量组(及其值)所有
测试计划JSON格式/fuego-core/engine/overlays/testplans拥有整个系统的测试计划所有
解析器python/fuego-core/engine/tests/{test_name}Python程序可以从日志中解析出基准指标,并为Fuego绘图仪提供字典所有
通过标准JSON格式/fuego-core/engine/tests/{test_name}/criteria.json具有测试的“通过”标准所有
参考信息JSON格式/fuego-core/engine/tests/{test_name}/reference.json具有有关测试结果的其他信息,例如基准测量的单位所有
(不建议使用)reference.logFuego-specific/fuego-core/engine/tests/{test_name}具有测试所测量的基准指标的阈值和比较运算符所有
(已弃用)P/N日志文本/fuego-core/engine/tests/{test_name}是否解析了带有结果(正数或负数)的日志,以确定测试通过/失败所有
 类似资料: