CN1499374A - 一种单元测试自动化方法 - Google Patents
一种单元测试自动化方法 Download PDFInfo
- Publication number
- CN1499374A CN1499374A CNA021467129A CN02146712A CN1499374A CN 1499374 A CN1499374 A CN 1499374A CN A021467129 A CNA021467129 A CN A021467129A CN 02146712 A CN02146712 A CN 02146712A CN 1499374 A CN1499374 A CN 1499374A
- Authority
- CN
- China
- Prior art keywords
- test
- script file
- function
- unit
- file
- 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.)
- Granted
Links
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
本发明公开了一种单元测试自动化方法,通过脚本文件控制被测试程序单元,其步骤为:测试脚本文件控制单元测试辅助模块;单元测试辅助模块控制被测试程序单元。脚本解释器解释执行测试脚本文件中的程序代码,根据程序代码的行为向数据交换文件中写入设置数据;被测试程序单元调用单元测试辅助模块中的功能函数;单元测试辅助模块中的功能函数读取数据交换文件中的设置数据,通过设置数据控制重新定义的关键字和函数的执行结果;单元测试辅助模块中的功能函数通过重新定义的关键字或函数控制被测试程序单元。从而提供通用简单的自动化单元测试过程,以实现提高单元测试的执行效率,方便回归测试,降低单元测试成本的目的。
Description
技术领域
本发明涉及单元测试领域,特别是一种单元测试自动化方法。
背景技术
单元测试是集中对由源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。单元测试检查每一个控制结构的分支以确保完全覆盖和最大可能的错误检查。
目前,一般通过在程序代码中增加测试代码、编写大量的桩函数和驱动函数的方法来完成单元测试。这种方法最大的问题就是需要修改大量的程序代码,而且测试过程不能自动化,测试的执行效率非常低。
单元测试是为了尽可能多的发现程序的错误,发现错误后,为了修正错误,是需要对程序代码进行修改的。每当程序代码被修改的时候,程序配置的某些方面(如文档或者数据)也会被修改。回归测试是对修改过的程序再重新测试一遍,以保证修改是正确的,同时保证所做的修改不会带来不可预料的行为或者新的错误。
由于测试过程不能自动进行,因此对于错误修改后的回归测试过程就会十分繁琐。必需将测试正确的测试用例再重新测试一遍,以确保修改是正确的,并且没有引入其他的错误。
对于一些难以模拟的情况,如内存分配失败时,因为根本无法执行到这些代码,所以其对应的代码处理分支在单元测试时就难以覆盖了。
测试完成,发布版本的时候,还需要从程序代码中删除大量的测试代码,这个过程往往复杂而且极易出错。
综上所述,测试过程的自动化将成为单元测试发展的方向。
发明内容
有鉴于此,本发明的目的在于提供一种单元测试自动化方法,实现单元测试过程的自动化,提高单元测试的效率。
为了达到上述目的,本发明提供了一种单元测试自动化方法,其特征在于:通过测试脚本文件控制被测试程序单元,包含以下步骤:
A、测试脚本文件控制单元测试辅助模块;
B、单元测试辅助模块控制被测试程序单元。
步骤A进一步包括:
A1、脚本解释器解释执行测试脚本文件中的程序代码,根据程序代码的行为向数据交换文件中写入设置数据;
A2、单元测试辅助模块中的功能函数由被测试程序单元调用,单元测试辅助模块中的功能函数读取数据交换文件中的设置数据,通过设置数据控制重新定义的关键字(如:if语句)和函数的执行结果。
B进一步包括:
B1、被测试程序单元调用单元测试辅助模块中的功能函数;
B2、单元测试辅助模块中的功能函数通过重新定义的关键字或函数控制被测试程序单元。
单元测试辅助模块中的功能函数包括测试用桩函数和驱动函数。
较佳地,该方法进一步包括:测试脚本文件通过延时控制设置数据生效的时间。
测试脚本文件可引用动态连接库中的函数。测试脚本文件与被测试程序单元进行信息交互,根据测试脚本文件引用的动态连接库函数,选择测试脚本文件当前程序代码后面的程序代码分支。
本发明通过将测试用桩函数和驱动函数封装成一个通用独立的单元测试辅助模块,并通过测试脚本文件控制桩函数和驱动函数,从而控制被测试程序单元。更进一步地,对于一些难以模拟的分支的覆盖(如:内存分配失败),可以通过控制被测试程序单元进入不同的运行流程来实现。提高了单元测试的执行效率,实现了单元测试过程的自动化,使单元测试简单通用;回归测试时,只需使用该测试脚本文件重新进行测试即可,大大简化了回归测试,降低了单元测试的成本。针对同一单元测试的测试脚本文件可以重复使用,不管是否由同一测试人员进行测试。
附图说明
图1示出了依据本发明的测试脚本文件控制被测试程序单元的示意图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面结合附图对本发明作进一步地详细描述。
图1示出了依据本发明的测试脚本文件控制被测试程序单元的示意图,如图1所示:
进行单元测试时,测试系统主要分为如下几个部分:测试脚本文件101、脚本解释器102、数据交换文件103、单元测试辅助模块105和被测试程序单元104。其中单元测试辅助模块105和被测试程序单元104组成了被测试系统106。本发明是将测试的驱动函数和桩函数封装成一个通用独立的单元模块,即单元测试辅助模块105。
测试脚本文件101是一个文本文件,文件中包含了一些采用C语言编写的程序代码。用户根据测试所要实现的目的编写测试脚本文件101中的程序代码。测试脚本文件101还可以引入其他动态连接库中的函数,因此测试脚本文件101可实现灵活的功能,并且具有很强的可扩展性。例如,测试脚本文件101可通过延时来控制各类设置数据生效的时间间隔。又如,测试脚本文件101还可以通过调用外部动态连接库中的函数来和被测试程序单元104进行信息交换,从而根据不同的情况来决定测试脚本文件101中当前程序代码后面的程序代码的行为,比如执行测试脚本文件101中的哪一个分支。
脚本解释器102负责对测试脚本文件101进行解释和执行工作。脚本解释器102在读取测试脚本文件101后,逐条语句执行。在执行过程中,脚本解释器102依据执行结果,向数据交换文件103中写入一些设置数据,如设置某条if语句执行结果为false,设置某行new操作返回值为空等。
被测试程序单元104调用单元测试辅助模块105中的功能函数,单元测试辅助模块105中的功能函数读取数据交换文件103中的设置数据,通过设置数据控制重新定义的关键字和函数的执行结果,从而由单元测试辅助模块105控制被测试程序单元104。
单元测试辅助模块105控制被测试程序单元104的行为主要是通过重新定义各类主要关键字和函数来实现的。重新定义哪些关键字和哪些函数完全是根据测试需要来决定的,可以进行任意的扩展。
例如,测试过程中需要重新定义if语句,以达到控制if语句执行分支的目的,那么,可以对if语句(关键字)进行如下重新定义:
#define if(x)if(IfForUT(_FILE_,_LINE_,bool(x)))
其中,IfForUT是自定义的一个函数,其函数形式如下:
bool IfForUT(LPCSTR lpszFileName,int nLine,bool bCondition);
IfForUT函数中就可以从数据交换文件中读取设置数据,如果用户设置lpszFileName所指的文件中的nLine行语句要返回false,则IfForUT直接返回false。如果没有设置,IfForUT函数返回bCondition的值,也就是使if语句按其原有的行为执行。
再如,测试过程中希望模拟new操作失败,但又不希望修改被测试程序单元,那么,可以将new操作符进行重新定义:
#define new DEBUG_NEW
#define DEBUG_NEW new(THIS_FILE,_LINE_)
void*operator new(size_t nSize,LPCSTR lpszFileName,int nLine)
在自定义的new操作中就可以从数据交换文件中读取设置数据,根据用户在脚本文件中的设置来判断lpszFileName所指的文件中的nLine行的内存申请操作是否返回失败。这样就达到了模拟实际情况下几乎不可能模拟的内存分配失败的情况,而内存分配失败后的代码处理分支也就可以顺利地进行测试了。
再举例说明重新定义函数的情况。
在测试过程中希望对DBLibrary提供的函数dbcmd的执行结果(返回值)进行控制,那么可定义如下宏:
#define dbcmd(dbproc,cmdstring)dbcmdForUT(_FILE_,_LINE_,dbproc,cmdstring)
再定义函数dbcmdForUT
在dbcmdForUT函数中,类似前面举例说明的,可根据用户在脚本文件中的设置来确定lpszFileName所指文件中nLine行调用dbcmd函数时应该返回什么值。
这种方式对于单元测试中不同程序分支的测试可以实现完全自动化,可以使测试覆盖一些难以模拟的程序分支。而且用户可以在不同时间设置同一条语句返回不同的执行结果,这样就可以控制被测试程序单元104进入不同的运行流程。因此,可以在一次自动测试过程中,完成所有分支的测试。
测试所用的脚本文件101是可以重复使用的。在修改代码后,只需要将测试所用的脚本文件101重新执行一次,就可以完成回归测试,极大地提高了单元测试效率。
单元测试辅助模块105是否编译、加载完全通过宏定义来控制。因此,在单元测试结束后,只需要去掉宏,就可以完全卸载单元测试辅助模块105了,卸载后不会对发布版本的编译和执行产生任何影响。
总之,以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。
Claims (6)
1、一种单元测试自动化方法,其特征在于:通过测试脚本文件控制被测试程序单元,包含以下步骤:
A、测试脚本文件控制单元测试辅助模块;
B、单元测试辅助模块控制被测试程序单元。
2、如权利要求1所述的单元测试自动化方法,其特征在于所述的步骤A进一步包括:
A1、脚本解释器解释执行测试脚本文件中的程序代码,根据程序代码的行为向数据交换文件中写入设置数据;
A2、单元测试辅助模块中的功能函数由被测试程序单元调用,单元测试辅助模块中的功能函数读取数据交换文件中的设置数据,通过设置数据控制重新定义的关键字和函数的执行结果。
所述的步骤B进一步包括:
B1、被测试程序单元调用单元测试辅助模块中的功能函数;
B2、单元测试辅助模块中的功能函数通过重新定义的关键字或函数控制被测试程序单元。
3、如权利要求2所述的单元测试自动化方法,其特征在于所述的单元测试辅助模块中的功能函数包括测试用桩函数和驱动函数。
4、如权利要求1所述的单元测试自动化方法,其特征在于该方法进一步包括:所述的测试脚本文件通过延时控制设置数据生效的时间。
5、如权利要求1所述的单元测试自动化方法,其特征在于所述的测试脚本文件可引用动态连接库中的函数。
6、如权利要求7所述的单元测试自动化方法,其特征在于该方法进一步包括:所述的测试脚本文件与被测试程序单元进行信息交互,根据测试脚本文件引用的动态连接库函数,选择测试脚本文件当前程序代码后面的程序代码分支。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 02146712 CN1273897C (zh) | 2002-11-04 | 2002-11-04 | 一种单元测试自动化方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 02146712 CN1273897C (zh) | 2002-11-04 | 2002-11-04 | 一种单元测试自动化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1499374A true CN1499374A (zh) | 2004-05-26 |
CN1273897C CN1273897C (zh) | 2006-09-06 |
Family
ID=34232849
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 02146712 Expired - Fee Related CN1273897C (zh) | 2002-11-04 | 2002-11-04 | 一种单元测试自动化方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1273897C (zh) |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100363906C (zh) * | 2006-02-28 | 2008-01-23 | 华为技术有限公司 | 一种软件单元的测试方法 |
CN100370434C (zh) * | 2005-11-01 | 2008-02-20 | 华为技术有限公司 | 一种实现软件自动测试的方法及系统 |
CN100373326C (zh) * | 2005-09-13 | 2008-03-05 | 华为技术有限公司 | 一种自动化测试系统及其方法 |
CN100389391C (zh) * | 2005-11-24 | 2008-05-21 | 北京中星微电子有限公司 | 一种利用脚本及其编译器调用宿主软件函数的系统与方法 |
CN100401265C (zh) * | 2005-06-06 | 2008-07-09 | 华为技术有限公司 | 关键字驱动的自动化测试系统及方法 |
CN100401264C (zh) * | 2005-06-06 | 2008-07-09 | 华为技术有限公司 | 数据驱动的自动化测试系统及方法 |
CN100407162C (zh) * | 2004-09-30 | 2008-07-30 | 中兴通讯股份有限公司 | 一种具有测试柔性的集成软件测试方法 |
CN100452062C (zh) * | 2006-01-13 | 2009-01-14 | 大同股份有限公司 | 测试硬件描述语言所撰写的硬件电路方块的方法 |
CN100451988C (zh) * | 2006-11-14 | 2009-01-14 | 无敌科技(西安)有限公司 | 一种实现单元测试的方法及系统 |
CN100571167C (zh) * | 2006-02-24 | 2009-12-16 | 国际商业机器公司 | Web服务业务流程的单元测试的方法和设备 |
CN101098259B (zh) * | 2006-06-30 | 2010-08-18 | 中兴通讯股份有限公司 | 一种实现大数据冲击的自动化测试的方法和系统 |
CN1952818B (zh) * | 2005-10-22 | 2010-12-15 | 康佳集团股份有限公司 | 自动检验测试结果的程序单元测试方法 |
CN102375103A (zh) * | 2010-08-27 | 2012-03-14 | 富泰华工业(深圳)有限公司 | 电子产品测试装置及方法 |
CN1928880B (zh) * | 2005-07-29 | 2012-10-31 | 西门子公司 | 用于动态产生复杂计算机辅助系统测试脚本的方法和装置 |
CN103593277A (zh) * | 2012-08-15 | 2014-02-19 | 深圳市世纪光速信息技术有限公司 | 日志处理方法及系统 |
CN104050081A (zh) * | 2014-06-09 | 2014-09-17 | 汉柏科技有限公司 | 调试静态库函数的方法及系统 |
-
2002
- 2002-11-04 CN CN 02146712 patent/CN1273897C/zh not_active Expired - Fee Related
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100407162C (zh) * | 2004-09-30 | 2008-07-30 | 中兴通讯股份有限公司 | 一种具有测试柔性的集成软件测试方法 |
CN100401265C (zh) * | 2005-06-06 | 2008-07-09 | 华为技术有限公司 | 关键字驱动的自动化测试系统及方法 |
CN100401264C (zh) * | 2005-06-06 | 2008-07-09 | 华为技术有限公司 | 数据驱动的自动化测试系统及方法 |
CN1928880B (zh) * | 2005-07-29 | 2012-10-31 | 西门子公司 | 用于动态产生复杂计算机辅助系统测试脚本的方法和装置 |
CN100373326C (zh) * | 2005-09-13 | 2008-03-05 | 华为技术有限公司 | 一种自动化测试系统及其方法 |
CN1952818B (zh) * | 2005-10-22 | 2010-12-15 | 康佳集团股份有限公司 | 自动检验测试结果的程序单元测试方法 |
CN100370434C (zh) * | 2005-11-01 | 2008-02-20 | 华为技术有限公司 | 一种实现软件自动测试的方法及系统 |
CN100389391C (zh) * | 2005-11-24 | 2008-05-21 | 北京中星微电子有限公司 | 一种利用脚本及其编译器调用宿主软件函数的系统与方法 |
CN100452062C (zh) * | 2006-01-13 | 2009-01-14 | 大同股份有限公司 | 测试硬件描述语言所撰写的硬件电路方块的方法 |
CN100571167C (zh) * | 2006-02-24 | 2009-12-16 | 国际商业机器公司 | Web服务业务流程的单元测试的方法和设备 |
CN100363906C (zh) * | 2006-02-28 | 2008-01-23 | 华为技术有限公司 | 一种软件单元的测试方法 |
CN101098259B (zh) * | 2006-06-30 | 2010-08-18 | 中兴通讯股份有限公司 | 一种实现大数据冲击的自动化测试的方法和系统 |
CN100451988C (zh) * | 2006-11-14 | 2009-01-14 | 无敌科技(西安)有限公司 | 一种实现单元测试的方法及系统 |
CN102375103A (zh) * | 2010-08-27 | 2012-03-14 | 富泰华工业(深圳)有限公司 | 电子产品测试装置及方法 |
CN102375103B (zh) * | 2010-08-27 | 2015-07-29 | 富泰华工业(深圳)有限公司 | 电子产品测试装置及方法 |
CN103593277A (zh) * | 2012-08-15 | 2014-02-19 | 深圳市世纪光速信息技术有限公司 | 日志处理方法及系统 |
CN104050081A (zh) * | 2014-06-09 | 2014-09-17 | 汉柏科技有限公司 | 调试静态库函数的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN1273897C (zh) | 2006-09-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1273897C (zh) | 一种单元测试自动化方法 | |
US5170465A (en) | Incremental-scanning compiler for source-code development system | |
US5182806A (en) | Incremental compiler for source-code development system | |
US6442660B1 (en) | Dynamic system relocation based on availability of system memory | |
US5201050A (en) | Line-skip compiler for source-code development system | |
US5313387A (en) | Re-execution of edit-compile-run cycles for changed lines of source code, with storage of associated data in buffers | |
US5193191A (en) | Incremental linking in source-code development system | |
US5581697A (en) | Method and apparatus for run-time error checking using dynamic patching | |
US7962832B2 (en) | Method for detecting memory error | |
US7284237B2 (en) | Testing flow control at test assertion level | |
JP2000181725A (ja) | 実行可能なコ―ドを改変し、追加機能を付与するための方法およびシステム | |
CN101334753B (zh) | 一种单元测试方法及其装置 | |
CN112084113B (zh) | 基于嵌入式仿真验证软件的可配置自动化测试方法及系统 | |
US20050223360A1 (en) | System and method for providing a generic user interface testing framework | |
CN105354045A (zh) | 补丁的制作方法及装置、补丁的激活方法及装置 | |
US20050229161A1 (en) | Generic user interface testing framework with load-time libraries | |
CN115617687B (zh) | 程序插桩方法、装置、设备和存储介质 | |
US5301327A (en) | Virtual memory management for source-code development system | |
US20050228644A1 (en) | Generic user interface testing framework with rules-based wizard | |
US6519768B1 (en) | Instruction translation method | |
CN110069414B (zh) | 回归测试方法及系统 | |
EP0406028A2 (en) | Incremental compiler for source code development system | |
KR0125605B1 (ko) | 프로그램의 아키덱쳐 변환방법 및 장치와 그 방법 및 장치를 사용하여 프로그램의 동작을 검증하는 방법 및 장치 | |
US6178547B1 (en) | Method and apparatus for generating non-redundant symbolic debug information in computer programs | |
CN109144849A (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 | ||
C17 | Cessation of patent right | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20060906 Termination date: 20131104 |