自动化测试是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。
自动化测试有助于突破效率瓶颈,降低人力成本与人为错误率,规避因为人的疲劳和惯性思维以及投机取巧导致的错误。可提升执行效率,以及应对高强度连轴转任务,搞定长时间的系统稳定性测试和高并发场景的压力测试。下面列举两种最常见的自动化测试应用:
⇨软件在环测试
在上一篇《GCKontrol之软件在环(SiL)仿真》文章中,我们了解到,SIL测试是指控制策略模型转换成的C代码编译之后的软件,如果我们的测试用例足够多,如果我们得到了和预期测试相同的结果,那就可以认为我们生成的C代码就和用于代码生成的模型是一致的。软件在环(SIL)测试的目的就是为了验证自动生成的代码和用于代码生成的模型中行为上是一致的。也就是说SIL测试是一种等效性测试。
嵌入式软件具有实时性、内存空间有限、I/O通道少,而且要求功耗低、高可靠性,对成本也比较敏感,和硬件关联性强等特点,因此嵌入式软件的测试与一般商用软件的测试有较大的区别。
嵌入式软件的集成测试,一般指与目标机硬件环境集成后或仿真环境集成后,需要做的硬件兼容性测试。在系统测试、配置项测试或确认测试三个阶段,会在目标机环境下执行,这和一般商用软件测试有较大差别。
由于嵌入式系统的实时性,其测试应充分考虑系统实时响应问题,其响应时间一般要求在毫秒级别。并且要对其进行负载测试,并满足实时性指标。
在对目标机进行测试时,需要对宿主机上编译通过的代码进行插桩处理。这样可以在目标机执行程序时,将插桩处理阶段预测好的数据返回到宿主机进行分析,该过程中,宿主机和目标机之间的数据传输也要统筹分析,以完成充分必要的嵌入式软件的集成测试
下面将详细介绍在GCKontrol是如何使用Python API来对模块以及示例工程进行自动化测试,并集成到Jenkins里展示报表结果。
当我们想要在GCKontrol中对某个模块进行自动化测试,以逆矩阵为例,需要如下几步:
第一步:为类及方法命名
对于每个模块来说,都需要独有的类及方法,如下图,类名使用[class TestApi_模块名]来命名,方法名使用[def test_block_模块名] 来命名。

图1 类及方法命名
第二步:保留必须用的方法
完成命名后,方法中一些原有的代码需要保留(必须用的)如:

图2 保留时间配置
其中,时间和步长可修改,单位为秒,类型只能为数字。
第三步:使用代码创建需要的模块
逆矩阵模块的测试用到了2个常量模块,2个矩阵模块以及4个逆矩阵模块。创建模块需要调用k.CreateBlock()方法,所以创建模块的代码为:

图3 创建常量模块

图4 创建矩阵模块

图5 创建逆矩阵模块
posX和posY为坐标参数,可省略。创建成功,如图:

图6 模型图
第四步:为模块赋值
逆矩阵需要连接矩阵模块,且需要在矩阵模块中,设置测试需要的值。使用创建出来的矩阵模块matrix1调用SetParameter()参数来赋值(如下方式,赋值后为方阵)。

图7 赋值过程

图8 赋值成功
第五步:编写与测试用例逻辑相匹配的脚本
需要的模块创建完成后,需要根据测试用例编写python脚本,以便于覆盖测试用例,达到减少手动回归测试用例的目的。以逆矩阵的模块为例,列举几条已存在的测试用例:
● 修改模块名称
为模块设置正确的名称,使用创建出来的模块InvMatrix1调用SetParameter()方法,如图:

图9 修改模块名称
为模块设置错误的不可输入的名称:

图10 设置错误配置
对于一些人为制造的异常或错误(比如输入错误名称)需要在CheckApiMethod.IsExecuteApiError()方法中写入,此方**自动捕获一些异常或错误提示,使程序不报错。
● 连线/删除连线
使用k.CreateLine()方法将模块间进行连线:

图11 连线
使用k.DeleteLine()方法可将模块间连线进行删除:

图12 删除连线
获取连线信息的方式,可使用模块.Help()函数,此函数可以显示所有模块的相关信息,且包含xml文件中的内容。

图13 模块帮助信息
● 名词解释
参数列表:该模块可调用的参数以及参数类型,如改名,需要先传name,再传想要改的名字,名字需要为string类型。
输入输出列表:用于模块间的连线,如想要连接逆矩阵模块的输入,需要连[模块名.in],输出需要连[模块名.out]。
第六步:仿真及结果校验
● 启动仿真
直接调用k.SimulationStart()方法启动仿真,用于仿真时无异常的情况;

图14 启动仿真
当存在已知或人为的异常时,使用此方法程序会报错。如:不存在逆矩阵时,仿真提示“工程存在错误,仿真无法进行”。

图15 错误仿真
运行脚本后界面上的提示:

图16 GCKontrol工程输出
此时同样需要CheckApiMethod.IsExecuteApiError()来忽略异常,以便程序正常执行,如下图提示测试通过(passed):

图17 测试通过
● 结果校验
使用断言来验证仿真结果正确性,调用CheckApiMethod.FloatEqual()方法,通过参数将预期结果值、模块名、模块导出数据时的字段名,仿真时间(第N秒时)传入,程序会自动比对结果。下图为:断言InvMatrix3模块,在仿真第0秒时的数据为-1.333333333。

图18 预期结果

图19 将实际结果导入CSV
在GCKontrol中同样支持对示例工程的自动化测试,具体步骤如下:
第一步:创建测试工程方法
在test_demo_project文件末尾,添加新的示例工程,或自定义工程。

图20 添加工程信息
第二步:配置路径及文件名
将.gck文件所在路径替换成自己本机路径,替换仿真后的结果文件名,需要与导出的csv文件同名,如图:

图21 配置路径及文件名

图22 替换路径
第三步:配置参数
在Edit Configurations中添加4个参数(或在Run中进入添加),空格分隔,如:-exe "C:\GC\GCAir6.3\GCKontrol\GCKontrol.exe" -lib "F:/workspace/"

图23 替换路径
第四步:配置结果比对
对要添加的工程进行仿真,并导出csv,添加前缀【rightResult_】(可导出全部/部分变量)。

图24 配置结果文件
将导出的csv文件放到工程中,以便与脚本的仿真结果进行比对,如图:

图25 结果文件放入工程
第五步:运行脚本
运行脚本时,可以选择所有用例批量运行,也可以选择运行部分用例,在这里我们都是使用pycharm运行。
在进行所有用例批量运行时,直接运行main文件批量运行用例;
在进行部分用例运行时,根据模块名::类名::方法名运行部分用例(如:只运行自定义工程)。
在test_demo_project.py文件上右键—>Copy Path(选择拷贝完整路径),如图:

图26 拷贝路径
使用该路径::类名::要执行的方法名,替换main.py文件中的arguments["test"],再点击运行即可。

图27 运行用例
持续集成是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。目标是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。持续集成可以让一个自动化过程监测一个或多个源代码仓库是否有变更。当变更被推送到仓库时,它会监测到更改、下载副本、构建并运行任何相关的单元测试。
Jenkins工具是JAVA编写的开源工具,无论是扩展性,还是实用性,都非常好,很多中小型公司都是用Jenkins进行持续集成,一些大型公司也是在Jenkins的基础上进行的二次开发。
对于GCKontrol中的多个模块以及示例工程,我们同样适用基于Jenkins的持续集成,搭建Jenkins容器,结合Pytest自动化执行生成报表。在Jenkins上进行自动化测试的构建任务,有如下几个选项需要配置:
● General
配置GCKontrol自动化测试的项目名称、描述。
● 源码管理
从git上下载最新的GCKontrol和自动化测试脚本。
● 构建触发器
触发远程构建,该选项会提供一个接口,可以用来在代码层面触发构建。设置日程表,每天按时编译一次GCKontrol。
● 构建环境
将GCkontrol的运行时环境和发布版部署的尽可能一致。
● 构建
执行自动化脚本,配置如下图:

图28 构建
● 构建后操作
将保存的自动化测试结果图表,显示到Jenkins浏览器上。

图29 报表信息
配置如上内容后,可以在Jenkins首页查看往日的测试报表概览。

图30 Jenkins首页
在Test Results Analyzer里也可以查看每天的测试情况,如下图:

图31 Test Results Analyzer
总结
经过以上的操作,我们可以看到GCKontrol与Python API结合使用,可以有效地对模型以及算法进行自动化测试,极大地提高了测试效率。