CN100549978C - 一种数据驱动的单元测试方法 - Google Patents
一种数据驱动的单元测试方法 Download PDFInfo
- Publication number
- CN100549978C CN100549978C CNB2007101769707A CN200710176970A CN100549978C CN 100549978 C CN100549978 C CN 100549978C CN B2007101769707 A CNB2007101769707 A CN B2007101769707A CN 200710176970 A CN200710176970 A CN 200710176970A CN 100549978 C CN100549978 C CN 100549978C
- Authority
- CN
- China
- Prior art keywords
- data
- data file
- test
- function
- message
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种数据驱动的单元测试方法,包括如下步骤:A、编写用于单元测试的数据文件,所述数据文件包括配置数据文件和报文数据文件;B、根据所述数据文件构造驱动函数和桩函数;C、根据所述数据文件、驱动函数和桩函数组织并执行测试用例。本发明的方法采用数据文件存储测试数据,使测试数据重用率高,便于管理;通过测试数据驱动测试用例的执行,对测试执行的控制灵活,开发和测试工作可分离进行。
Description
技术领域
本发明涉及单元测试领域,特别是涉及一种数据驱动的单元测试方法。
背景技术
软件单元,指软件设计说明中一个可独立测试的元素,是程序中一个逻辑上独立的部分。单元测试是对单个的软件单元或一组相关的软件单元所进行的测试,检查各软件单元是否正确地实现了规定的功能。单元测试对于在开发早期充分发现程序漏洞,以及提高程序的稳定和健壮具有极其重要的意义。
单元测试的关键是构建测试环境,其中经常要用到驱动和桩。驱动是用于模拟待测单元调用者的程序,桩是用于模拟待测单元所调用的下层单元的程序。
在驱动和桩中经常要使用各种测试数据,有的是作为待测函数的输入,有的是作为桩函数的返回值,有的是作为待测函数输出数据的校验数据等。特别是在网管软件中,各模块之间存在着大量的报文数据交换,模块内处理的数据和输出的数据也大多是报文数据,因此,网管软件的单元测试需要构造各种报文数据。另外,在测试时,不可避免还需要其他类型的测试数据,如整型、布尔型或字符串数据等。
目前软件开发中的单元测试,大体分为三种:第一,用户手工编写桩和驱动函数的纯手工测试;第二,借助白盒测试开源代码工具,如CppUnit,采用“半自动”的方式;第三,采用脚本写桩和驱动的自动测试。
对于自动化测试方法,通常采用读取数据文件来得到测试数据。该方法虽然灵活性提高,但对于网管软件中大量结构复杂的报文数据,如果全手工在数据文件中编写,不仅工作量大,而且难以表现报文复杂的层次结构,可移植性和重用率也不是很高。另外,自动化测试工具不仅需要用户熟悉脚本或某种语言进行测试逻辑控制,提高了对测试人员技能的要求,而且,通用的单元测试工具在特定的环境下,自动化程度不高,这限制了其在一些具体环境中的广泛使用。
前两种测试方式使用简单,操作灵活,覆盖率易控制,在网管软件开发中应用广泛。但这两种方式的测试数据通常采用硬编码的方式直接在桩或驱动函数中编写,存在以下不足:
(1)数据构造量大而繁琐,大量的测试数据难以重用和管理;
(2)测试代码重用率低,每增加一组测试数据,都需要新增一组测试代码,容易造成代码冗余;
(3)灵活性差,每次增加或修改一组测试数据,都需要进行重新编译。
发明内容
本发明所要解决的技术问题是提供一种由外部数据文件提供测试数据并控制测试执行的单元测试方法。
为解决上述技术问题,本发明提供技术方案如下:
一种数据驱动的单元测试方法,包括如下步骤:
A、编写用于单元测试的数据文件,所述数据文件包括配置数据文件和报文数据文件;
B、根据所述数据文件构造驱动函数和桩函数;
C、根据所述数据文件、驱动函数和桩函数组织并执行测试用例。
较佳地,步骤A中,所述配置数据文件采用XML格式编写,并包括驱动函数名和为所述驱动函数配置的测试数据。
较佳地,为所述驱动函数配置多组测试数据。
较佳地,步骤A中,所述报文数据文件采用VAL格式,并利用报文数据文件生成工具生成或者按照报文格式手工编写。
步骤B中,根据所述数据文件构造驱动函数进一步包括:从配置数据文件中读取测试数据,将该测试数据作为被测函数的输入数据或者作为报文数据文件名;从报文数据文件中读取报文数据,将该报文数据作为被测函数的输入数据或者校验数据;将被测函数执行后的输出报文存储到报文数据文件中,用于验证执行结果。
步骤B中,根据所述数据文件构造桩函数进一步包括:从报文数据文件中读取报文数据,将该报文数据作为桩函数的输出数据或者校验数据;将被测函数执行后输入到桩函数中的报文存储到报文数据文件中,用于验证执行结果。
步骤C进一步包括:上层驱动函数从配置数据文件中读取子驱动函数名,以此来决定需要执行的子驱动函数以及子驱动函数的执行顺序;上层驱动函数从配置数据文件中读取测试数据组数,以此来决定子驱动函数的执行次数。
本发明提供了完整的由外部数据文件提供测试数据并控制测试执行的单元测试方法,与现有技术相比,具有如下有益效果:
(1)采用数据文件存储测试数据,使测试数据重用率高,且便于管理;
(2)通过测试数据驱动测试用例的执行,利用测试数据组数控制用例执行次数,对测试执行的控制灵活,并提高测试代码重用率;
(3)对测试数据的修改灵活,无需重新编译代码;
(4)无需数据库的支持,减少对测试环境的依赖;
(5)对被测程序代码几乎没任何影响和依赖,开发和测试工作可分离进行。
附图说明
图1为本发明数据驱动的单元测试系统结构示意图;
图2为本发明数据驱动的单元测试方法流程图;
图3为本发明的方法中组织并执行测试用例的流程图;
图4为本发明的方法中解析XML文件的流程图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明进行详细描述。
请参照图1,本发明在进行单元测试时,所用的测试系统主要包括,数据文件、数据文件解析模块、报文数据读写接口和测试框架模块,其中:
数据文件包括配置数据文件和报文数据文件,配置数据文件由测试数据和控制信息组成,报文数据文件采用已被广泛接受的格式存储报文数据。数据文件解析模块用于分析配置数据文件,提取测试数据和控制信息,并装载好测试用例供测试框架模块执行。报文数据读写接口由报文数据读取函数和报文数据输出函数组成,报文数据读取函数用于从报文数据文件中读取报文信息,报文数据输出函数用于将报文信息输出到报文数据文件中。测试框架模块用于驱动数据文件解析模块运行,并执行数据文件解析模块装载好的测试用例,以及初始化测试环境和清除测试环境。
请参照图2,本发明数据驱动的单元测试方法包括如下步骤:
步骤201、编写用于单元测试的数据文件;
(1)编写配置数据文件:
配置数据文件除了能提供测试数据,还能提供测试控制信息。配置数据文件按照预定的规范编写,以不同的关键字代表不同的配置内容,且各关键字都有开始和结束符来标识配置内容的范围,各关键字之间有从属关系。如用例名关键字下设置将要执行的测试函数,测试数据关键字下为当前测试函数配置一组测试数据。一个用例名关键字下可以有若干个测试数据关键字。
本发明的配置数据文件可以采用XML文件,其格式如下:
<?xml version=″1.0″>
<TestCaseConfig>
<TestCase Path=″TestMethod″>
<TestData Name1=“Value1”Name2=“Value2”>
</TestData>
<TestData Name1=“Value3”Name2=“Value4”>
</TestData>
</TestCase>
<TestCase Path=″TestMethod2″>
<TestData NameA=“ValueA”NameB=“ValueB”>
</TestData>
<TestData NameA=“ValueC”NameB=“ValueD”>
</TestData>
</TestCase>
</TestCaseConfig>
其中:
<TestCase>用来标识一个将要执行的测试用例(测试函数),其中的TestMethod就是一个测试函数名。
<TestData>用来标识一组测试数据,供当前<TestCase>标识的测试函数使用。每一个测试数据由数据名和数据值组成,其中的“Name1”代表数据名,“Value1”代表数据值。<TestData>是<TestCase>下的元素,一个<TestCase>下可以有多个<TestData>,即每一个测试函数可以用多组测试数据。
<TestCaseConfig>没有实际含义,通过将它作为最顶层的元素,可使一个XML文件中包含多个<TestCase>。
(2)编写报文数据文件:
报文数据文件采用被业界广泛接受的VAL格式,可采用多种方式生成,如利用报文数据文件生成工具,或利用报文数据输出函数,或按照报文格式手工编写。
步骤202、根据所述数据文件构造驱动函数和桩函数;
(1)编写驱动函数,模拟被测函数的调用者,具体为:
(a)利用数据文件解析模块提供的测试数据读取接口函数来引用步骤201中准备的配置数据文件中的测试数据。接口函数的输入参数为数据名,返回值为数据值。通过不同的接口函数,可分别得到字符串型、布尔型、整型等不同类型的数据值。从配置数据文件读取的数据值有的作为控制测试环境的标志位,有的作为测试函数的输入数据,有的作为报文数据文件名等。
(b)利用报文数据读取函数从报文数据文件中读取报文数据,用于构造被测函数的输入数据或者校验数据。在传输网管软件中,通常使用ASN.1(Abstract Syntax Notation One)报文。通过扩展SNACC(一种开源的ASN.1文件编译器)编译器,使其在编译ASN.1文件时,生成报文数据读取函数ReadValFile和报文数据输出函数PrintVal,它们分别能读取和打印VAL格式(被业界广泛采纳的格式)的报文数据文件。根据在(a)中得到的报文数据文件名,调用ReadValFile函数来得到一个报文对象,用于构造被测函数的输入参数。
(c)利用报文数据输出函数将被测函数执行后的输出报文存储到报文数据文件中,用于验证执行结果,具体为:(c1)调用数据文件解析模块提供的数据读取接口函数来引用配置数据文件中配置的检验数据或报文数据文件名,利用检验数据构造验证代码;(c2)根据在(c1)中得到的报文数据文件名,调用ReadValFile函数来得到一个报文对象,作为被测函数输出值的检验数据,利用检验数据构造验证代码;(c3)根据在步骤(c1)中得到的报文数据文件名,调用PrintVal来打印被测函数的输出报文,用作外部检验。
(d)利用测试框架模块对驱动函数进行注册。例如测试框架模块采用CppUnit,利用CppUnit提供的CPPUNIT_TEST宏来注册驱动函数到测试用例组。
(2)编写桩函数,模拟被测函数所调用的下层单元,具体如下:
(a)利用数据文件解析模块提供的测试数据读取接口函数来引用步骤201中准备的配置数据文件中的测试数据;
(b)利用报文数据读取函数从报文数据文件中读取报文数据,用于构造桩函数的输出数据或验证数据;
(c)利用报文数据输出函数将被测函数传入桩函数中的报文数据存储到报文数据文件中,用于验证执行结果。
步骤203、根据所述数据文件、驱动函数和桩函数组织并执行测试用例。具体为:
(a)数据文件解析模块装载配置数据文件;
(b)数据文件解析模块解析配置数据文件,根据配置数据文件中不同的关键字做出不同的处理:
(b1)如为用例名关键字的开始符,则解析得到测试用例名,并利用测试框架模块装载该测试用例;
(b2)如为测试数据关键字的开始符,则首先清除内存中原有的测试数据,然后读取该关键字下配置的所有测试数据,并将测试数据存放于内存中供测试数据读取接口函数使用;
(b3)如为测试数据关键字的结束符,则运行当前的测试用例;
(b4)如为用例名关键字的结束符,则卸载当前的测试用例。
请参照图3,给出一个根据配置数据文件组织并执行测试用例的应用实例,其包括如下步骤:
步骤301、启动数据文件解析模块;
在main()函数中,调用数据文件解析模块的接口函数,开始运行数据文件解析模块。
步骤302、创建并初始化数据文件解析模块中需要用到的对象;
其中的几个关键对象创建如下:
(1)创建并初始化CTestCaseInvoker类对象,CTestCaseInvoker为测试用例调用者类,用于处理测试用例开始事件、测试用例结束事件和运行测试用例等;
(2)创建并初始化CXmlTestCaseParser类对象,CXmlTestCaseParser类用于根据一个XML文件分析测试用例;
(3)创建并初始化CXmlTestDataHandler类对象,CXmlTestDataHandler类用于解析和处理以XML文件保存的测试数据;数据文件解析模块对XML文件的分析是以ACE(The Adaptive Communication Environment)为基础的,CXmlTestDataHandler即继承至ACE的ACEXML_DefaultHandler类;
(4)创建并初始化CPropertyHandler类对象,CPropertyHandler用于监听测试数据,并将测试数据保存在内存中。
步骤303、装载XML文件。将XML文件名传给CXmlTestCaseParser类对象。
步骤304、解析XML文件并执行测试用例;
CXmlTestCaseParser对象调用Parser方法来解析XML文件,解析过程请参照图4,具体如下:
(1)创建一个ACE中的ACEXML_FileCharStream类对象,用于打开XML文件。ACEXML_FileCharStream类用于从一个文件中读取输入信息。
(2)将ACEXML_FileCharStream对象封装为ACEXML_InputSource类对象input。ACEXML_InputSource也是ACE中的一个类,它封装了实际的输入流及其他附加信息。
(3)创建一个ACEXML_Parser类对象parser,并用CXmlTestDataHandler类对象对parser进行初始化。ACEXML_Parser也是ACE的一个类,它实现了一个基于SAX(Simple API for XML)的解析器。
(4)调用parser.parse(input)方法。parse为ACEXML_Parser类的一个方法,用于解析XML文件。input为(2)中创建的ACEXML_InputSource类对象。ACEXML_Parser的parse方法在解析XML文件中的元素时,会根据收到的不同通知引发不同的操作。
(5)如果接收到元素开始通知,执行CXmlTestDataHandler::startElement方法,具体为:(51)如果当前处理的元素为“TestCase”,则解析XML文件得到测试用例名,并利用CppUnit框架加载该用例;(52)如果当前处理的元素为“TestData”,首先,清空内存中原有的测试数据,然后,从XML文件中读取当前TestData元素下的所有测试数据,并将数据保存在内存中,供数据读取接口函数来引用;(53)如果当前处理的元素为其他,则不作任何处理。
(6)如果接收到元素结束通知,执行CXmlTestDataHandler::endElement方法,具体为:(61)如果当前处理的元素为“TestData”,则执行当前测试用例;(62)如果当前处理的元素为“TestCase”,则卸载当前测试用例。
步骤305、当XML文件全部解析完,析构步骤302中创建的对象,清除框架环境,测试完成。
最后应当说明的是,以上实施例仅用以说明本发明的技术方案而非限制,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明技术方案的精神范围,其均应涵盖在本发明的权利要求范围当中。
Claims (5)
1.一种数据驱动的单元测试方法,其特征在于,包括如下步骤:
A、编写用于单元测试的数据文件,所述数据文件包括配置数据文件和报文数据文件,其中,所述配置数据文件由测试数据和控制信息组成;
B、根据所述数据文件构造驱动函数和桩函数,其中,
构造驱动函数进一步包括:从配置数据文件中读取测试数据,将该测试数据作为被测函数的输入数据或者作为报文数据文件名;从报文数据文件中读取报文数据,将该报文数据作为被测函数的输入数据或者校验数据;将被测函数执行后的输出报文存储到报文数据文件中,用于验证执行结果,
构造桩函数进一步包括:从报文数据文件中读取报文数据,将该报文数据作为桩函数的输出数据或者校验数据;将被测函数执行后输入到桩函数中的报文存储到报文数据文件中,用于验证执行结果;
C、根据所述数据文件、驱动函数和桩函数组织并执行测试用例。
2.如权利要求1所述的方法,其特征在于:
步骤A中,所述配置数据文件采用XML格式编写,并包括驱动函数名和为所述驱动函数配置的测试数据。
3.如权利要求2所述的方法,其特征在于:
为所述驱动函数配置多组测试数据。
4.如权利要求1所述的方法,其特征在于:
步骤A中,所述报文数据文件采用VAL格式,并利用报文数据文件生成工具生成或者按照报文格式手工编写。
5.如权利要求1所述的方法,其特征在于,步骤C进一步包括:
上层驱动函数从配置数据文件中读取子驱动函数名,以此来决定需要执行的子驱动函数以及子驱动函数的执行顺序;
上层驱动函数从配置数据文件中读取测试数据组数,以此来决定子驱动函数的执行次数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101769707A CN100549978C (zh) | 2007-11-07 | 2007-11-07 | 一种数据驱动的单元测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNB2007101769707A CN100549978C (zh) | 2007-11-07 | 2007-11-07 | 一种数据驱动的单元测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101158919A CN101158919A (zh) | 2008-04-09 |
CN100549978C true CN100549978C (zh) | 2009-10-14 |
Family
ID=39307026
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB2007101769707A Expired - Fee Related CN100549978C (zh) | 2007-11-07 | 2007-11-07 | 一种数据驱动的单元测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN100549978C (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101859272B (zh) * | 2009-04-09 | 2013-01-09 | 大唐移动通信设备有限公司 | 一种嵌入式软件系统的仿真方法、系统及装置 |
CN102841841B (zh) * | 2011-06-20 | 2016-06-01 | 阿里巴巴集团控股有限公司 | 一种测试中的断言处理方法及系统 |
CN102722382B (zh) * | 2012-05-21 | 2015-11-25 | 华为技术有限公司 | 仿真过程中加载表项的方法及仿真设备 |
CN104598377A (zh) * | 2014-12-29 | 2015-05-06 | 大唐移动通信设备有限公司 | 一种打桩测试方法和装置 |
CN108694114A (zh) * | 2017-04-06 | 2018-10-23 | 广东亿迅科技有限公司 | 用于分离测试用例、测试脚本和测试数据的方法及其系统 |
CN112882931B (zh) * | 2021-02-06 | 2023-05-09 | 重庆富民银行股份有限公司 | 基于ddt的自动化测试方法及装置 |
-
2007
- 2007-11-07 CN CNB2007101769707A patent/CN100549978C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN101158919A (zh) | 2008-04-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN100549978C (zh) | 一种数据驱动的单元测试方法 | |
AU2010350247B2 (en) | Code inspection executing system for performing a code inspection of ABAP source codes | |
CN103577324B (zh) | 移动应用中隐私信息泄露的静态检测方法 | |
US20090197645A1 (en) | Test case automatic generation method for testing proactive gsm application on sim cards | |
CN109189479B (zh) | 一种用于处理器指令集的并行自动化验证方法 | |
CN100435113C (zh) | 基于c++映射的ttcn-3测试系统及测试方法 | |
CN100375057C (zh) | 一种自动化测试辅助系统及相应的软件自动测试方法 | |
CN107451060A (zh) | 一种跨移动端自动化测试框架系统 | |
CN104156224A (zh) | 一种软件构建持续集成方法及系统 | |
CN107832059A (zh) | 一种基于Makefile的代码静态分析方法和装置 | |
CN103257919A (zh) | 脚本程序检查方法和装置 | |
CN103399814A (zh) | 自动化测试的方法及装置 | |
CN1485740A (zh) | 一种基于主机平台的嵌入式模块和子系统的通用测试装置 | |
US7340725B1 (en) | Smart test attributes and test case scenario in object oriented programming environment | |
CN111399828A (zh) | 一种基于模型驱动的逻辑设备建模方法及终端 | |
CN113886232A (zh) | 接口测试数据和测试脚本生成方法、终端设备及存储介质 | |
US20030046312A1 (en) | Automated language and interface independent software testing tool | |
CN111752841A (zh) | 单测模拟方法、装置、设备与计算机可读存储介质 | |
CN102063367B (zh) | 针对当机程序的离线分析方法及装置 | |
CN117370217B (zh) | 一种基于python的接口测试结果自动生成方法 | |
CN114138633A (zh) | 基于数据驱动的软件测试的方法、装置、设备及可读介质 | |
Li et al. | Towards a practical and effective method for web services test case generation | |
KR20030015200A (ko) | 소프트웨어 컴파일러들을 위해 내장된 시스템들 용의튼튼한 로깅 시스템 | |
CN100469171C (zh) | 多种制式移动终端的测试系统及其测试方法 | |
CN115794119B (zh) | 一种案例自动解析方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20091014 Termination date: 20171107 |
|
CF01 | Termination of patent right due to non-payment of annual fee |