要将新测试添加到Fuego
,您需要执行以下步骤:
test_specs
(如果有)parser.py
以及标准和参考文件创建测试的第一步是确定测试名称。Fuego
支持两种类型的测试:功能测试和基准测试。功能测试通过或失败,而基准测试则产生一个或多个代表系统性能测量的数字。
通常,测试的名称将是测试类型和标识测试本身的名称的组合。以下是一些示例:bonnie
是流行的磁盘性能测试。在fuego
系统中此测试的名称为Benchmark.bonnie
。运行posix
测试套件的一部分的测试是功能测试(通过或失败),在Fuego
中被称为Functional.posixtestsuite
。测试名称应为一个字(不能有空格)。
该名称用作测试材料在Fuego
系统中的目录名称。
主测试目录位于/fuego-core/engine/tests/
因此,如果您刚刚创建了一个名为foo
的新功能测试,则将创建目录:
/fuego-core/engine/tests/Functional.foo
测试程序本身的实际创建超出了Fuego
的范围。Fuego
旨在执行现有的测试程序,该程序已经存在源代码或脚本。
本页介绍如何将此类测试程序集成到Fuego
测试系统中。
Fuego
中的测试程序以源代码形式提供,因此可以针对被测试目标使用的任何处理器体系结构进行编译。此源可以是tarfile
的形式,也可以是对git
存储库的引用以及一个或多个补丁的形式。
通过手动下载测试源并创建tarfile
,为测试创建tarfile
。或者,请注意测试源的git
存储库参考。
tarball
源如果您以tarfile
的形式使用source
,则将tarfile
的名称(称为tarball
)添加到测试脚本中。
压缩文件可以被压缩。支持的压缩方案及其关联的扩展为:
'.tar'
)'.tar.gz'
或'.tgz'
)'.bz2'
)tarfile 'foo-1.2.tgz'
中,则应在测试脚本中添加以下行,以引用此源: tarball=foo-1.2.tgz
git
源如果您使用在线git
存储库中的源代码,则可以通过在测试脚本中添加变量gitrepo
和gitref
来引用此源代码。
在这种情况下,gitrepo
是用于访问源的URL
,gitref
是指提交代码(特定的版本)的提交ID(哈希,标记,版本等)。
例如,如果您的测试程序是从在线foo
存储库中的源代码构建的,而您想使用该版本的1.2版(在存储库中的master
分支上标记为v1.2),则您可能拥有测试脚本中的某些如下所示行。
gitrepo=http://github.com/sampleuser/foo.git
gitref=master/v1.2
一些测试非常简单,可以作为单个脚本(在板上运行)实现。对于这些测试,不需要其他源,脚本可以直接放置在测试的主目录中。在部署阶段,脚本直接从测试主目录而不是从测试构建目录发送到开发板。
测试脚本是一个小的脚本,编写了shell
脚本语言并称为fuego_test.sh
。它指定了包含测试程序的源tarfile
,并提供了构建,部署,执行和评估测试程序结果所需功能的实现。
功能测试的测试脚本应包含以下内容:
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
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.py
的python
程序,该程序扫描测试日志并生成Fuego
系统其他部分使用的数据结构。
有关此程序的信息, 请参见parser.py。
您还应该向Fuego
提供信息,以指示如何评估测试的最终分辨率。
对于功能测试,通常只有在测试中所有单个测试用例通过的情况下,整个测试才通过。即,一个测试用例中的一个错误表示整体测试失败。但是,对于基准测试,结果评估更为复杂。需要指定哪些数字构成测试的成功与失败。
另外,对于非常复杂的功能测试,可能会有复杂的结果,例如,某些结果应忽略。
您可以通过为测试创建一个“ criteria.json ”文件来指定用于评估测试结果的标准。
最后,您可能希望添加一个文件,该文件指示有关测试结果的某些信息。此信息放置在“ reference.json ”文件中以进行测试。
请查看这些文件的链接,以进一步了解它们是什么以及如何编写它们,并为您的系统自定义它们。
Jenkins
工作定义文件创建测试的最后一步是为其创建Jenkins
作业。
一个Jenkins
工作向Jenkins
描述了要在哪个板上运行测试,要传递给测试的变量(包括测试规范(或变体))以及要运行的测试脚本。
Jenkins
作业是使用命令行工具ftc
创建的。
Jenkin
工作名为
您可以使用以下命令创建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/
目录中创建一个名为config.xml
的文件。
普遍感兴趣的测试应提交以包含在fuego-core
中。
现在,执行此操作的方法是创建一个提交并将该提交发送到fuego
邮件列表,以进行审查,并希望由fuego
维护者接受和集成。
将来,将提供一台服务器,供测试开发人员共享在“测试市场”中创建的测试。测试可用于浏览和下载,其他开发人员的结果可与您自己的结果进行比较。对于使用ftc package-test
功能打包测试,已经有了初步的支持。将来将提供有关此服务的更多信息。
本节包含有关测试的技术详细信息。
Fuego
使用的目录结构记录在Fuego目录中
一个测试包含以下文件或项目:
文件或项目 | 格式 | 位置 | 说明 | 测试类型 |
---|---|---|---|---|
config.xml | Jenkins 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.log | Fuego-specific | /fuego-core/engine/tests/{test_name} | 具有测试所测量的基准指标的阈值和比较运算符 | 所有 |
(已弃用)P/N日志 | 文本 | /fuego-core/engine/tests/{test_name} | 是否解析了带有结果(正数或负数)的日志,以确定测试通过/失败 | 所有 |