CN1273897C - 一种单元测试自动化方法 - Google Patents
一种单元测试自动化方法 Download PDFInfo
- Publication number
- CN1273897C CN1273897C CN 02146712 CN02146712A CN1273897C CN 1273897 C CN1273897 C CN 1273897C CN 02146712 CN02146712 CN 02146712 CN 02146712 A CN02146712 A CN 02146712A CN 1273897 C CN1273897 C CN 1273897C
- Authority
- CN
- China
- Prior art keywords
- unit testing
- test
- data
- file
- script 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Stored Programmes (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种单元测试自动化方法,通过脚本文件控制被测试程序单元,其步骤为:测试脚本文件控制单元测试辅助模块;单元测试辅助模块控制被测试程序单元。脚本解释器解释执行测试脚本文件中的程序代码,根据程序代码的行为向数据交换文件中写入设置数据;被测试程序单元调用单元测试辅助模块中的功能函数;单元测试辅助模块中的功能函数读取数据交换文件中的设置数据,通过设置数据控制重新定义的关键字和函数的执行结果;单元测试辅助模块中的功能函数通过重新定义的关键字或函数控制被测试程序单元。从而提供通用简单的自动化单元测试过程,以实现提高单元测试的执行效率,方便回归测试,降低单元测试成本的目的。
Description
技术领域
本发明涉及单元测试领域,特别是一种单元测试自动化方法。
背景技术
单元测试是集中对由源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。单元测试检查每一个控制结构的分支以确保完全覆盖和最大可能的错误检查。
目前,一般通过在程序代码中增加测试代码、编写大量的桩函数和驱动函数的方法来完成单元测试。这种方法最大的问题就是需要修改大量的程序代码,而且测试过程不能自动化,测试的执行效率非常低。
单元测试是为了尽可能多的发现程序的错误,发现错误后,为了修正错误,是需要对程序代码进行修改的。每当程序代码被修改的时候,程序配置的某些方面(如文档或者数据)也会被修改。回归测试是对修改过的程序再重新测试一遍,以保证修改是正确的,同时保证所做的修改不会带来不可预料的行为或者新的错误。
由于测试过程不能自动进行,因此对于错误修改后的回归测试过程就会十分繁琐。必需将测试正确的测试用例再重新测试一遍,以确保修改是正确的,并且没有引入其他的错误。
对于一些难以模拟的情况,如内存分配失败时,因为根本无法执行到这些代码,所以其对应的代码处理分支在单元测试时就难以覆盖了。
测试完成,发布版本的时候,还需要从程序代码中删除大量的测试代码,这个过程往往复杂而且极易出错。
综上所述,测试过程的自动化将成为单元测试发展的方向。
发明内容
有鉴于此,本发明的目的在于提供一种单元测试自动化方法,实现单元测试过程的自动化,提高单元测试的效率。
为了达到上述目的,本发明提供了一种单元测试自动化方法,其特征在于:设置用于测试程序单元的测试脚本文件、用于对测试脚本文件进行解释和执行的脚本解释器、以驱动函数和桩函数封装的单元测试辅助模块,该方法包含以下步骤:
A、脚本解释器解释执行测试脚本文件中的程序代码,根据程序代码的执行结果向数据交换文件中写入设置数据;
B、被测试程序单元调用单元测试辅助模块中的功能函数,单元测试辅助模块中的功能函数读取数据交换文件中的设置数据,通过设置数据控制重新定义的关键字(如:if语句)和函数的执行结果。
较佳地,该方法进一步包括:测试脚本文件通过延时控制设置数据交换文件中数据生效的时间。
测试脚本文件可引用动态连接库中的函数。测试脚本文件与被测试程序单元进行信息交互,根据测试脚本文件调用的动态连接库函数,选择测试脚本文件当前程序代码后面的程序代码分支。
本发明通过将测试用桩函数和驱动函数封装成一个通用独立的单元测试辅助模块,并通过测试脚本文件控制桩函数和驱动函数,从而控制被测试程序单元。更进一步地,对于一些难以模拟的分支的覆盖(如:内存分配失败),可以通过控制被测试程序单元进入不同的运行流程来实现。提高了单元测试的执行效率,实现了单元测试过程的自动化,使单元测试简单通用;回归测试时,只需使用该测试脚本文件重新进行测试即可,大大简化了回归测试,降低了单元测试的成本。针对同一单元测试的测试脚本文件可以重复使用,不管是否由同一测试人员进行测试。
附图说明
图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 (3)
1、一种单元测试自动化方法,其特征在于:设置用于测试程序单元的测试脚本文件、用于对测试脚本文件进行解释和执行的脚本解释器、以驱动函数和桩函数封装的单元测试辅助模块,该方法包含以下步骤:
A、脚本解释器解释执行测试脚本文件中的程序代码,根据程序代码的执行结果向数据交换文件中写入设置数据;
B、被测试程序单元调用单元测试辅助模块中的功能函数,单元测试辅助模块中的功能函数读取数据交换文件中的设置数据,通过设置数据控制重新定义的关键字和函数的执行结果。
2、如权利要求1所述的单元测试自动化方法,其特征在于,所述测试脚本文件通过延时控制数据交换文件中设置数据生效的时间。
3、如权利要求1所述的单元测试自动化方法,其特征在于,该方法进一步包括:所述的测试脚本文件与被测试程序单元进行信息交互,根据测试脚本文件调用的动态连接库函数,选择测试脚本文件当前程序代码后面的程序代码分支。
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 CN1499374A (zh) | 2004-05-26 |
CN1273897C true 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) |
Families Citing this family (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100407162C (zh) * | 2004-09-30 | 2008-07-30 | 中兴通讯股份有限公司 | 一种具有测试柔性的集成软件测试方法 |
CN100401264C (zh) * | 2005-06-06 | 2008-07-09 | 华为技术有限公司 | 数据驱动的自动化测试***及方法 |
CN100401265C (zh) * | 2005-06-06 | 2008-07-09 | 华为技术有限公司 | 关键字驱动的自动化测试***及方法 |
DE102005036321A1 (de) * | 2005-07-29 | 2007-02-01 | Siemens Ag | Verfahren und Vorrichtung zum dynamischen Generieren von Testszenarien für komplexe rechnergesteuerte Systeme, z.B. für medizintechnische Anlagen |
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 | 无敌科技(西安)有限公司 | 一种实现单元测试的方法及*** |
CN102375103B (zh) * | 2010-08-27 | 2015-07-29 | 富泰华工业(深圳)有限公司 | 电子产品测试装置及方法 |
CN103593277A (zh) * | 2012-08-15 | 2014-02-19 | 深圳市世纪光速信息技术有限公司 | 日志处理方法及*** |
CN104050081B (zh) * | 2014-06-09 | 2017-09-12 | 汉柏科技有限公司 | 调试静态库函数的方法及*** |
-
2002
- 2002-11-04 CN CN 02146712 patent/CN1273897C/zh not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
CN1499374A (zh) | 2004-05-26 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1273897C (zh) | 一种单元测试自动化方法 | |
CN101799763B (zh) | 内核在线补丁的方法、装置和*** | |
US6442660B1 (en) | Dynamic system relocation based on availability of system memory | |
CN112084113B (zh) | 基于嵌入式仿真验证软件的可配置自动化测试方法及*** | |
US5170465A (en) | Incremental-scanning compiler for source-code development system | |
US5581697A (en) | Method and apparatus for run-time error checking using dynamic patching | |
US20030212983A1 (en) | Method and system for modifying executable code to add additional functionality | |
US7284237B2 (en) | Testing flow control at test assertion level | |
US20050223360A1 (en) | System and method for providing a generic user interface testing framework | |
CN101334753B (zh) | 一种单元测试方法及其装置 | |
CN105354045A (zh) | 补丁的制作方法及装置、补丁的激活方法及装置 | |
US20050229161A1 (en) | Generic user interface testing framework with load-time libraries | |
CN115617687B (zh) | 程序插桩方法、装置、设备和存储介质 | |
US20050228644A1 (en) | Generic user interface testing framework with rules-based wizard | |
CN114924737A (zh) | 一种电池管理***源代码集成测试方法、测试装置及电子设备 | |
KR0125605B1 (ko) | 프로그램의 아키덱쳐 변환방법 및 장치와 그 방법 및 장치를 사용하여 프로그램의 동작을 검증하는 방법 및 장치 | |
US7028294B2 (en) | Linking of applications into devices having overlays and shadow memories | |
CN109144849A (zh) | 一种嵌入式软件调测方法 | |
EP0801348A1 (en) | Method of monitoring the operation of a computer | |
CN111984329B (zh) | 一种boot引导软件标准化生成、执行方法及*** | |
CN113886145A (zh) | 基于片内flash且无需重新烧写的程序自备份方法 | |
CN112241268A (zh) | 一种keil工程的编译方法、***及设备 | |
CN114035920A (zh) | 一种dsp程序对称加载运行的方法及其装置 | |
CN100458719C (zh) | 基本输入输出***信息的获取及编辑方法及*** | |
CN100357908C (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 |