撸一个c++的测试工具(一、分析)

需求分析——采用技术——理论支持
在这里插入图片描述

1.需求分析

1.1团队代码开发工作流

1.规约、文档、需求分析原型设计
2.架构与编码 (代码版本管理系统Git/SVN)
3.代码审查、测试与调试【本篇主要任务】
4.发布、部署

1.2需要的功能
参考我上一篇博客收集到的现有工具来进行分析:
代码检查、评审、单元测试工具 大搜集

软件测试对象的6种分类:

单元测试(静态检查、动态测试)
集成测试
压力测试
回归测试
Alpha测试(系统测试)
Bete测试(交付测试)

  • IDE界面
    让使用者可以粘贴或修改代码,提供语法高亮和检查
  • 导入工程 配置编译器
    为方便使用和整体测试,提供可以全工程导入的方法
    为适应不同编译环境的系统,让代码跑起来的环境应该可以自定义,对新手提供路径方法提示
  • 生成测试用例
    可以手动输入用例、可以自动按类型生成测试用例、可以按规则设置用例、可以导入导出用例
  • 静态测试、动态测试,回归测试
    可以进行回归测试,判断按照断言机制,生成驱动函数并返回正确率
  • 性能测试(时间、内存,类似在线判题系统)
    对运行各个模块所消耗的时间和内存进行记录
  • 生成报表
    可以生成征提的测试报告
  • 桩函数 覆盖率分析
    为解决不便测又存在于其他模块流程中的模块的运行问题,进行桩函数处理
    对控制语句进行白盒测试的覆盖率分析

2.采用技术(功能模块)

  • IDE界面
    使用现有开源的IDE作为基础,并对其进行精简和二次开发,测试的反馈页显示在它上面

  • 导入工程 配置编译器
    貌似是调用系统命令行惊醒自动处理,配置改的就是其调用参数

  • 生成测试用例 断言与回归测试
    用例进行扩充,包括名字、电话等类型的自动生成
    使用现有开源测试框架,自动生成其基础之上的驱动函数再运行
    C++ 的单元测试工具 —— Catch
    google test

  • 桩函数 覆盖率分析
    不懂

  • 性能测试(时间、内存,类似在线判题系统)
    google benchmark

  • 生成报表
    不懂

3.理论支持

  • 单元测试(Unit Testing)
    颗粒度最小,一般由开发小组采用白盒方式来测试,主要测试单元是否符合“设计”;是指对软件中的最小可测试单元进行检查和验证。
  • 集成测试
    介于单元测试和系统测试之间,一般由开发小组采用白盒+黑盒的方法来测试,即验证“设计”又验证“需求”。主要用来测试模板与模板之间的接口,同时还要测试一些主要的业务功能。
  • 系统测试
    颗粒度最大,一般由独立的测试小组采用黑盒的方式来测试,主要测试系统是否符合“需求规格说明书”。在经过以上各阶段测试确认后,把系统完整的模拟客户环境来进行测试。

以上摘自:什么是:单元测试、集成测试、系统测试

其中,集成测试对象是由通过了单元测试的各个模块所集成起来的构件;系统测试对象则除了软件之外,还包括计算机硬件及相关的外设、数据采集和传输机构、支持软件、系统操作人员等整个系统。
所以此处我们着重讨论单元测试

以下摘自:

软件测试概念及分类整理汇总(真大佬,很全面)
单元测试(自顶向下,自底向上,静态测试)

单元(Unit)指一个可独立运行的代码段,独立运行指这个工作不受前一次或接下来的程序运行的结果影响。
单元测试的内容包括对最小单元进行功能、性能、接口和设计约束等正确性检验,主要- 测试其在语法、格式和逻辑上的错误。

3.1单元测试重点内容

在这里插入图片描述

  • 白盒测试
    语句覆盖测试
    判定覆盖测试
    条件覆盖测试
    判定—条件覆盖测试
    条件组合测试
    路径覆盖测试
  • 黑盒测试
    等价类划分方法
    边界值分析方法
    错误推测方法
  • 静态测试
    代码走查
    代码审查
    代码评审

3.2单元测试的内容

在这里插入图片描述

  • 模块接口测试
    对通过被测模块的数据流进行测试,检查进出模块的数据是否正确。
    调用本模块的输入参数是否正确;
    本模块调用子模块时输入给子模块的参数是否正确;
    全局量的定义在各模块中是否一致;
    外部输入、输出。
    模块局部数据结构测试

  • 检查局部数据结构能否保持完整性。
    不正确或不一致的数据类型说明
    变量无初值
    变量初始化或默认值有错
    不正确的变量名或从来未被使用过
    出现上溢或下溢和地址异常
    模块边界条件测试

  • 检查临界数据是否正确处理
    普通合法数据是否正确处理
    普通非法数据是否正确处理
    边界内最接近边界的(合法)数据是否正确处理
    边界外最接近边界的(非法)数据是否正确处理
    模块独立执行路径测试

  • 对模块中重要的执行路径进行测试。检查由于计算错误、判定错误、控制流错误导致的程序错误。
    运算符优先级
    混合类型计算
    精度不够
    表达式的不正确符号
    循环变量的使用错误
    模块内部错误处理测试

  • 检查内部错误处理设施是否有效。
    输出的出错信息难以理解
    记录的错误与实际不相符
    程序定义的出错处理前系统已介入
    异常处理不当
    未提供足够的定位出错信息

3.3单元测试的环境

基本单元本身不是一个独立的程序,自己不能运行,要靠其它部分来调用和驱动。
在这里插入图片描述
驱动模块的设计比桩模块简单

  • 驱动模块(driver)
    被测基本单元的主程序,它接收测试数据,并把数据传送给被测单元,最后输出实测结果。
  • 桩模块(stub) ──存根模块
    用来代替被测基本单元调用的其他基本单元。

3.4其他补充

软件代码缺陷分类及其应用
在这里插入图片描述

4.撸起袖子加油干!

基本思路就是——IDE+调用分析+编译运行+结果记录。
4.1搜集养料

先进行顶层设计,搭好框架,要用什么做出有什么功能的东西?
不同功能之间的代码低耦合,最好能以插件形式存在(静态、动态、录制……)

C++ 动态链接库的两种调用方式
开源一个代码规范检测工具
基于动态输入追踪的模糊技术研究
下图来自论文“基于动态输入追踪的模糊技术研究”,这是个逆向的漏洞测试。
在这里插入图片描述

还有 Cppcheck分析报告里的处理流程和功能组成
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2编辑界面+编译选项——简单的IDE
在VS code中使用MSVC+命令行编译生成C++程序
Cppcheck的命令行使用

我采用qt框架和c++语言,先搭出编辑器的架子
开发自己的IDE(十),我终于搞定了智能提示了哇哈哈

4.3调用cppcheck进行静态分析
通过命令行进行调用?

4.4使用googletest框架进行动态测试
如何使用googletest?

4.5性能测试
记录并显示

4.6覆盖率分析、生成报表
如何使用googletest?

4.7操作录制,自动化测试
这又是另一种问题

猜你喜欢

转载自blog.csdn.net/sinat_27382047/article/details/102879883