CN101561777A - 一种实现覆盖率测试的系统和方法 - Google Patents
一种实现覆盖率测试的系统和方法 Download PDFInfo
- Publication number
- CN101561777A CN101561777A CNA2008100665974A CN200810066597A CN101561777A CN 101561777 A CN101561777 A CN 101561777A CN A2008100665974 A CNA2008100665974 A CN A2008100665974A CN 200810066597 A CN200810066597 A CN 200810066597A CN 101561777 A CN101561777 A CN 101561777A
- Authority
- CN
- China
- Prior art keywords
- instruction
- code
- module
- ready
- source code
- 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
Links
Images
Abstract
本发明公开了一种实现覆盖率测试的系统和方法,应用于多种操作系统实现覆盖率统计。其系统包括:与被测模块连接的源代码分析器,用于对所述被测模块进行源代码分析并统计所述被测模块中需要测试的指令的总数;与所述被测模块连接的代码植入器,用于对所述被测模块中需要测试的指令前插入代码打点程序并对插入代码打点程序的源代码进行重新编译;与所述被测模块连接的代码打点模块,用于记录代码打点程序调用次数;与所述源代码分析器和代码打点模块连接的计算模块,用于计算所述打点程序调用次数与指令的总数之间的比值并输出。本发明是在分析源代码的基础上进行覆盖率的测试,因此可应用于不同的操作系统,提高了兼容性能和实用性能。
Description
技术领域
本发明涉及一种通讯领域的白盒测试技术,尤其涉及的是,一种覆盖率测试系统和方法。
背景技术
白盒测试,也称结构测试或逻辑驱动测试,是在软件编码阶段,按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。白盒测试是软件生存周期中一个独立的,关键的阶段,代表了规约、设计和编码的最终检查,也是保证软件质量的重要手段。
覆盖率统计是白盒测试中衡量测试用例以及代码的关键指标参数,包括语句覆盖率、分支覆盖率、条件覆盖率、函数覆盖率,
语句覆盖率=至少被执行一次的语句数量/可执行的语句总数,
分支覆盖率=分支结果被执行的次数/分支结果总数,
条件覆盖率=条件操作数值至少被评价一次的数量/条件操作数值的总数;
函数覆盖率=已覆盖的函数调用个数/全部函数调用个数。
目前的覆盖率统计的方法是在可执行文件插入监视代码,即对不同的操作系统用不同的可执行文件找到函数入口插入代码,在重定位代码位置后进行统计。对可执行文件植入代码存在以下问题:不同的操作系统必须使用不同的可执行文件,例如,Windows操作系统的可执行文件是PE文件(Portable Executable,可移植的执行体,是Windows操作系统自身所带的执行体文件格式),对其他系统不适用,如UNIX操作系统、XENIX操作系统、LINUX操作系统中就必须另做该系统相应的可执行文件;而且,可执行文件的文件格式复杂,难以分析;代码插入后需要重新定位,重新定位难度大。因此,现有技术还存在缺陷,有待于改进和发展。
发明内容
本发明解决的技术问题是提供一种实现覆盖率测试的系统和方法,能够应用于多种操作系统的实现覆盖率统计。
为解决上述技术问题,本发明采用以下方案:
一种实现覆盖率测试的系统,包括:与被测模块连接的源代码分析器,用于对所述被测模块进行源代码分析并统计所述被测模块中需要测试的指令的总数;与所述被测模块连接的代码植入器,用于对所述被测模块中需要测试的指令前插入代码打点程序并对插入代码打点程序的源代码进行重新编译;与所述被测模块连接的代码打点模块,用于记录代码打点程序调用次数;与所述源代码分析器和代码打点模块连接的计算模块,用于计算所述打点程序调用次数与指令的总数之间的比值并输出。
所述的系统,其中,所述源代码分析器包括:与被测模块连接的源代码解析模块,用于解析源代码结构;与所述源代码解析模块连接的指令分类模块,用于对所述源代码中的指令类型进行识别;与所述指令分类模块连接的指令统计模块,用于分别统计和存储每种类型的指令的总数。
所述的系统,其中,所述代码打点模块包括:与所述被测模块连接的统计代码打点模块,用于记录所述代码打点程序的调用次数;与所述统计模块连接的存储模块,用于存储所述代码打点程序的调用次数。
所述的系统,其中,所述需要测试的指令包括:语句指令、分支指令、条件指令、函数指令、路径指令。
本发明还提供一种实现覆盖率测试的方法,包括以下步骤:S1、分析源代码、统计需要测试的指令的总数;S2、在所述需要测试的指令前插入代码打点程序;S3、对插入代码打点程序的源代码进行重新编译;S4、运行代码打点程序插入后的源代码,记录代码打点程序的调用次数;S5、计算代码打点程序的调用次数与需要测试的指令的总数的比值并输出。
所述的方法,其中,所述需要测试的指令包括:语句指令、分支指令、条件指令、函数指令、路径指令。
所述的方法,其中,所述步骤S1包括:S11、解析源代码结构;S12、对所述源代码中的指令类型进行识别;所述类型包括语句指令、分支指令、条件指令、函数指令、路径指令;S13、按照所述指令的不同类型,分别统计每种类型的指令的总数。
本发明所提供的一种实现覆盖率测试的系统和方法,与现有技术相比,由于是在分析源代码的基础上进行覆盖率的测试,因此可应用于不同的操作系统,提高了兼容性能和实用性能。
附图说明
图1是本发明实现覆盖率测试的系统的示意图;
图2是本发明的系统中的源代码分析器、代码植入器和代码打点模块的示意图;
图3是本发明实现覆盖率测试的方法的流程图。
具体实施方式
下面结合具体实施方式和附图对本发明作进一步详细的描述。
如图1所示,本发明提供一种实现覆盖率测试的系统包括:与被测模块连接的源代码分析器、代码植入器和代码打点模块,以及与源代码分析器和代码打点模块连接的计算模块。
所述源代码分析器用于对所述被测模块进行源代码分析并统计所述被测模块中需要测试的指令的总数;按照指令类型的不同,其中分为不同类型指令的分析子模块,见图2,其中包括:赋值语句分析子模块,用于分析和统计赋值语句指令的总数;分支分析子模块,用于分析和统计分支指令的总数;条件分析子模块,用于分析和统计条件指令的总数;函数分析子模块,用于分析和统计函数指令的总数;路径分析子模块,用于分析和统计路径指令的总数。所述每个分析子模块包括:与被测模块连接用于解析源代码结构的源代码解析模块;与所述源代码解析模块连接用于对所述源代码中的指令类型进行识别的指令分类模块;与所述指令分类模块连接用于分别统计和存储每种类型的指令的总数的指令统计模块。
与所述被测模块连接的代码植入器,用于对被测模块中需要测试的指令前插入代码打点程序并对插入代码打点程序的源代码进行重新编译;其中插入代码打点程序包括:在赋值语句指令前插入赋值语句代码打点子程序、在分支指令前插入分支代码打点子程序、在条件指令前插入条件代码打点子程序、在函数指令前插入函数代码打点子程序。
与所述被测模块连接的代码打点模块,用于记录代码打点程序调用次数;按照指令类型的不同,运行重新编译的源代码,分别记录赋值语句代码打点子程序的调用次数、分支代码打点子程序的调用次数、条件代码打点子程序的调用次数、函数代码打点子程序的调用次数。所述代码打点模块包括:与所述被测模块连接的打点统计模块,用于记录所述代码打点程序的调用次数;与所述统计模块连接的存储模块,用于存储所述代码打点程序的调用次数。
与所述源代码分析器和代码打点模块连接的计算模块,用于计算所述打点程序调用次数与指令的总数之间的比值并输出,按照指令类型的不同,分别进行以下计算:用赋值语句代码打点子程序的调用次数与赋值语句指令的总数的相比计算语句覆盖率;用分支代码打点子程序的调用次数与分支指令的总数的相比计算分支覆盖率;用条件代码打点子程序的调用次数与条件指令的总数的相比计算条件覆盖率;用函数代码打点子程序的调用次数与函数指令的总数的相比计算函数覆盖率。
本发明还提供一种实现覆盖率测试的方法,如图3所示,有以下步骤:
100、分析原代码、计算需要测试的指令的总数;本步骤包括以下分步骤:
110、解析源代码结构;
120、对源代码中的指令类型进行识别;识别指令的类型作为后续步骤的依据;类型包括赋值语句指令、分支指令、条件指令、函数指令、路径指令。
130、按照所述指令的不同类型,分别统计每种类型的指令的总数。包括赋值语句指令总数、分支指令总数、条件指令总数、函数指令总数、路径指令总数。
200、根据分析源代码的分析结果,按照所述指令的不同类型,分别在每种类型的指令前插入代码打点程序;包括在赋值语句指令前插入赋值语句代码打点子程序、在分支指令前插入分支代码打点子程序、在条件指令前插入条件代码打点子程序、在函数指令前插入函数代码打点子程序。
300、对插入代码打点程序的源代码进行重新编译;
400、运行插入代码打点程序的源代码,按照所述指令的不同类型,分别记录每种类型的指令前插入代码打点程序的调用次数,例如,赋值语句代码打点子程序、分支代码打点子程序、条件代码打点子程序、函数代码打点子程序;并且在运行过程中,记录代码当前运行文件和运行行数,记录到日志文件。
500、按照所述指令的不同类型,分别计算代码打点程序的调用次数与需要测试的指令的总数的比值并输出。
步骤200、300、400可在C语言环境中的实现,例如采用如下程序段:
代码插入原理如以下函数代码
int i=printf(”I am here”);
void*ptr=&printf;
源码经过插装改造,变为:
int i=(TestCoverage(),printf)(”I am here”);
void*ptr=&(TestCoverage(),printf);
其中,TestCoverage()是插入的打点函数。
借助C语言的逗号表达式实现插装,跟据ANSI C规范,逗号表达式的结果值是最后一个表达式的计算值,比如“expr1,exprt2,expr3”,这3个表达式依次运算,最后返回值是expr3的计算值。所以,不难看出,运行上述插装代码等效于插装前代码,只有一点差别,
每次printf函数调用前插装打点函数TestCoverage都被调用一次。
借助C语言的宏替换功能可以让插装过程变得很简单,比如:
#define printf(TestCoverage(),printf)
int i=printf(”I am here”);
void*ptr=&printf;
这样就完成函数的代码植入。
插入赋值语句代码打点子程序
根据代码分析结果,对赋值语句的代码植入和函数相同。如:
int avr=abs*8/numner;TestCoverage();
插入分支代码打点子程序
同理,将if、while、for等控制语句也按如下方式植入改造:
#define if(expr) if((expr)?if_TestCoverage 1():if;TestCoverage 0())
植入改造后,插装进去的打点函数(如if_TestCoverage 1、if_TestCoverage 0)在相应条件成立时就被执行。
插入条件代码打点子程序
对于条件覆盖统计,改造“&&”与“||”连接的条件子句,比如下面代码:
if(i>0&&i<100)printtf(”OK”);
改造成:
#define COND(expr) ((expr)?cond_ TestCoverage 1()i cond_TestCoverage 0())
if(COND(i>0)&&COND(i<100))printf_”OK”);
这样不同条件都用调用的不同的代码打点函数。
步骤300:源代码的重新编译。
步骤400:执行测试程序,代码打点函数执行,自动生成日志记录。
代码打点函数TestCoverage()实现原理:
根据ANSI C规范宏_FILE_和_LINE_分别记录当前代码的所在源代码文件名和行数,调用TestCoverage()函数时间获取宏值记录相关文件中。
应当理解的是,以上所提供的具体实施方式只是对本发明的说明,而不应当理解为对本发明的限制,对本领域的普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应为本发明所揭示的原理和特征,均属本发明的保护范围。
Claims (7)
1、一种实现覆盖率测试的系统,其特征在于,包括:与被测模块连接的源代码分析器,用于对所述被测模块进行源代码分析并统计所述被测模块中需要测试的指令的总数;
与所述被测模块连接的代码植入器,用于对所述被测模块中需要测试的指令前插入代码打点程序并对插入代码打点程序的源代码进行重新编译;
与所述被测模块连接的代码打点模块,用于记录代码打点程序调用次数;
与所述源代码分析器和代码打点模块连接的计算模块,用于计算所述打点程序调用次数与指令的总数之间的比值并输出。
2、根据权利要求1所述的系统,其特征在于,所述源代码分析器包括:与被测模块连接的源代码解析模块,用于解析源代码结构;与所述源代码解析模块连接的指令分类模块,用于对所述源代码中的指令类型进行识别;与所述指令分类模块连接的指令统计模块,用于分别统计和存储每种类型的指令的总数。
3、根据权利要求1所述的系统,其特征在于,所述代码打点模块包括:与所述被测模块连接的打点统计模块,用于记录所述代码打点程序的调用次数;与所述统计模块连接的存储模块,用于存储所述代码打点程序的调用次数。
4、根据权利要求1所述的系统,其特征在于,所述需要测试的指令包括:语句指令、分支指令、条件指令、函数指令、路径指令。
5、一种实现覆盖率测试的方法,包括以下步骤:
S1、分析源代码、统计需要测试的指令的总数;
S2、在所述需要测试的指令前插入代码打点程序;
S3、对插入代码打点程序的源代码进行重新编译;
S4、运行代码打点程序插入后的源代码,记录代码打点程序的调用次数;
S5、计算代码打点程序的调用次数与需要测试的指令的总数的比值并输出。
6、根据权利要求1所述的方法,其特征在于,所述需要测试的指令包括:语句指令、分支指令、条件指令、函数指令、路径指令。
7、根据权利要求1所述的方法,其特征在于,所述步骤S1包括:
S11、解析源代码结构;
S12、对所述源代码中的指令类型进行识别;所述类型包括语句指令、分支指令、条件指令、函数指令、路径指令;
S13、按照所述指令的不同类型,分别统计每种类型的指令的总数。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2008100665974A CN101561777A (zh) | 2008-04-14 | 2008-04-14 | 一种实现覆盖率测试的系统和方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CNA2008100665974A CN101561777A (zh) | 2008-04-14 | 2008-04-14 | 一种实现覆盖率测试的系统和方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN101561777A true CN101561777A (zh) | 2009-10-21 |
Family
ID=41220589
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA2008100665974A Pending CN101561777A (zh) | 2008-04-14 | 2008-04-14 | 一种实现覆盖率测试的系统和方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN101561777A (zh) |
Cited By (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012858A (zh) * | 2010-06-29 | 2011-04-13 | 北京飞天诚信科技有限公司 | 一种模拟软件运行的方法 |
CN102830345A (zh) * | 2011-06-15 | 2012-12-19 | 中国科学院电子学研究所 | 一种基于配置词典的fpga测试配置分析评价方法 |
CN103019933A (zh) * | 2012-11-27 | 2013-04-03 | 网宿科技股份有限公司 | 测试用例覆盖度自动识别方法及装置 |
CN103092748A (zh) * | 2011-11-07 | 2013-05-08 | 阿里巴巴集团控股有限公司 | 一种确定需要进行回归测试的测试用例的方法及系统 |
CN103425573A (zh) * | 2012-05-24 | 2013-12-04 | 腾讯科技(深圳)有限公司 | 代码测试信息收集方法及系统 |
CN103488460A (zh) * | 2013-09-04 | 2014-01-01 | 用友软件股份有限公司 | 自动标记源代码的系统和方法 |
CN103631707A (zh) * | 2012-08-27 | 2014-03-12 | 腾讯科技(深圳)有限公司 | 一种获取代码覆盖率的方法及装置 |
CN103699476A (zh) * | 2012-09-27 | 2014-04-02 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法及系统 |
CN103870383A (zh) * | 2012-12-11 | 2014-06-18 | 航天信息股份有限公司 | 基于jvm的测试覆盖率统计方法及系统 |
CN106155897A (zh) * | 2015-04-16 | 2016-11-23 | 腾讯科技(深圳)有限公司 | 一种业务处理方法及装置 |
CN106844219A (zh) * | 2017-02-15 | 2017-06-13 | 腾讯科技(深圳)有限公司 | 应用检测方法及应用检测装置 |
CN107704383A (zh) * | 2017-09-12 | 2018-02-16 | 中国航空工业集团公司洛阳电光设备研究所 | 一种基于任务栈分析的动态测试函数覆盖率获取方法 |
CN107870860A (zh) * | 2017-05-05 | 2018-04-03 | 平安科技(深圳)有限公司 | 埋点验证系统及方法 |
CN108121653A (zh) * | 2016-11-29 | 2018-06-05 | 华为技术有限公司 | 测试程序性能的方法及装置 |
CN110209582A (zh) * | 2019-05-31 | 2019-09-06 | 口碑(上海)信息技术有限公司 | 代码覆盖率的统计方法及装置、电子设备、存储介质 |
CN112214414A (zh) * | 2020-10-29 | 2021-01-12 | 平安银行股份有限公司 | 基于自动化测试的覆盖率处理方法、装置、设备及介质 |
CN112214414B (zh) * | 2020-10-29 | 2024-05-17 | 平安银行股份有限公司 | 基于自动化测试的覆盖率处理方法、装置、设备及介质 |
-
2008
- 2008-04-14 CN CNA2008100665974A patent/CN101561777A/zh active Pending
Cited By (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102012858A (zh) * | 2010-06-29 | 2011-04-13 | 北京飞天诚信科技有限公司 | 一种模拟软件运行的方法 |
CN102012858B (zh) * | 2010-06-29 | 2012-12-12 | 飞天诚信科技股份有限公司 | 一种模拟软件运行的方法 |
CN102830345A (zh) * | 2011-06-15 | 2012-12-19 | 中国科学院电子学研究所 | 一种基于配置词典的fpga测试配置分析评价方法 |
CN102830345B (zh) * | 2011-06-15 | 2017-03-22 | 中国科学院电子学研究所 | 一种基于配置词典的fpga测试配置分析评价方法 |
CN103092748A (zh) * | 2011-11-07 | 2013-05-08 | 阿里巴巴集团控股有限公司 | 一种确定需要进行回归测试的测试用例的方法及系统 |
CN103425573A (zh) * | 2012-05-24 | 2013-12-04 | 腾讯科技(深圳)有限公司 | 代码测试信息收集方法及系统 |
CN103425573B (zh) * | 2012-05-24 | 2017-02-08 | 腾讯科技(深圳)有限公司 | 代码测试信息收集方法及系统 |
CN103631707A (zh) * | 2012-08-27 | 2014-03-12 | 腾讯科技(深圳)有限公司 | 一种获取代码覆盖率的方法及装置 |
CN103631707B (zh) * | 2012-08-27 | 2018-01-30 | 腾讯科技(深圳)有限公司 | 一种获取代码覆盖率的方法及装置 |
CN103699476A (zh) * | 2012-09-27 | 2014-04-02 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法及系统 |
CN103699476B (zh) * | 2012-09-27 | 2018-07-27 | 腾讯科技(深圳)有限公司 | 覆盖率测试方法及系统 |
CN103019933B (zh) * | 2012-11-27 | 2016-01-13 | 网宿科技股份有限公司 | 测试用例覆盖度自动识别方法及装置 |
CN103019933A (zh) * | 2012-11-27 | 2013-04-03 | 网宿科技股份有限公司 | 测试用例覆盖度自动识别方法及装置 |
CN103870383A (zh) * | 2012-12-11 | 2014-06-18 | 航天信息股份有限公司 | 基于jvm的测试覆盖率统计方法及系统 |
CN103488460A (zh) * | 2013-09-04 | 2014-01-01 | 用友软件股份有限公司 | 自动标记源代码的系统和方法 |
CN103488460B (zh) * | 2013-09-04 | 2015-12-02 | 用友网络科技股份有限公司 | 自动标记源代码的系统和方法 |
CN106155897A (zh) * | 2015-04-16 | 2016-11-23 | 腾讯科技(深圳)有限公司 | 一种业务处理方法及装置 |
CN108121653A (zh) * | 2016-11-29 | 2018-06-05 | 华为技术有限公司 | 测试程序性能的方法及装置 |
CN106844219A (zh) * | 2017-02-15 | 2017-06-13 | 腾讯科技(深圳)有限公司 | 应用检测方法及应用检测装置 |
CN106844219B (zh) * | 2017-02-15 | 2021-02-02 | 腾讯科技(深圳)有限公司 | 应用检测方法及应用检测装置 |
CN107870860A (zh) * | 2017-05-05 | 2018-04-03 | 平安科技(深圳)有限公司 | 埋点验证系统及方法 |
CN107704383A (zh) * | 2017-09-12 | 2018-02-16 | 中国航空工业集团公司洛阳电光设备研究所 | 一种基于任务栈分析的动态测试函数覆盖率获取方法 |
CN110209582A (zh) * | 2019-05-31 | 2019-09-06 | 口碑(上海)信息技术有限公司 | 代码覆盖率的统计方法及装置、电子设备、存储介质 |
CN112214414A (zh) * | 2020-10-29 | 2021-01-12 | 平安银行股份有限公司 | 基于自动化测试的覆盖率处理方法、装置、设备及介质 |
CN112214414B (zh) * | 2020-10-29 | 2024-05-17 | 平安银行股份有限公司 | 基于自动化测试的覆盖率处理方法、装置、设备及介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101561777A (zh) | 一种实现覆盖率测试的系统和方法 | |
CN101739339B (zh) | 一种基于程序动态依赖关系的软件故障定位方法 | |
US5651111A (en) | Method and apparatus for producing a software test system using complementary code to resolve external dependencies | |
Schäfer et al. | An empirical evaluation of using large language models for automated unit test generation | |
US20050160324A1 (en) | Automatic generation of baysian diagnostics from fault trees | |
US20140143762A1 (en) | Symbolic execution of dynamic programming languages | |
CN104035873A (zh) | 测试代码生成方法及生成装置 | |
CN101751281A (zh) | 编译器生成系统和方法 | |
CN101714098A (zh) | 通过修改跟踪操作减少跟踪开销 | |
Brahmi et al. | Formalise to automate: deployment of a safe and cost-efficient process for avionics software | |
KR20230019191A (ko) | 소프트웨어 검증 방법 및 이를 위한 장치 | |
CN108595334A (zh) | 一种计算Java程序动态切片的方法、装置及可读存储介质 | |
CN110347588B (zh) | 软件验证方法、装置、计算机设备和存储介质 | |
US20190303279A1 (en) | Modeling system | |
US20150020051A1 (en) | Method and apparatus for automated conversion of software applications | |
US8434071B2 (en) | Method for translating a graphical workflow in a textual description | |
Duffy et al. | Exploiting the Clang AST for analysis of C++ applications | |
CN110347610B (zh) | 一种嵌入式代码调试系统及方法 | |
Brahmi et al. | Industrial use of a safe and efficient formal method based software engineering process in avionics | |
CN108132799A (zh) | 过程间静态程序分析信息提取方法、装置及设备 | |
Schmidt-Schauß et al. | Space improvements and equivalences in a functional core language | |
De Vos et al. | Epispin: An eclipse plug-in for promela/spin using spoofax | |
CN113448874A (zh) | 一种单元测试脚本的生成方法及装置 | |
Dams et al. | Abstracting C with abC | |
Song et al. | Slicing executable system-of-systems models for efficient statistical verification |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Open date: 20091021 |