公开/公告号CN106095668A
专利类型发明专利
公开/公告日2016-11-09
原文格式PDF
申请/专利权人 上海科梁信息工程股份有限公司;
申请/专利号CN201610389850.4
申请日2016-06-02
分类号G06F11/36;
代理机构上海晨皓知识产权代理事务所(普通合伙);
代理人成丽杰
地址 200233 上海市徐汇区宜山路829号6幢201室
入库时间 2023-06-19 00:49:26
法律状态公告日
法律状态信息
法律状态
2018-12-11
授权
授权
2016-12-07
实质审查的生效 IPC(主分类):G06F11/36 申请日:20160602
实质审查的生效
2016-11-09
公开
公开
技术领域
本发明涉及嵌入式软件测试技术领域,特别涉及一种基于事件和动作的C++测试用例的生成方法。
背景技术
在汽车、军工、航空、航天等嵌入式软件测试中,传统上测试用例的编写语言一般是脚本语言。脚本语言编写的测试用例,在测试时,边执行边解释,运行慢,效率低,实时性差。
目前嵌入式测试领域对实时性要求越来越苛刻,利用脚本语言编写的测试用例已经不能满足测试系统的实时性要求。采用接近底层的语言来设计测试用例,可以提高测试系统的实时性。但是,需要人工用接近底层的语言来重新编写测试用例,工作量大,效率低,延长了测试代码的开发时间。
发明内容
本发明的目的在于提供一种基于事件和动作的C++测试用例的生成方法,减少了开发测试代码的工作量,缩短了开发测试代码的时间,有助于提高测试的效率,还有助于提高测试的实时性。
为解决上述技术问题,本发明的实施方式提供了一种基于事件和动作的C++测试用例的生成方法,包括:
根据事件和动作创建测试流程;
构建第一虚函数与第二虚函数;其中,所述第一虚函数为C++语言编写的第一基类的虚函数;所述第一基类为所述事件的基类;所述第二虚函数为C++语言编写的第二基类的虚函数,所述第二基类为所述动作的基类;
根据所述测试流程、所述第一虚函数与所述第二虚函数分别自动生成基于所述事件和所述动作的C++测试用例;其中,所述C++测试用例为C++语言编写的测试代码,所述C++测试用例中包含头文件与源文件;所述头文件为采用C++语言编写的用于声明所述事件与所述动作的文件;所述源文件为采用C++语言编写的用于实现所述事件与所述动作的文件。
本发明的实施方式还提供了一种基于事件和动作的C++测试用例的生成方法,包括:
根据事件和动作创建测试流程;
构建第一虚函数、第二虚函数、第三虚函数与第四虚函数;其中,所述第一虚函数为C++语言编写的第一基类的虚函数;所述第一基类为所述事件的基类;所述第二虚函数为C++语言编写的第二基类的虚函数,所述第二基类为所述动作的基类;所述第三虚函数为C++语言编写的第一基类的虚函数;所述第四虚函数为C++语言编写的第二基类的虚函数;所述第一虚函数与所述第三虚函数的函数名不同、参数相同、返回值类型相同;所述第二虚函数与所述第四虚函数的函数名不同、参数相同、返回值类型相同;
根据所述测试流程、所述第一虚函数与所述第二虚函数分别自动生成基于所述事件和所述动作的C++测试用例中的头文件,根据所述测试流程、所述第三虚函数与所述第四虚函数分别自动生成基于所述事件和所述动作的C++测试用例中的源文件;
其中,所述C++测试用例为C++语言编写的测试代码,所述头文件为采用C++语言编写的用于声明所述事件与所述动作的文件;所述源文件为采用C++语言编写的用于实现所述事件与所述动作的文件。
本发明实施方式相对于现有技术而言,将测试用例中的每一个事件和动作都分别视为一个类,事件和动作各有一个基类,每一个具体的事件和动作类型都分别继承此动作基类和事件基类,每个动作基类和事件基类分别对应有C++语言编写的虚函数,在该虚函数中,可以用于自动生成基于事件和动作的C++测试用例。本发明实施方式实现自动生成C++测试用例,无需人工用接近底层的语言来重新编写测试用例,减少了开发测试代码的工作量,缩短了开发测试代码的时间;而且,相对于使用脚本语言编写测试用例,本发明实施方式使用C++语言,无需边执行边解释,可以提高测试用例的运行速度;另外,C++语言是接近底层的语言,用于设计测试用例,有助于提高测试的实时性。综上所述,本发明实施方式减少了开发测试代码的工作量,缩短了开发测试代码的时间,有助于提高测试的效率,还有助于提高测试的实时性。
所述事件包含第一事件;所述第一事件为第一子类;所述第一子类继承所述第一基类;所述第一子类包括第一函数;其中,所述第一函数与所述第一虚函数的函数名称、参数、返回值类型分别相同;在所述自动生成基于所述事件和所述动作的C++测试用例中,具体包括:在指向所述第一子类的第一基类指针或者指向所述第一子类的第一基类引用调用所述第一虚函数时,自动调用所述第一函数。这样便于自动调用各个子类的与基类虚函数具有相同名称、相同参数、相同返回值的函数,能够很好地解决头文件和源文件之间的一一对应关系。
所述C++测试用例中包含至少所述第五函数与第六函数;所述第五函数与所述第六函数用于生成信号值;所述第五函数与所述第六函数的名称均包含前缀与后缀;所述第五函数的名称的前缀与所述第六函数的名称的前缀相同,所述第五函数的名称的后缀与所述第六函数的名称的后缀不同。这样,前缀相同可以方便函数的自动获取与调用,后缀不同可以进行排重处理,避免编译时出现重复错误。
另外,若在编译所述C++测试用例的计算机上的Windows系统下采用VC编译器、MicrosoftSDKs与WinDDK,且编译所述C++测试用例的应用软件是Release版本,则对所述VC编译器、MicrosoftSDKs与WinDDK进行剪裁,剪裁掉Debug库文件,仅保留Release库文件。这样,可以去掉不必要的文件、减小安装包的大小,提高运行速度。
附图说明
图1是根据本发明第一实施方式的基于事件和动作的C++测试用例的生成方法流程图;
图2是根据本发明第四实施方式的基于事件和动作的C++测试用例的生成方法流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明的各实施方式进行详细的阐述。然而,本领域的普通技术人员可以理解,在本发明各实施方式中,为了使读者更好地理解本申请而提出了许多技术细节。但是,即使没有这些技术细节和基于以下各实施方式的种种变化和修改,也可以实现本申请各权利要求所要求保护的技术方案。
在本发明实施方式中,需要预先在上位机安装VC编译器,配置编译环境。
本发明的第一实施方式涉及一种基于事件和动作的C++测试用例的生成方法,具体流程如图1所示。
在步骤101中,根据事件和动作创建测试流程。具体的说,在本步骤中,是在图形化界面中创建基于事件和动作的测试流程。
在步骤102中,构建第一虚函数与第二虚函数。具体的说,本实施方式中测试用例中的每一个事件和动作都分别视为C++测试用例中的一个类,事件和动作各有一个基类,可以分别设为第一基类和第二基类。第一虚函数为C++语言编写的第一基类的虚函数。第二虚函数为C++语言编写的第二基类的虚函数。
本实施方式中的事件可以包含第一事件,且该第一事件为第一子类;第一子类继承第一基类;第一子类包括第一函数;其中,第一函数与第一虚函数的函数名称、参数、返回值类型分别相同。本实施方式中的动作可以包含第一动作,且该第一动作为第三子类;第三子类继承第二基类;第三子类包括第三函数;其中,第三函数与第二虚函数的函数名称、参数、返回值类型分别相同。
在步骤103中,根据测试流程、第一虚函数与第二虚函数自动生成C++测试用例。具体的说,根据测试流程、第一虚函数与第二虚函数自动生成基于事件和动作的C++测试用例;其中,C++测试用例为C++语言编写的测试代码,C++测试用例中包含头文件与源文件;头文件为采用C++语言编写的用于声明事件与动作的文件;源文件为采用C++语言编写的用于实现事件与动作的文件。在本步骤中,在指向第一子类的第一基类的指针或者指向第一子类的第一基类的引用调用第一虚函数时,自动调用第一函数。在指向第三子类的第二基类的指针或者指向第三子类的第二基类的引用调用第二虚函数时,自动调用第三函数。
由于测试系统中有很多不同类型的信号,因此在本实施方式中,C++测试用例中包含至少第五函数与第六函数,第五函数与第六函数用于生成信号值。第五函数与第六函数的名称均包含前缀与后缀,第五函数的名称的前缀与第六函数的名称的前缀相同,方便函数的自动获取与调用。第五函数的名称的后缀与第六函数的名称的后缀不同,可以进行排重处理,避免编译时出现重复错误。比如说,可以采用函数名称形如XXXd(XXX代表相同的前缀,d代表不同的后缀)的方法来完成信号值的自动获取及比较和函数的自动调用。
在本实施方式中,头文件和源文件是编译代码不可分割的两个部分,而且具有紧密的对应关系。头文件负责函数、类、结构体和枚举类型等的声明,而源文件负责函数的具体实现方法。因此,在实际应用中,自动生成程序代码时需要指定每一个变量的类型。
C++测试用例中采用一对大括弧“{}”界定程序代码中结构体、类以及函数的作用域,在自动生成基于事件和动作的C++测试用例中,先设置变量,该变量用于标记“{”与“}”的嵌套层次,以供在执行C++测试用例时,然后根据变量与“{”的嵌套层次,来确定对应的“}”的层次和位置。
需要说明的是,在本实施方式中,若在编译C++测试用例的计算机上的Windows系统下采用VC编译器、MicrosoftSDKs与WinDDK,且编译C++测试用例的应用软件是Release版本,则对VC编译器、MicrosoftSDKs与WinDDK进行剪裁,剪裁掉Debug库文件,仅保留Release库文件。具体的说,对于自动生成的程序代码(包含测试用例上下位机源代码和对应Makefile文件),上位机Windows系统下采用VC编译器(内含所需的VC库文件和MFC库文件)、MicrosoftSDKs、WinDDK,并对这三个部分进行有目的的裁剪(裁剪掉Debug库文件,只保留Release库文件,因为整个软件是Release版本,裁剪之后可以去掉不必要的文件、减小安装包的大小)Makefile文件负责组建编译环境和规则,调用VC编译器实现上位机程序代码的编译和链接。另外,为了解决VC编译器在Release版本编译时可能产生nafxcw.lib和unafxcw.lib库冲突的问题,在Makefile文件中的LFLAGS=后添加nafxcw.lib。调用VC的nmake之前将MAKEFLAGS环境变量置空,以排除此环境变量对编译链接的影响。下位机Redhat系统下采用自带的GCC编译器,由于编译环境已经具备,下位机Makefile文件只负责组建编译规则,调用GCC编译器实现下位机程序代码的编译和链接。
相对于现有技术而言,将测试用例中的每一个事件和动作都分别视为一个类,事件和动作各有一个基类,每一个具体的事件和动作类型都分别继承此动作基类和事件基类,每个事件基类和动作基类分别对应有C++语言编写的虚函数,在该虚函数中,可以用于自动生成基于事件和动作的C++测试用例。本发明实施方式实现自动生成C++测试用例,无需人工用接近底层的语言来重新编写测试用例,减少了开发测试代码的工作量,缩短了开发测试代码的时间;而且,相对于使用脚本语言编写测试用例,本发明实施方式使用C++语言,无需边执行边解释,可以提高测试用例的运行速度;另外,C++语言是接近底层的语言,用于设计测试用例,有助于提高测试的实时性。综上所述,本发明实施方式减少了开发测试代码的工作量,缩短了开发测试代码的时间,有助于提高测试的效率,还有助于提高测试的实时性。
本发明的第二实施方式涉及一种基于事件和动作的C++测试用例的生成方法。第二实施方式与第一实施方式大致相同,主要区别之处在于:第一实施方式中的事件可以包含第一事件。而在本发明第二实施方式中,事件还可以包含第二事件。
具体的说,本实施方式中的第二事件为第二子类;第二子类继承第一基类;第二子类包括第二函数;其中,第二函数与第一虚函数的函数名称、参数、返回值类型分别相同。在自动生成基于事件和动作的C++测试用例中,具体包括:在指向第二子类的第一基类的指针或者指向第二子类的第一基类的引用调用第一虚函数时,自动调用第二函数。
需要说明的是,本实施方式中的事件可以不止包括第二事件,还可以包括第三事件、第四事件等多个事件,比如说事件可以是:内部事件、外部事件、系统事件、同步事件等事件,每个具体的事件都为第一基类的子类,且每个事件对应一个函数,且每个事件对应的函数与第一虚函数的函数名称、参数、返回值类型分别相同,在调用函数时,可以采用分别指向每个事件的第一基类的指针也可以采用分别指向每个事件的第一基类的引用,自动调用每个事件对应的函数。
本实施方式在存在多个事件时,也可以使用C++语言自动生成测试用例,提高了测试的效率,使得本发明实施方式更实用。
本发明的第三实施方式涉及一种基于事件和动作的C++测试用例的生成方法。第三实施方式与第一实施方式大致相同,主要区别之处在于:在第一实施方式中的动作可以包含第一动作。而在本发明第三实施方式中的动作还可以包含第二动作。
具体的说,本实施方式中第二动作为第四子类,第四子类继承第二基类,且第四子类包括第四函数;其中,第四函数与第二虚函数的函数名称、参数、返回值类型分别相同。在自动生成基于事件和动作的C++测试用例中,具体包括:在指向第四子类的第二基类的指针或者指向第四子类的第二基类的引用调用第二虚函数时,自动调用第四函数。
需要说明的时,本实施方式中的动作可以不止包括第二动作,还可以包括第三动作、第四动作等多个动作,比如这些动作可以是:发送总线消息、比较期望值、动作延时、常用算法等动作,每个具体的动作都为第二基类的子类,且每个动作对应一个函数,且每个动作对应的函数与第二虚函数的函数名称、参数、返回值类型分别相同,在调用函数时,可以采用分别指向每个动作的第二基类的指针也可以采用分别指向每个动作的第二基类的引用,自动调用每个动作对应的函数。
本实施方式在存在多个动作时,也可以使用C++语言自动生成测试用例,提高了测试的效率,使得本发明实施方式更实用。
本发明的第四实施方式涉及一种基于事件和动作的C++测试用例的生成方法。本实施方式的流程如图2所示,具体如下:
在步骤201中,根据事件和动作创建测试流程。
在步骤202中,构建第一虚函数、第二虚函数、第三虚函数与第四虚函数。其中,第一虚函数为C++语言编写的第一基类的虚函数;第一基类为事件的基类;第二虚函数为C++语言编写的第二基类的虚函数,第二基类为动作的基类;第三虚函数为C++语言编写的第一基类的虚函数;第四虚函数为C++语言编写的第二基类的虚函数;第一虚函数与第三虚函数的函数名不同、参数相同、返回值类型相同;第二虚函数与第四虚函数的函数名不同、参数相同、返回值类型相同。
在步骤203中,根据测试流程、第一虚函数与第二虚函数自动生成基于事件和动作的C++测试用例中的头文件。具体的说,本实施方式中的C++测试用例为C++语言编写的测试代码,头文件为采用C++语言编写的用于声明事件与动作的文件。
在步骤204中,根据测试流程、第三虚函数与第四虚函数自动生成基于事件和动作的C++测试用例中的源文件。具体的说,本实施方式中的源文件为采用C++语言编写的用于实现事件与动作的文件。其中,步骤203与步骤204可以同时生成。
在本实施方式中,头文件在继承于第一虚函数、第二虚函数的函数中生成,源文件在继承于第三虚函数、第四虚函数的函数中生成。也就是,头文件和源文件分别在两个函数中生成,这两个函数都是继承于同一个基类的子类中分别和基类中两个名称不相同、参数相同、返回值类型相同的虚函数的函数,在调用这两个函数时可以采用基类的指针,也可以采用基类的引用。
在本实施方式中,上位机编译采用VS(Visual Studio)自带的VC编译器,MFC静态链接,因此先确保上位机已经安装VS,再配置编译环境,具体的配置可以在Makefile文件中完成,Makefile文件指明了编译需要的源文件、头文件路径以及支持编译所需库的头文件和库文件路径。另外,为了解决VC编译器在Release版本编译时可能产生nafxcw.lib和unafxcw.lib库冲突的问题,在Makefile文件中的LFLAGS=后添加nafxcw.lib。编译链接过程是:先开启一个进程,以命令行方式调用VC编译器根据Makefile中的编译链接规则进行编译和链接,最后生成可执行程序。
调用VC的nmake之前将MAKEFLAGS环境变量置空,以排除此环境变量对编译链接的影响。
下位机编译采用Redhat自带的GCC编译器,用make命令调用Makefile文件进行编译链接,由于下位机涉及文件权限问题,因此可以将make命令写在一个shell脚本中。
相对于现有技术而言,将测试用例中的每一个事件和动作都分别视为一个类,事件和动作各有一个基类,每一个具体的事件和动作类型都分别继承此动作基类和事件基类,每个动作基类和事件基类分别对应有C++语言编写的虚函数,在该虚函数中,可以用于自动生成基于事件和动作的C++测试用例。本发明实施方式实现自动生成C++测试用例,无需人工用接近底层的语言来重新编写测试用例,减少了开发测试代码的工作量,缩短了开发测试代码的时间;而且,相对于使用脚本语言编写测试用例,本发明实施方式使用C++语言,无需边执行边解释,可以提高测试用例的运行速度;另外,C++语言是接近底层的语言,用于设计测试用例,有助于提高测试的实时性。综上所述,本发明实施方式减少了开发测试代码的工作量,缩短了开发测试代码的时间,有助于提高测试的效率,还有助于提高测试的实时性。
上面各种方法的步骤划分,只是为了描述清楚,实现时可以合并为一个步骤或者对某些步骤进行拆分,分解为多个步骤,只要包含相同的逻辑关系,都在本专利的保护范围内;对算法中或者流程中添加无关紧要的修改或者引入无关紧要的设计,但不改变其算法和流程的核心设计都在该专利的保护范围内。
本领域的普通技术人员可以理解,上述各实施方式是实现本发明的具体实施例,而在实际应用中,可以在形式上和细节上对其作各种改变,而不偏离本发明的精神和范围。
机译: 基于模型的控制设备的测试用例生成设备和测试用例生成方法
机译: 基于用例图的测试用例生成程序以及使用该程序的测试用例生成方法
机译: 在医学成像设备运行期间根据事件生成错误日志的方法,包括在事件之后启动设备故障模式,执行特定于设备事件的动作以及通过将事件记录在文件中来生成错误日志