欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

程序插桩-实例

程序员文章站 2024-03-19 08:50:52
...

本文主要介绍插装的实例,在测试分类下已经简单介绍了程序插装的基本概念以及插装的位置,更多知识可以查看程序插装相关文献,现将整个插装的流程通过一段C语言程序进行实例说明。

  • 注:还处于学习阶段,实例较简单,内容尚待改进,错误之处请指出。

步骤一: Visual studio 编辑代码

1.file->new->project,弹出的窗口中选择第一项W32 console application,如下图所示:

程序插桩-实例

2.对窗口下方的项目名称及存储位置进行编辑后,点击OK,对弹出的窗口点击next,对empty project选项进行勾选,如下图所示:

程序插桩-实例

3.在右侧窗口下方的源文件处鼠标右键,选择add->new item,如下图所示:

程序插桩-实例

4.在弹出的窗口中选择C++ File,对文件进行命名,选择存储位置,点击add,如下图所示:

程序插桩-实例

步骤二:插装说明

采用网上一个说明,图片出处请点击链接,图片具体说明请点击链接,代码请看上一篇博文:控制流图、圈复杂度

程序插桩-实例

该图片中的虚线内容是在源程序的基础上新添加计数语句,用于说明程序的执行情况。

步骤三:插装实例

* 以计算分支覆盖率为例
* 在有关插装的博文中,可以了解到插装主要是在程序的入口处、分支处添加计数语句,我理解的就是添加打印语句,打印语句中包含分支的计数、程序所经历的分支说明,通过多个测试用例,检测代码是否将所有的分支都走了一遍,全部走完即为分支覆盖率百分之百。

下面是我作业中所使用的一部分代码内容:

void menu()
{
    int choice;
    printf("\n\t\t******************** 主菜单 ********************");
    printf("\n\t\t*********** 1-添加纪录 2-查询纪录 ************");
    printf("\n\t\t*********** 3-删除纪录 4-修改记录 ************");
    printf("\n\t\t*********** 5-显示纪录 6-退出系统 ************");
    printf("\n\t\t************************************************");
    printf("\n\t\t请选择:");
    scanf("%d", &choice);
    rewind(stdin);
    printf("\n");
    switch (choice)
    {
    case 1:
        head = insert(head);
        rewind(stdin);
        menu();
        break;
    case 2:
        search(head);
        rewind(stdin);
        menu();
        break;
    case 3:
        head = delet(head);
        rewind(stdin);
        menu();
        break;
    case 4:
        head = alter(head);
        rewind(stdin);
        menu();
        break;
    case 5:
        show(head);
        rewind(stdin);
        menu();
        break;
    default:
        printf("\n\t\t谢谢使用!!");
        break;
    }
}

在上述分支处添加计数语句:

void menu()
{
    int choice;
    printf("\n\t\t******************** 主菜单 ********************");
    printf("\n\t\t*********** 1-添加纪录 2-查询纪录 ************");
    printf("\n\t\t*********** 3-删除纪录 4-修改记录 ************");
    printf("\n\t\t*********** 5-显示纪录 6-退出系统 ************");
    printf("\n\t\t************************************************");
    printf("\n\t\t分支数为:%d\n", i); /*插装探针*/
    printf("\n\t\t请选择:");
    scanf("%d", &choice);
    rewind(stdin);
    printf("\n");
    switch (choice)
    {
    case 1:
        printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
        head = insert(head);
        rewind(stdin);
        menu();
        break;
    case 2:
        printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
        search(head);
        rewind(stdin);
        menu();
        break;
    case 3:
        printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
        head = delet(head);
        rewind(stdin);
        menu();
        break;
    case 4:
        printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
        head = alter(head);
        rewind(stdin);
        menu();
        break;
    case 5:
        printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
        show(head);
        rewind(stdin);
        menu();
        break;
    default:
        printf("\n\t\t分支:%d\n", ++i); /*插装探针*/
        printf("\n\t\t谢谢使用!!");
        break;
    }
}
  • 计算语句覆盖率做法与之相同,为了节省探针的个数,需要将代码分块,在每一块的入口处或出口处添加计数语句或打印语句,对执行情况进行说明。