• 软件测试用例经典方法 | 单元测试法案例


    图片

    单元测试又称模块测试,是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验,检查程序在语法、格式和逻辑上的错误,并验证程序是否符合规范,以发现单元内部可能存在的各种缺陷。

    单元测试的对象是软件设计的最小单位——模块、函数或者类。在传统的结构化程序设计语言(如C语言)中,单元测试的对象一般是函数或者过程。在面向对象设计语言(如Java、C#)中,单元测试的对象可以是类,也可以是类的成员函数/方法。由此可见,单元测试与程序设计和编码密切关联,测试者需要根据详细设计说明书和源程序清单来了解模块的I/O条件和逻辑结构。

    本节利用风靡全球的“俄罗斯方块游戏排行榜”的程序作为案例来串讲单元测试的内容。

    01、测试策划

    1. 目的

    俄罗斯方块游戏(Tetris)的排行榜功能经过编码后,在与其他模块进行集成之前,需要经过单元测试,测试其功能点的正确性和有效性。以便在后续的集成工作中不会引入更多的问题。

    2. 背景

    俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

    排行榜功能是俄罗斯方块游戏中不可或缺的一部分,其用于将当前用户的得分与历史得分记录进行比较并重新排序。

    该程序主要涉及的功能点有历史记录文件的读取、分数排名的计算与排序、新记录文件的保存、新记录的显示等。这些功能将在一局游戏结束,并获取到该局游戏的得分后启动。

    3. 待测源代码

    1. private void gameOver (int score)//游戏结束
    2. {//Display game over
    3. string s="您的得分为:";
    4. string al =".
    5. char[]A={};
    6. int i=1;
    7. _blockSurface.FontStyle= new Font(FontFace,BigFont);//设置基本格式_blockSurface.FontFormat.Alignment = StringAlignment.Near;
    8. _blockSurface.DisplavText ="GAME OVER!!
    9. string sc = Convert.ToString( score);//得到当前玩家的分数//write into file;
    10. string path="D: test2.txt";//文件路径
    11. try{
    12. FileStream fs = newFileStream
    13. (path,FileMode.OpenOrCreate,FileAccess.ReadWrite);
    14. StreamReader strmreader = new StreamReader(fs);//建立读文件流
    15. String[] str = new String[5];
    16. String[] split = new String[5];
    17. while(strmreader.Peek()!= -1)
    18. for(i=0;i<5;i++)
    19. strli] = strmreader.ReadLine();//以行为单位进行读取,赋予数组
    20. //str[i]
    21. split [i]split[i]= str[i].split(':')[1];//按照":"将文字分开,赋予数组
    22. person1 = Convert.ToInt32(split[0]); //splt[0]的值赋予第一名
    23. person2 = Convert.ToInt32(split[1]); //splt[1]的值赋予第一名
    24. person3 = Convert.ToInt32(split[2]); //splt[2]的值赋予第一名
    25. person4 = Convert.ToInt32(split[3]); //splt[3]的值赋予第一名
    26. person5 = Convert.ToInt32(split[4]); //splt[4]的值赋予第一名
    27. strmreader.Close(); //关闭流
    28. fs.Close();
    29. FileStream ffs = new
    30. FileStream(path, FileMode.OpenOrCreate,
    31. FileAccess.ReadWrite));
    32. StreamWriter sw = new StreamWriter(ffs)//建立写文件流
    33. if(_score > person1)//如果当前分数大于第一名,排序
    34. {
    35. person5=person4; person4 = person3; person3 = person2; person2 = person1;
    36. person1=score;
    37. }
    38. else if(_score> person2)//如果当前分数大于第二名,排序
    39. {
    40. person5 = person4; person4 = person3; person3 = person2; person2=
    41. _score;
    42. }
    43. else if(_score> person3)//如果当前分数大于第三名,排序
    44. {
    45. person5 = person4; person4 = person3; person3 =_score;
    46. else if(_score> person4)//如果当前分数大于第四名,排序
    47. {
    48. person5 = person4; person4 =_score;
    49. }
    50. else if(_score > person5)//如果当前分数大于第五名,排序
    51. {
    52. person5 = _score;
    53. //在文件中的文件内容
    54. string ppl ="第一名:“+ Convert.ToString(person1);
    55. string pp2 ="第二名:"+ Convert.ToString(person2);
    56. string pp3 ="第三名:”+ Convert.ToString(person3);
    57. string pp4 ="第四名:"+ Convert.ToString(person4);
    58. string pp5 ="第五名"+ Convert.ToString(person5);
    59. string
    60. ppR= pp1+"r\n"+ pp2 +"r\n" + pp3 +"r\n"+ pp4+"r\n"+ pp5 +"r\n";
    61. byte[] info = new UTF8Encoding(true).GetBytes(ppR);
    62. sw.Write(ppR); //将内容写入文件
    63. sw.Close();
    64. ffs.Close();
    65. }
    66. Catch(Exception ex)
    67. {
    68. Console.WriteLine(ex.ToString());
    69. }
    70. S=s+""+ sC;
    71. //Draw surface to display text;
    72. MessageBox.Show(s); //在界面中显示排行榜内容
    73. }

    02、测试设计

    下面将利用相关静态和动态(白盒测试、黑盒测试)方法对案例进行相应的测试,得到测试报告与错误列表,在实际项目中可进一步反馈给开发方进行Bug的确认与修复。

    1. 代码走查

    利用代码走查的方法检查该模块的代码,对代码质量进行初步评估。具体实现如表1所示。

            ■ 表1 代码走查情况记录

    图片

    从表1的分析中可以看出,本模块的代码基本情况如下。

    (1) 代码直观。

    (2) 代码和设计文档对应。

    (3) 无用的代码已经被删除。

    (4) 注释过于简单。

    2. 基本路径测试法

    基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出可执行的路径集合,从而设计测试用例的方法。首先需要简化程序模块,绘制程序模块如图2所示。接着按照模块图的设计路径来覆盖策略。主要可分为以下4步执行。

    图片

    ■ 图2 程序模块图

    1) 绘制程序的控制流图

    基本路径测试法的第一步是绘制控制流图,根据程序模块图的逻辑关系,获得该程序块的控制流图,如图3所示。

    图片

    ■ 图3 程序模块的控制流图

    2) 计算环路复杂度

    其次是根据控制流图计算环路复杂度,环路复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,该度量将用于计算程序基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。

    V(G)=P+1=5+1=6

    根据以上公式确定至少要覆盖6条路径。

    3) 导出独立路径

    根据控制流图可以方便地得到以下6条路径。

    path1:1—2—11。

    path2:1—3—4—11。

    path3:1—3—5—6—11。

    path4:1—3—5—7—8—11。

    path5:1—3—5—7—9—10—11。

    path6:1—3—5—7—9—11。

    4) 设计测试用例

    最后设定一组初始参数,以此来设计测试用例。令:

    person1=23

    person2=20

    person3=10

    person4=6

    person5=4

    作为测试输入,可设计测试用例如表2所示。

    ■ 表2 基本路径法测试用例

    图片

    3. 边界值分析

    边界值分析法利用输入变量的最小值、略大于最小值、输入范围内任意值、略小于最大值、最大值等来设计测试用例。

    由于输入的只会是数据,且数据均大于0,因此可令:

    person1 = 23

    person2 = 20

    person3 = 10

    person4 = 6

    person5 = 4

    采用边界值法设计测试用例如表3所示。

    ■ 表3 边界值法测试用例

    图片

    03、测试执行

    将设计的测试用例整理合并为测试用例集合,必要时需要开发相应的驱动模块和桩模块。本次测试需要开发一个驱动模块,用于初始化相应的参数,并调用待测模块以达到测试效果。驱动模块代码如下。

    1. import java.io.BufferedReader;
    2. import java.io.IOException;
    3. import java.io.InputStreamReader;
    4. public class Main(){
    5. public static void main(String[]args)
    6. throws IOException{
    7. int person1 = 23,person2 = 20, person3 = 10,person4 = 6,person5 = 4;
    8. int score;
    9. String s;
    10. BufferedReader bf = new BufferedReader(newInputStreamReader(System.in));
    11. s = bf.readLine():
    12. score = Integer.valueOf(s);
    13. _gameOver(score);
    14. }
    15. }

    04、测试总结

    测试结果可利用Bug记录平台进行记录,在实际项目中则可反馈给开发人员,由开发人员确认并修复。

    测试结束后,形成测试报告。

     

     

     

     

     

     

     

     

  • 相关阅读:
    自然辩证法2023年预测考点
    Go map 竟然也会发生内存泄漏?
    混合App开发
    Dataloader有哪些使用方法
    【Leetcode】 1013. 将数组分成和相等的三个部分
    Linux高级IO ------ poll ,epoll(重要)
    新型的铁塔基站“能源管家”
    【ABAP】如何理解SAP中的CLIENT (客户端)
    关于网络协议的若干问题(四)
    关于 Vue 中 h() 函数的一些东西
  • 原文地址:https://blog.csdn.net/qq_41640218/article/details/132555944