CN112035370A - 一种单元测试代码自动生成系统及其生成方法 - Google Patents

一种单元测试代码自动生成系统及其生成方法 Download PDF

Info

Publication number
CN112035370A
CN112035370A CN202010920331.2A CN202010920331A CN112035370A CN 112035370 A CN112035370 A CN 112035370A CN 202010920331 A CN202010920331 A CN 202010920331A CN 112035370 A CN112035370 A CN 112035370A
Authority
CN
China
Prior art keywords
unit test
file
generator
class member
codes
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202010920331.2A
Other languages
English (en)
Inventor
张华�
王宇钊
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Changzhou Citos Software Co ltd
Original Assignee
Changzhou Citos Software Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Changzhou Citos Software Co ltd filed Critical Changzhou Citos Software Co ltd
Priority to CN202010920331.2A priority Critical patent/CN112035370A/zh
Publication of CN112035370A publication Critical patent/CN112035370A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3684Test management for test design, e.g. generating new test cases
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明提供了一种单元测试代码自动生成方法,包括以下步骤:S1、根据编程语言类型选择对应的语法树解析器;S2、语法树解析器解析目标程序并且返回目标程序的语法树;S3、单元测试生成器根据语法树生成单元测试文件和单元测试代码;S4、单元测试生成器遍历单元测试文件并且生成编译脚本和执行脚本;S5、编译脚本编译单元测试文件并且生成可执行程序,执行脚本运行编译可执行程序,输出单元测试报告。这种单元测试代码自动生成方法通过语法树解析器解析目标程序的语法树,通过单元测试生成器生成的编译脚本和执行脚本输出单元测试报告,既减少了开发人员所需要的编程量,又能够精准的获取目标程序中的语法树,提高了代码测试的效率和准确度。

Description

一种单元测试代码自动生成系统及其生成方法
技术领域
本发明涉及计算机编程技术领域,尤其涉及一种单元测试代码自动生成系统及其生成方法。
背景技术
现如今,软件在各行各业中得到了越来越广的使用,这也导致软件的稳定性越来越被开发人员所重视,因此开发人员在现在的软件开发过程中引入了单体测试的环节。现有现有技术中已经有很多针对单元测试开发的工具,例如针对Java的JUnit和针对C++的gtest,但是这些工具主要还是由开发人员手动编写单元测试代码,会在软件开发中占用比较多的时间,而且开发人员并不一定能编写出完善的单元测试代码。
发明内容
本发明要解决的技术问题是:为了解决开发人员手动编写单元测试代码耗时长和容易出错的问题,本发明提供了一种单元测试代码自动生成系统及其生成方法来解决上述问题。
本发明解决其技术问题所采用的技术方案是:一种单元测试代码自动生成方法,包括以下步骤:
S1、根据编程语言类型选择对应的语法树解析器;
S2、语法树解析器解析目标程序并且返回目标程序的语法树;
S3、单元测试生成器根据语法树生成单元测试文件和单元测试代码;
S4、单元测试生成器遍历单元测试文件并且生成编译脚本和执行脚本;
S5、编译脚本编译单元测试文件并且生成可执行程序,执行脚本运行编译可执行程序,输出单元测试报告。
作为优选,步骤S3具体包括以下步骤:
S301、单元测试生成器遍历语法树并且筛选出需要生成单元测试代码的测试对象;
S302、单元测试生成器对应测试对象创建单元测试文件;
S303、单元测试生成器在单元测试文件中生成单元测试代码;
S304、单元测试生成器保存单元测试文件。
作为优选,在步骤S301中,测试对象包括类、类成员函数、类成员变量和独立函数;
在步骤S302中,单元测试生成器按照以下策略创建单元测试文件:
单元测试生成器对应每个类、与类对应的类成员函数和与类对应的类成员变量生成一个单元测试文件;
单元测试生成器对应所有的独立函数生成一个单元测试文件。
作为优选,在步骤S303中,单元测试生成器按照以下策略生成单元测试代码:
生成策略一、当类成员变量或者类成员函数的参数为基本类型时,单元测试生成器调用API生成值范围内的单元测试代码;
生成策略二、当类成员变量或者类成员函数的参数为枚举类型时,单元测试生成器调用API生成枚举值的单元测试代码;
作为优选,在步骤S301中,若单元测试生成器遍历语法树后获取的类成员变量或者类成员函数的参数为自定义类型,则单元测试生成器需要递归遍历语法树;
步骤S303还包括生成策略三、当类成员变量或者类成员函数的参数为自定义类型时,单元测试生成器先根据生成策略一和生成策略二生成自定义类型包括的类成员变量和类成员函数的参数的单元测试代码,单元测试生成器再调用自定义类型包括的类成员变量和类成员函数的参数的单元测试代码生成自定义类型的类成员变量或者类成员函数的参数的单元测试代码;
作为优选,在步骤S303中,单元测试生成器还按照以下策略计算单元测试文件的通过率:
单元测试生成器在每个单元测试文件中加入主函数,主函数调用单元测试代码并且记录全部单元测试代码的数量T;
主函数每调用完一个单元测试代码就判断此单元测试代码是否通过并且记录通过的单元测试代码的数量P;
主函数计算出单元测试文件的通过率P/T,单元测试文件的通过率P/T为通过的单元测试代码的数量P与全部单元测试代码的数量T的比值,主函数计算出单元测试文件的通过率P/T后能够将P、T和P/T输出至执行报告保存;
在步骤S4中,单元测试生成器遍历单元测试文件后还会生成统计脚本;
步骤S5还包括以下步骤:运行统计脚本,统计脚本对应各个单元测试文件生成执行报告,统计脚本整合各个单元测试文件的执行报告并且计算全部单元测试文件中所有单元测试代码的数量和所有单元测试代码的通过率。
作为优选,在步骤S4和S5之间还包括步骤S41、单元测试生成器编译单元测试代码并且生成log文件。
本发明的有益效果是,这种单元测试代码自动生成方法通过语法树解析器解析目标程序的语法树,通过单元测试生成器生成的编译脚本和执行脚本输出单元测试报告,既减少了开发人员所需要的编程量,又能够精准的获取目标程序中的语法树,提高了代码测试的效率和准确度。
附图说明
下面结合附图和实施例对本发明进一步说明。
图1是本发明一种单元测试代码自动生成方法的流程图。
具体实施方式
下面详细描述本发明的实施例,所述实施例的示例在附图中示出,其中自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。下面通过参考附图描述的实施例是示例性的,仅用于解释本发明,而不能理解为对本发明的限制。
在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“长度”、“宽度”、“厚度”、“上”、“下”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”“内”、“外”、“轴向”、“径向”、“周向”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
此外,术语“第一”、“第二”等仅用于描述目的,而不能理解为指示或暗示相对重要性。在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。此外,在本发明的描述中,除非另有说明,“多个”的含义是两个或两个以上。
流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。
如图1所示,本发明提供了一种单元测试代码自动生成方法,包括以下步骤:
S1、根据编程语言类型选择对应的语法树解析器,语法树解析器用于解析程序并且返回程序的语法树;在本实施例中,编程语言的类型包括Java和C++;
S2、语法树解析器解析目标程序并且返回目标程序的语法树;语法树用于存储目标程序的信息,包括类型及其属性、类成员函数、类成员函数的类型及其返回类型、类成员的参数及其参数类型、类成员变量及其变量类型和独立函数;
其中,独立函数只在编程语言类型为C++时出现,编程语言类型为Java时没有独立函数;
S3、单元测试生成器根据语法树生成单元测试代码,在本实施例中,当编程语言类型为C++时,单元测试生成器引用gtest,当编程语言类型为Java时,单元测试生成器引用junit;
单元测试生成器生成单元测试代码具体包括以下步骤:
S301、单元测试生成器遍历语法树并且筛选出需要生成单元测试代码的测试对象,测试对象包括类、类成员函数、类成员变量和独立函数;在本实施例中,类、类成员函数和类成员变量的属性均为public;
若单元测试生成器遍历语法树后获取的类成员变量或者类成员函数的参数为自定义类型,则单元测试生成器需要递归遍历语法树;
S302、单元测试生成器按照以下策略创建单元测试文件:
单元测试生成器对应每个类、与类对应的类成员函数和与类对应的类成员变量生成一个单元测试文件,每个类以及同属于其下的成员函数和成员变量共用一个单元测试文件;
单元测试生成器对应所有的独立函数生成一个单元测试文件,所有的独立函数共用一个单元测试文件;
S303、单元测试生成器按照以下三种策略在单元测试文件中生成单元测试代码:
生成策略一、当类成员变量或者类成员函数的参数为基本类型时,单元测试生成器对应编程语言类型调用gtest的API或者junit的API生成值范围内的单元测试代码;
例如,目标程序的编程语言类型为C++且类成员变量为unsigned char类型时,由于unsigned char类型的值范围为(0~255),单元测试生成器需要调用gtest中针对变量范围的API,生成测试代码;若假设函数的参数个数为n,参数1的值范围为R1,参数2的值范围为R2......参数n的值范围为RN,则此函数共需测试R1 * R2 * …* RN次;
生成策略二、当类成员变量或者类成员函数的参数为枚举类型时,单元测试生成器对应编程语言类型调用gtest的API或者junit的API生成枚举值的单元测试代码;
生成策略三、当类成员变量或者类成员函数的参数为自定义类型时,单元测试生成器先根据生成策略一和生成策略二生成自定义类型包括的类成员变量的单元测试代码和自定义类型包括的类成员函数的单元测试代码,单元测试生成器再调用自定义类型包括的类成员变量的单元测试代码和自定义类型包括的类成员函数的单元测试代码生成单元测试代码;
单元测试生成器按照以下策略计算单元测试文件的通过率:
单元测试生成器在每个单元测试文件中加入主函数,主函数调用单元测试代码并且记录全部单元测试代码的数量T;主函数每调用完一个单元测试代码就判断此单元测试代码是否通过,主函数判断单元测试代码是否通过后记录通过的单元测试代码的数量P;
当主函数调用完所有的单元测试代码后,主函数能够获取单元测试文件下通过的单元测试代码的数量P和全部单元测试代码的数量T;单元测试文件计算单元测试文件的通过率P/T,单元测试文件的通过率P/T为通过的单元测试代码的数量P与全部单元测试代码的数量T的比值;主函数计算出单元测试文件的通过率P/T后能够将此单元测试文件下的通过的单元测试代码的数量P、全部单元测试代码的数量T和单元测试文件的通过率P/T输出至执行报告保存;
S304、单元测试生成器保存单元测试文件;
S4、单元测试生成器遍历单元测试文件并且生成编译脚本、执行脚本和统计脚本,在本实施例中,编译脚本为shell命令脚本;
S41、单元测试生成器编译单元测试代码;在本实施例中,单元测试生成器在编译单元测试代码时还会生成log文件,log文件用于辅助开发人员对单元测试代码进行排查和调整;
S5、运行编译脚本,编译脚本编译单元测试文件并且生成可执行程序,在本实施例中,可执行程序的名称由单元测试文件中类的名称或者单元测试文件中独立函数的名称确定;
运行执行脚本,执行脚本运行可执行程序,执行脚本运行完成后会输出单元测试报告;
运行统计脚本,统计脚本对应各个单元测试文件生成执行报告,执行报告包括主函数输出的对应单元测试文件下的通过的单元测试代码的数量P、全部单元测试代码的数量T和单元测试文件的通过率P/T,统计脚本整合各个单元测试文件的执行报告并且计算全部单元测试文件中所有单元测试代码的数量和所有单元测试代码的通过率;
开发者能够通过单元测试报告和通过率直观的获取单元单元测试代码的测试情况。
在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对所述术语的示意性表述不一定指的是相同的实施例或示例。而且,描述的具体特征、结构、材料或者特点可以在任何的一个或多个实施例或示例中以合适的方式结合。
以上述依据本发明的理想实施例为启示,通过上述的说明内容,相关工作人员完全可以在不偏离本项发明技术思想的范围内,进行多样的变更以及修改。本项发明的技术性范围并不局限于说明书上的内容,必须要根据权利要求范围来确定其技术性范围。

Claims (7)

1.一种单元测试代码自动生成方法,其特征在于,包括以下步骤:
S1、根据编程语言类型选择对应的语法树解析器;
S2、语法树解析器解析目标程序并且返回目标程序的语法树;
S3、单元测试生成器根据语法树生成单元测试文件和单元测试代码;
S4、单元测试生成器遍历单元测试文件并且生成编译脚本和执行脚本;
S5、编译脚本编译单元测试文件并且生成可执行程序,执行脚本运行编译可执行程序,输出单元测试报告。
2.如权利要求1所述的一种单元测试代码自动生成方法,其特征在于:
步骤S3具体包括以下步骤:
S301、单元测试生成器遍历语法树并且筛选出需要生成单元测试代码的测试对象;
S302、单元测试生成器对应测试对象创建单元测试文件;
S303、单元测试生成器在单元测试文件中生成单元测试代码;
S304、单元测试生成器保存单元测试文件。
3.如权利要求2所述的一种单元测试代码自动生成方法,其特征在于:
在步骤S301中,测试对象包括类、类成员函数、类成员变量和独立函数;
在步骤S302中,单元测试生成器按照以下策略创建单元测试文件:
单元测试生成器对应每个类、与类对应的类成员函数和与类对应的类成员变量生成一个单元测试文件;
单元测试生成器对应所有的独立函数生成一个单元测试文件。
4.如权利要求3所述的一种单元测试代码自动生成方法,其特征在于:
在步骤S303中,单元测试生成器按照以下策略生成单元测试代码:
生成策略一、当类成员变量或者类成员函数的参数为基本类型时,单元测试生成器调用API生成值范围内的单元测试代码;
生成策略二、当类成员变量或者类成员函数的参数为枚举类型时,单元测试生成器调用API生成枚举值的单元测试代码。
5.如权利要求4所述的一种单元测试代码自动生成方法,其特征在于:
在步骤S301中,若单元测试生成器遍历语法树后获取的类成员变量或者类成员函数的参数为自定义类型,则单元测试生成器需要递归遍历语法树;
步骤S303还包括生成策略三、当类成员变量或者类成员函数的参数为自定义类型时,单元测试生成器先根据生成策略一和生成策略二生成自定义类型包括的类成员变量和类成员函数的参数的单元测试代码,单元测试生成器再调用自定义类型包括的类成员变量和类成员函数的参数的单元测试代码生成自定义类型的类成员变量或者类成员函数的参数的单元测试代码。
6.如权利要求5所述的一种单元测试代码自动生成方法,其特征在于:
在步骤S303中,单元测试生成器还按照以下策略计算单元测试文件的通过率:
单元测试生成器在每个单元测试文件中加入主函数,主函数调用单元测试代码并且记录全部单元测试代码的数量T;
主函数每调用完一个单元测试代码就判断此单元测试代码是否通过并且记录通过的单元测试代码的数量P;
主函数计算出单元测试文件的通过率P/T,单元测试文件的通过率P/T为通过的单元测试代码的数量P与全部单元测试代码的数量T的比值,主函数计算出单元测试文件的通过率P/T后能够将P、T和P/T输出至执行报告保存;
在步骤S4中,单元测试生成器遍历单元测试文件后还会生成统计脚本;
步骤S5还包括以下步骤:运行统计脚本,统计脚本对应各个单元测试文件生成执行报告,统计脚本整合各个单元测试文件的执行报告并且计算全部单元测试文件中所有单元测试代码的数量和所有单元测试代码的通过率。
7.如权利要求6所述的一种单元测试代码自动生成方法,其特征在于:
在步骤S4和S5之间还包括步骤S41、单元测试生成器编译单元测试代码并且生成log文件。
CN202010920331.2A 2020-09-04 2020-09-04 一种单元测试代码自动生成系统及其生成方法 Pending CN112035370A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202010920331.2A CN112035370A (zh) 2020-09-04 2020-09-04 一种单元测试代码自动生成系统及其生成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202010920331.2A CN112035370A (zh) 2020-09-04 2020-09-04 一种单元测试代码自动生成系统及其生成方法

Publications (1)

Publication Number Publication Date
CN112035370A true CN112035370A (zh) 2020-12-04

Family

ID=73590509

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202010920331.2A Pending CN112035370A (zh) 2020-09-04 2020-09-04 一种单元测试代码自动生成系统及其生成方法

Country Status (1)

Country Link
CN (1) CN112035370A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023206873A1 (zh) * 2022-04-28 2023-11-02 三六零科技集团有限公司 基于抽象语法树的代码检测方法、装置、设备及存储介质

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1983209A (zh) * 2005-12-14 2007-06-20 中兴通讯股份有限公司 一种软件单元测试自动化系统及其方法
CN102591777A (zh) * 2012-01-10 2012-07-18 深圳市同洲视讯传媒有限公司 一种单元测试代码生成方法及装置
CN106560797A (zh) * 2016-08-24 2017-04-12 北京安天电子设备有限公司 一种基于调试器的单元测试系统及方法
CN107122298A (zh) * 2017-04-21 2017-09-01 千寻位置网络有限公司 可视化软件开发过程质量的展示方法
CN108984393A (zh) * 2018-06-12 2018-12-11 苏宁易购集团股份有限公司 一种单元测试代码自动生成方法及装置
US20190004932A1 (en) * 2017-06-30 2019-01-03 Infinera Corporation Unit test and automation framework (utaf) system and method
CN110399300A (zh) * 2019-07-22 2019-11-01 南京大学 一种基于动态类型感知的Python软件模糊测试方法

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1983209A (zh) * 2005-12-14 2007-06-20 中兴通讯股份有限公司 一种软件单元测试自动化系统及其方法
CN102591777A (zh) * 2012-01-10 2012-07-18 深圳市同洲视讯传媒有限公司 一种单元测试代码生成方法及装置
CN106560797A (zh) * 2016-08-24 2017-04-12 北京安天电子设备有限公司 一种基于调试器的单元测试系统及方法
CN107122298A (zh) * 2017-04-21 2017-09-01 千寻位置网络有限公司 可视化软件开发过程质量的展示方法
US20190004932A1 (en) * 2017-06-30 2019-01-03 Infinera Corporation Unit test and automation framework (utaf) system and method
CN108984393A (zh) * 2018-06-12 2018-12-11 苏宁易购集团股份有限公司 一种单元测试代码自动生成方法及装置
CN110399300A (zh) * 2019-07-22 2019-11-01 南京大学 一种基于动态类型感知的Python软件模糊测试方法

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023206873A1 (zh) * 2022-04-28 2023-11-02 三六零科技集团有限公司 基于抽象语法树的代码检测方法、装置、设备及存储介质

Similar Documents

Publication Publication Date Title
US6895577B1 (en) Risk metric for testing software
US7340726B1 (en) Systems and methods for performing static analysis on source code
US7614040B2 (en) System and method for efficiently analyzing and building interdependent resources in a software project
US20050015752A1 (en) Static analysis based error reduction for software applications
US20110271258A1 (en) Software Development Tool
US20060248538A1 (en) Xml interfaces in unified rendering
CN110704306B (zh) 测试中的断言处理方法、装置、设备及存储介质
US20080313602A1 (en) Bounded program failure analysis and correction
US20110271250A1 (en) Software Development Tool
CN103577324A (zh) 移动应用中隐私信息泄露的静态检测方法
US20060161903A1 (en) Systems and methods for managing error dependencies
CN114691464A (zh) 一种接口测试方法、计算机设备及计算机可读存储介质
US10496379B2 (en) Facilitated production of code for software testing
CN110543427A (zh) 测试用例存储方法、装置、电子设备及存储介质
CN111506314B (zh) 项目开发的方法、装置、服务器及介质
US7287246B2 (en) Debugging optimized flows with breakpoints using stored breakpoint trigger indicators
CN117076338B (zh) 基于kprobe的linux内核动态调试方法及系统
CN112035370A (zh) 一种单元测试代码自动生成系统及其生成方法
CN110928760B (zh) 一种嵌入式系统中的单元测试方法与装置
US20110231820A1 (en) Exclusive logging
CN116541308B (zh) 一种回归测试方法及系统
CN116048731A (zh) 代码处理方法、装置、电子设备及存储介质
CN113656298A (zh) 一种基于接口描述的自动化测试用例生成与测试系统及其使用方法
EP0801348A1 (en) Method of monitoring the operation of a computer
CN113672509A (zh) 自动化测试方法、装置、测试平台及存储介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination