好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

c++test之桩函数功能.doc

4页
  • 卖家[上传人]:第***
  • 文档编号:32985403
  • 上传时间:2018-02-13
  • 文档格式:DOC
  • 文档大小:19KB
  • / 4 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、准备工作1. 桩函数的概念桩函数主要实现替代原函数的功能,使得单元测试过程中能将被测功能与外部依赖隔离桩函数是单元测试的常用技术,它主要目的有二:将被测试代码与集成环境隔离一是将不可控的、费时的实际系统隔离,例如访问网络、数据库、硬件等;二是将复杂的底层系统隔离,采用相对简单的模拟系统来代替当被调函数不会影响当前测试函数的功能行为的时候,桩函数能够被使用,以使得单元测试的效率更高2. 桩函数的分类C++test 中桩函数按如下分类:自定义桩函数:用户自定义的桩函数,自定义桩函数以"CppTest_Stub_"为前缀,如:/* C++test user stub definition for int doSomething(int i) */int ::CppTest_Stub_doSomething(int i){return i + 10;}安全桩函数:当代码中有使用到一些“危险”的函数,如(rmdir(), remove(), rename()等) ,C++test 将自动生成安全桩函数,用以替换 “危险”函数如果使用者不希望 C++test 自动生成安全桩函数,则可以在 Test Configuration 窗口中,选择 Execution 面板,从 Use stubs found in 删去${cpptest:cfg_dir}/safestubs,如图 1-1 所示:自动生成的桩函数:C++test 中提供一个测试配置,用户只需点击该配置即可针对所选择源文件或者原工程自动生成桩函数。

      自动生成的桩函数与自定义的桩函数其主要差别在于:自定义的桩函数调用优先级别高于原函数,原函数的优先级别高于自动生成的桩函数举个例子,假定在代码中能够找到某个函数的原本定义,此时自动生成桩函数是无效的,因为原函数优先级别高于自动生成的桩函数自定义桩函数可以带来的好处在于:调用原函数可能其返回值为一个固定值,不能返回一个期望值,以使得测试不同的代码分支而桩函数的返回值,可由用户自由控制,因而具备更大的灵活性3. 导入待测工程按照前面介绍的方法导入 StubExample 工程作为待测工程,由于该工程中涉及到头文件问题,故在使用桩函数过程时需要留意包含头文件语句的路径问题二、C++test 之桩函数功能1.运行单元测试(1)按照前面介绍的方法对 StubExample 工程生成单元测试,然后运行单元测试,会发现没有任务报告,查看 console(控制台)会发现连接错误,如图 2-1 所示2)从源代码中,我们可以找到该发生链接错误的函数:extern Buttons waitForUserChoice ();该函数只声明未定义,这种情况下,我们要及时测试当前的代码,即可利用 C++test 自动生成桩函数的功能。

      2.配置桩函数在 C++test 下拉菜单中选 Test Configurations(测试配置),选择左边的 Builtin(内置)->Unit Testing(单元测试)->File Scope(文件范围)->Generate Stubs(生成桩函数),右键单击Generate Stubs,选择 Duplicate(副本),单击 Close 关闭窗口,如图 2-2 所示3.生成桩函数(1)右键单击 StubExample 工程,选择 C++test->Test Using(使用测试)->User-Defined(用户定义)->Generate Stubs(生成桩函数) ,如图 2-3 所示2)生成了桩函数后,在工程浏览器的 StubExample 工程下会出现一个名为 stubs 的文件夹,如图 2-4 所示3)自动生成的桩函数中实现了 waitForUserChoice()函数,根据整个工程的内部结构会发现,该函数需包含头文件 stubexample.hpp,在此处,对于路径问题不甚了解的用户可以将问题简单化,直接将原工程中的 stubexample.hpp 拷贝到 C:\Documents and Settings\Administrator\Parasoft\cpptest\workspace\StubExample\stubs\autogenerated 下,即C++test 的工作区相应的位置,然后在 auto_1fbe126f.cpp 源代码中加入#include "stubexample.hpp"(不区分大小写) ,然后点击保存,如图 2-5 所示。

      4.查看结果在为桩函数添加了头文件后,选择 C++test->Test Using(使用测试)->User-Defined(用户定义)->Run Unit Tests(运行单元测试),从覆盖率信息中,可以发现函数user_input_handler_ex()中,部分代码行未被覆盖,如图 2-6 所示此时我们可以通过修改桩函数的内容,让该桩函数返回不同的返回值,从而使其能够覆盖所有代码行5.自定义桩函数(1)选择 StubExample 工程,右键单击 C++test ->Test Using(使用测试) -> Builtin(内置) -> Unit Testing(单元测试) -> Collect Stub Information(收集桩函数信息) ,如图 2-7所示2)在 C++test 下拉菜单中选择 Show View(显示视图)->Stubs(桩函数),如图 2-8 所示3)桩函数信息收集完后,查看桩函数面板,可以看到 waitForUserChoice()函数的Definition 为 Auto,表示该函数目前使用自动生成的桩函数,其他两个函数为 Original,为StubExample.cpp 中原有的函数,如图 2-9 所示。

      4)右键单击函数 waitForUserChoice(),选择 Create User Stub(创建用户桩函数) ,如图2-10 所示5) 在弹出的对话框中,键入自定义桩函数文件名称,如 userdefined.cpp,单击 Finish 完成,如图 2-11 所示6)打开新生成的 userdefined.cpp 源文件,修改桩函数内容,如下:::Buttons waitForUserChoice ();::Buttons CppTest_Stub_waitForUserChoice (void){if (CppTest_IsCurrentTestCase("test_user_input_handler_ex_1")){return ::BUTTON_CNCL; }else if(CppTest_IsCurrentTestCase("test_user_input_handler_ex_2")){return ::BUTTON_SUM; } else{return ::BUTTON_AVRG;} }然后可参照前面的生成桩函数(3) ,对 userdefined.cpp 添加头文件 stubexample.hpp,如图2-12 所示。

      7)添加了自定义桩函数后,再次运行单元测试,覆盖率提高到了 92%lilycheng。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.