数独sudoku(七)测试分支覆盖率和代码质量分析

  大家好,今天进行测试分支覆盖率和代码质量分析,完成最初版本并提交至GitHub。
  Github完整项目地址:https://github.com/surpasss/software-engineering

测试分支覆盖率

  我打算用Visual Studio自带的插件OpenCppCoverage测试上期博客中测试用例的覆盖率。但是由于之前编写的合并接口是处理命令行输入,而这个插件是在VS上运行得到分析结果,所以需要做点变动。我的处理方案是把所有测试用例保存在test.txt文件中,然后依次读取每一行进行处理。
  经过一番查阅资料修改代码后,首先测试修改的代码是否正确。我的测试方案是:打印每次读取到的一行字符串,打印运行时间、打印相应提示、查看正确输入得到的sudoku.txt文件。运行程序,发现有一个输入的结果异常,如下图所示:
  数独sudoku(七)测试分支覆盖率和代码质量分析_第1张图片
  其中第二个测试用例是正确输入,但是运行结果没有打印"Create sudokus successfully.",运行时间也很奇怪。经过一番调试后,原来是while (next_permutation(init + 1, init + 9))已循环完全部字典排列,退出循环。因为上一个测试用例是生成999999个终局,而之前代码是每次运行程序时初始化,所以处理一个输入没问题,但是一次程序处理多个输入就可能越界退出循环。解决措施就是在函数里对init数组初始化。修改代码后,重新运行程序,问题解决。
  这次运行OpenCppCoverage,得到的测试分支覆盖率如下:
  数独sudoku(七)测试分支覆盖率和代码质量分析_第2张图片
  可以看到,测试分支覆盖率高达96%,说明代码没有什么冗余,测试用例覆盖范围理想。查看分支覆盖率为93%的代码,发现判断写入文件是否正常打开处标红,因为每次都是正常打开写入文件,所以没有执行。其实这两行代码确实没有必要,不同于读文件,程序中写文件是创建一个新文件,不出极端情况可以保证正常创建。将这几行代码注释掉,重新运行,测试分支覆盖率如下:
  数独sudoku(七)测试分支覆盖率和代码质量分析_第3张图片
  这次的分支覆盖率高达99%,唯一的一处不执行代码是当if-else中的if条件不满足的情况下,直接进入else里的语句,不判断else,而这是无法修改的。

代码质量分析

  我是用CppCheck检查代码,CppCheck是一个C/C++代码缺陷静态检查工具,只检查编译器检查不出来的bug,不检查语法错误。所谓静态代码检查就是检查代码是否安全和健壮,是否有隐藏的问题。百度百科里描述的CppCheck检查包括:
  1. 自动变量检查
  2. 数组的边界检查
  3. class类检查
  4. 过期的函数,废弃函数调用检查
  5. 异常内存使用,释放检查
  6. 内存泄漏检查,主要是通过内存引用指针
  7. 操作系统资源释放检查,中断,文件描述符等
  8. 异常STL 函数使用检查
  9. 代码格式错误,以及性能因素检查
  用CppCheck对整个目录进行检查,检查结果如下:
  数独sudoku(七)测试分支覆盖率和代码质量分析_第4张图片
  发现一处警告,一番分析后,原来是代码中if和else-if语句里的条件并没有逻辑上的关系。将else-if改为if后,就不会报错了,如下图所示:
  数独sudoku(七)测试分支覆盖率和代码质量分析_第5张图片

你可能感兴趣的:(数独sudoku(七)测试分支覆盖率和代码质量分析)