百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

GCKontrol PythonAPI自动化测试应用案例

toyiye 2024-08-10 21:32 18 浏览 0 评论

本文来自于世冠科技,是国产系统仿真软件领域的领军者,数字孪生核心技术供应商,智能制造关键技术供应商。世冠科技率先在国内开展数字孪生技术研究,打造了支持数字孪生技术的MBSE国产工业软件——建模、仿真、测试一体化仿真平台GCAir,可应用于产品从设计研发到运行维护的全生命周期,能够在同一平台上完成架构设计、功能设计、性能设计、虚拟试验、虚拟运行,支持通过体系任务仿真论证装备设计需求,实现了产品设计到产品运维的全过程数字化,为工业用户提供开放、自主、可控的MBSE工具支撑,促进了数字化与工业研制流程的融合。世冠科技自主研发的另一标杆软件:系统设计与仿真软件GCKontrol,对标MATLAB,实现基于模型的设计(MBD)的系统建模与仿真,并可从模型生成高质量的C代码。

一、自动化测试的介绍与优势

自动化测试是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件。自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。

自动化测试有助于突破效率瓶颈,降低人力成本与人为错误率,规避因为人的疲劳和惯性思维以及投机取巧导致的错误。可提升执行效率,以及应对高强度连轴转任务,搞定长时间的系统稳定性测试和高并发场景的压力测试。下面列举两种最常见的自动化测试应用:

?软件在环测试

在上一篇《GCKontrol之软件在环(SiL)仿真》文章中,我们了解到,SIL测试是指控制策略模型转换成的C代码编译之后的软件,如果我们的测试用例足够多,如果我们得到了和预期测试相同的结果,那就可以认为我们生成的C代码就和用于代码生成的模型是一致的。软件在环(SIL)测试的目的就是为了验证自动生成的代码和用于代码生成的模型中行为上是一致的。也就是说SIL测试是一种等效性测试。

?嵌入式控制算法测试

嵌入式软件具有实时性、内存空间有限、I/O通道少,而且要求功耗低、高可靠性,对成本也比较敏感,和硬件关联性强等特点,因此嵌入式软件的测试与一般商用软件的测试有较大的区别。

嵌入式软件的集成测试,一般指与目标机硬件环境集成后或仿真环境集成后,需要做的硬件兼容性测试。在系统测试、配置项测试或确认测试三个阶段,会在目标机环境下执行,这和一般商用软件测试有较大差别。

由于嵌入式系统的实时性,其测试应充分考虑系统实时响应问题,其响应时间一般要求在毫秒级别。并且要对其进行负载测试,并满足实时性指标。

在对目标机进行测试时,需要对宿主机上编译通过的代码进行插桩处理。这样可以在目标机执行程序时,将插桩处理阶段预测好的数据返回到宿主机进行分析,该过程中,宿主机和目标机之间的数据传输也要统筹分析,以完成充分必要的嵌入式软件的集成测试

下面将详细介绍在GCKontrol是如何使用Python API来对模块以及示例工程进行自动化测试,并集成到Jenkins里展示报表结果。

二、模块测试

当我们想要在GCKontrol中对某个模块进行自动化测试,以逆矩阵为例,需要如下几步:

第一步:为类及方法命名

对于每个模块来说,都需要独有的类及方法,如下图,类名使用[class TestApi_模块名]来命名,方法名使用[def test_block_模块名] 来命名。

第二步:保留必须用的方法

完成命名后,方法中一些原有的代码需要保留(必须用的)如:

其中,时间和步长可修改,单位为秒,类型只能为数字。

第三步:使用代码创建需要的模块

逆矩阵模块的测试用到了2个常量模块,2个矩阵模块以及4个逆矩阵模块。创建模块需要调用k.CreateBlock()方法,所以创建模块的代码为:

posX和posY为坐标参数,可省略。创建成功,如图:

第四步:为模块赋值

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

第五步:编写与测试用例逻辑相匹配的脚本

需要的模块创建完成后,需要根据测试用例编写python脚本,以便于覆盖测试用例,达到减少手动回归测试用例的目的。以逆矩阵的模块为例,列举几条已存在的测试用例:

● 修改模块名称

为模块设置正确的名称,使用创建出来的模块InvMatrix1调用SetParameter()方法,如图:

为模块设置错误的不可输入的名称:

对于一些人为制造的异常或错误(比如输入错误名称)需要在CheckApiMethod.IsExecuteApiError()方法中写入,此方法会自动捕获一些异常或错误提示,使程序不报错。

● 连线/删除连线

使用k.CreateLine()方法将模块间进行连线:

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

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

● 名词解释

参数列表:该模块可调用的参数以及参数类型,如改名,需要先传name,再传想要改的名字,名字需要为string类型。

输入输出列表:用于模块间的连线,如想要连接逆矩阵模块的输入,需要连[模块名.in],输出需要连[模块名.out]。

第六步:仿真及结果校验

● 启动仿真

直接调用k.SimulationStart()方法启动仿真,用于仿真时无异常的情况;

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

运行脚本后界面上的提示:

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

● 结果校验

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

三、示例工程测试

在GCKontrol中同样支持对示例工程的自动化测试,具体步骤如下:

第一步:创建测试工程方法

在test_demo_project文件末尾,添加新的示例工程,或自定义工程。

第二步:配置路径及文件名

将.gck文件所在路径替换成自己本机路径,替换仿真后的结果文件名,需要与导出的csv文件同名,如图:

第三步:配置参数

在Edit Configurations中添加4个参数(或在Run中进入添加),空格分隔,如:-exe "C:GCGCAir6.3GCKontrolGCKontrol.exe" -lib "F:/workspace/"

第四步:配置结果比对

对要添加的工程进行仿真,并导出csv,添加前缀【rightResult_】(可导出全部/部分变量)。

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

第五步:运行脚本

运行脚本时,可以选择所有用例批量运行,也可以选择运行部分用例,在这里我们都是使用pycharm运行。

在进行所有用例批量运行时,直接运行main文件批量运行用例;

在进行部分用例运行时,根据模块名::类名::方法名运行部分用例(如:只运行自定义工程)。

在test_demo_project.py文件上右键—>Copy Path(选择拷贝完整路径),如图:

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

四、基于Jenkins的持续集成

持续集成是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程。目标是快速确保开发人员新提交的变更是好的,并且适合在代码库中进一步使用。持续集成可以让一个自动化过程监测一个或多个源代码仓库是否有变更。当变更被推送到仓库时,它会监测到更改、下载副本、构建并运行任何相关的单元测试。

Jenkins工具是JAVA编写的开源工具,无论是扩展性,还是实用性,都非常好,很多中小型公司都是用Jenkins进行持续集成,一些大型公司也是在Jenkins的基础上进行的二次开发。

对于GCKontrol中的多个模块以及示例工程,我们同样适用基于Jenkins的持续集成,搭建Jenkins容器,结合Pytest自动化执行生成报表。在Jenkins上进行自动化测试的构建任务,有如下几个选项需要配置:

● General

配置GCKontrol自动化测试的项目名称、描述。

● 源码管理

从git上下载最新的GCKontrol和自动化测试脚本。

● 构建触发器

触发远程构建,该选项会提供一个接口,可以用来在代码层面触发构建。设置日程表,每天按时编译一次GCKontrol。

● 构建环境

将GCkontrol的运行时环境和发布版部署的尽可能一致。

● 构建

执行自动化脚本,配置如下图:

● 构建后操作

将保存的自动化测试结果图表,显示到Jenkins浏览器上。

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

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

总结

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

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码