【技术实现步骤摘要】
一种基于动态插桩
‑
销桩技术的异步测试方法
[0001]本专利技术属于软件测试
,尤其涉及一种基于动态插桩
‑
销桩技术的异步测试方法。
技术介绍
[0002]现有测试技术中,为获取软件中间状态,通常会采用插桩技术。即在程序执行代码的内部嵌入测试模块,或着嵌入程序跳转代码以便转到指定测试程序。
[0003]插桩方式分两类:
[0004]a)静态插桩
[0005]利用编译过程将桩代码插入程序。实现方法有两种:在源代码中插入桩源代码然后编译成二进制代码,称为源代码插桩方式;在编译过程中编译器嵌入二进制代码,称为二进制插桩方式。
[0006]b)动态插桩
[0007]利用程序运行期间加载桩代码到程序进程空间,并在测试点处执行测试程序。实现方法有两种:通过设置断点并在断点处跳转到测试桩程序,称为断点方式;另一种通过加载时修改测试点处代码,插入桩代码,称为注入方式。
[0008]静态插桩在传统软件测试中使用较多,典型的例子就是通过插入print语句输出变量,也可采用更复杂的处理。静态插桩增大软件程序映像,加载后,运行所有可达桩代码,对软件运行性能影响较大。
[0009]动态插桩不会导致软件程序映像发生改变,并且非常灵活,对软件运行性能影响则有插桩策略决定。
[0010]断点方式多次调用INT3系统中断,也会造成程序运行速度变慢。由于系统中断不能嵌套调用,否则导致测试过程发生异常。。
[0011]注入方式的动态插桩具有 ...
【技术保护点】
【技术特征摘要】
1.一种基于动态插桩
‑
销桩技术的异步测试方法,其特征在于,包括以下步骤:步骤1:通过测试管理器调用桩处理例程,在程序加载和运行阶段,根据配置文件中的插桩点配置信息,在编译后的二进制机器代码上指定地址上修改代码,并保存原有代码;更改该地址内容使其指向桩处理例程在内存中注入的桩代码,通过桩代码关联配置信息指定的测试程序;桩代码在被测软件所在的进程中运行;步骤2:被测软件执行到插桩点地址上后转到插桩点插入的代码中执行,该段代码处理被测软件上下文,获取软件的运行状态,全局变量和函数参数,并传递给触发的测试程序;测试程序在被测软件的进程中运行,或在被测软件的进程外运行;步骤3:当检测点被触发时,相关联的测试程序执行测试用例,将测试用例参数和相关全局变量值传递给被测软件,当观察点被触发时,测试程序收集测试输出,并将测试输出通过进程间通信协议发送到验证处理进程中进行处理;然后测试程序选择执行销桩或增加插桩操作;步骤4:验证处理进程运行系统的验证处理模块;当该进程接到新的测试输出,便启动一个测试验证任务并加入到任务队列中;验证执行线程从队列中将每一个测试验证任务取出执行,返回的测试验证结果如果为通过,则发送给测试管理器;当结果验证出现不通过或异常情况,利用异常处理机制返回测试管理器进行处理;当测试输出持续到达就持续进行新增测试验证任务并加入到任务队列,直到不再有测试输出到达;此后将队列中的测试验证任务依次取出处理,直到队列为空;步骤5:验证进程分析测试输出并与预期结果进行比较,决定测试是否通过;如果测试不通过则发送消息给测试管理器,停止测试的执行;如果测试通过则暂存测试结果,确定是否请求销除插桩点的操作或增加插桩点的操作,确定执行销桩或增加插桩操作;确定是否产生动态测试用例和动态预期,如果确定则执行动态测试用例处理;步骤6:测试管理器检查被测软件没有结束运行,则继续执行被测软件,如果被测软件结束运行,则保存和输出测试结果。2.根据权利要求1所述的一种基于动态插桩
‑
销桩技术的异步测试方法,其特征在于,所述销桩或增加插桩操作具体为:A1:测试程序通过桩处理例程增加插桩点,根据在编译后的二进制机器代码上指定地址上修改代码,并保存原有代码,更改该地址内容使其指向桩处理例程在内存中注入的桩代码,通过桩代码关联配置信息指定的测试程序;测试程序连续调用桩处理例程进行插桩,形成相互关联的多个插桩点;当被测软件触发插桩点并调用测试程序后,当前执行的测试脚本设置新的插桩点,形成嵌套插桩;插桩遵循桩处理策略进行;A2:测试程序通过桩处理例程删除插桩点;在函数或待测代码片段结束时,将修改的代码为被测软件恢复原来的代码,继续执行被测软件未插桩前的代码,同时清除无用的桩代码;这称为销桩;在测试程序中连续调用销桩操作,并解除嵌套插桩;销桩遵循桩处理策略进行;A3:当此段测试程序执行完后,流程将回到被测软件执行,直到下一个插桩点被触发。3.根据权利要求2所述的一种基于动态插桩
‑
销桩技术的异步测试方法,其特征在于,所述桩处理策略包括桩计数机制和生存周期;桩计数机制用于插桩和销桩的过程中,具体为:桩处理模块维持一个桩计数列表,为每
个创建的插桩点保存计数值和生存周期值,并按插桩顺序排序;当某个插桩点被创建时,在桩计数列表中新建节点,初始计数值为1,生存周期值为0;当某个插桩点再次被调用时,对应的桩计数增加1,而某个插桩点不再使用时,桩计数减1;如果某个插桩点的桩计数为0,则删除该插桩点的插桩代码,恢复插桩点原来的代码,并且把该插桩点在桩计数列表中的节点信息删除;每个插桩点都有生存周期,用64位无符号整数表示;大于0的数值代表指定的生存周期;每个插桩点的桩计数等于生存周期值时将在桩代码和关联测试程序执行完毕对该插桩点进行销桩;数值0为初始值,代表不限时的生存周期;测试程序根据需要设置生存周期条件:如果某个插桩点需要多次观察而测试程序运行结束后不销桩的话,设定其生存周期值来决定插桩点接下来使用多久;如果生存周期值为某个正整数,当桩计数到达该整数后,对该插桩点测试程序运行结束后进行销桩;如果设置生存周期值为0,则该插桩点在测试过程中不会被删除;如果插桩点代码出现异常,按后面的插桩点造...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。