`
liyiye
  • 浏览: 427162 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

(八)白盒测试实例--构建自己的单元测试框架1

阅读更多

在上一讲“单元测试的尝试”里我们遇到了几个问题:

1、代码重复的问题太多

2、测试结果需要人工去检查

3、对测试的总体信息也无从得知

本讲将构建一个简单的单元测试框架来解决以上的问题:

1、代码重复的问题太多。

这个问题很容易解决,只需要把判断预期结果和实际结果的逻辑提取到某个函数中即可。从整个代码来看,有两种类型的结果的函数:

(1)返回布尔型

(2)返回整数

因此,需要两个类型的判断预期结果和实际结果是否相符的函数:XUnit系列的框架的习惯使用assert*的命名来定义判断函数,对于通过的测试习惯打印一个“.”号,而对于失败的测试习惯打印一个“F”。 

  1. /*
  2.  * 判断是否取值为真
  3.  */
  4. void assertTrue(char *msg, bool actual)
  5. {
  6.     if(actual)
  7.     {
  8.         printf(".");
  9.     }
  10.     else
  11.     {
  12.         printf("F");
  13.     }
  14. }
  15. /*
  16.  * 判断预期结果和实际结果是否相符
  17.  */
  18. void assertEquals(char *msg, int expect, int actual)
  19. {
  20.     if(expect == actual)
  21.     {
  22.         printf(".");
  23.     }
  24.     else
  25.     {
  26.         printf("F");
  27.     }
  28. }

小知识:

2、测试结果需要人工去检查

    对于测试结果不要使用printf方式打印被测试函数的返回结果值就可以避免这个问题。

3、对测试的总体信息也无从得知

除了问题1的解决办法里使用“.”表示测试通过和“F”表示测试失败可以提高对测试结果的信息的直观性之外,做单元测试的人还希望能够得到以下的信息:

(1)执行的测试用例总数、通过的数量和失败的数量

(2)测试执行的时间

(3)如果测试用例执行失败了,希望知道是哪个测试用例失败,从而去分析失败的原因。

下面来实现以上三个目标:

1、  为了获取已执行的测试用例数量、通过的数量和失败的数量,以及测试执行的时间,需要定义一些变量来保存这些信息:

  1. int errorCount = 0;
  2. int testCount=0;
  3. time_t startTime, endTime;

2、为了获取失败的测试用例信息,需要先定义一个变量来保存错误信息,同时,上面的两个断言函数也需要增加一个参数,用来传递当失败的时候要显示的失败信息。为了方便记录错误的信息,可以添加两个处理错误信息的函数:

  1. /*
  2.  * 存放测试信息和错误信息的全局变量
  3.  */
  4. char *errors[100] = {""};
  5. int errorCount = 0;
  6. int testCount=0;
  7. time_t startTime, endTime;
  8. /*
  9.  * 判断是否取值为真
  10.  */
  11. void assertTrue(char *msg, bool actual)
  12. {
  13.     testCount++;
  14.     if(actual)
  15.     {
  16.         printf(".");
  17.     }
  18.     else
  19.     {
  20.         printf("F");
  21.         addError(msg);
  22.     }
  23. }
  24. /*
  25.  * 判断预期结果和实际结果是否相符
  26.  */
  27. void assertEquals(char *msg, int expect, int actual)
  28. {
  29.     testCount++;
  30.     if(expect == actual)
  31.     {
  32.         printf(".");
  33.     }
  34.     else
  35.     {
  36.         printf("F");
  37.         addError(msg, expect, actual);
  38.     }
  39. }

失败信息的处理函数:

  1. /*
  2.  * 添加错误信息
  3.  */
  4. void addError(char *msg)
  5. {
  6.     char error[100] = "Test '";
  7.     strcat(error, msg);
  8.     strcat(error, "' is failed!");
  9.     errors[errorCount] = new char[100];
  10.     strcpy(errors[errorCount], error);
  11.     errorCount ++;
  12. }
  13. /*
  14.  * 添加错误信息,带预期结果与实际结果参数
  15.  */
  16. void addError(char *msg, int expect, int actual)
  17. {
  18.     char error[100] = "Test '";
  19.     char num[10];
  20.     strcat(error, msg);
  21.     strcat(error, "' is failed!");
  22.     strcat(error, " Expected: ");
  23.     strcat(error, itoa(expect, num, 10));
  24.     strcat(error, " , actual: ");
  25.     strcat(error, itoa(actual, num, 10));
  26.     errors[errorCount] = new char[100];
  27.     strcpy(errors[errorCount], error);
  28.     errorCount ++;
  29. }

3、计算测试所花费的时间:

在测试开始之前开始计时,测试结束之后,停止计时。

  1. /*
  2.  * 初始化测试,开始计时
  3.  */
  4. void init()
  5. {
  6.     printf("\n****** Test start ******\n");
  7.     startTime = clock();
  8. }
  9. /*
  10.  * 结束测试,结束计时,打印报告
  11.  */
  12. void end()
  13. {
  14.     endTime = clock();
  15. }

4、测试结束之后,把收集到的信息打印出来:

  1. /*
  2.  * 测试报告
  3.  */
  4. void testReport()
  5. {
  6.     printf("\n\nTotal run Tests:");  //测试概要信息
  7.     printf("%d", testCount);
  8.     printf(", passed:%d", testCount-errorCount);
  9.     printf(", failed:%d\n", errorCount);
  10.     printf("Test escaped time: %6.3f seconds\n", (double)(endTime-startTime)/1000.0);
  11.     if(errorCount>0)   //测试失败的详细信息
  12.     {
  13.         printf("\n**************** Failed Test's Detail ****************\n\n");
  14.         
  15.         for(int i=0; i<errorCount; i++)
  16.         {
  17.             printf("  %d: ", i+1);
  18.             printf(errors[i]);
  19.             printf("\n");
  20.         }
  21.         printf("\n**************** End of Failed Detail ****************\n\n");
  22.     }
  23.     else   //所有测试都通过
  24.     {
  25.         printf("\n****** All Tests had Passed! ******\n\n");
  26.     }
  27. }

把这个函数放在end函数中调用:

  1. /*
  2.  * 结束测试,结束计时,打印报告
  3.  */
  4. void end()
  5. {
  6.     endTime = clock();
  7.     testReport();
  8. }

 

分享到:
评论

相关推荐

    白盒测试实例之九——构建自己的单元测试框架(下)

    实例白盒 白盒测试实例之九——构建自己的单元测试框架(下) 软件测试 完整的源代码如下: 1、UnitTest.h 1./* 2.*Copyright(c)2008,胡添发 3.* 4.*简单的单元测试框架 5.* 6.*/ 7. 8.#include 9.#...

    白盒测试学习文档,和工具介绍

    1. **白盒测试基础** - 定义与特点:解释白盒测试的定义,强调其关注代码内部逻辑的特点,以及相对于黑盒测试的优势。 - 测试目标:明确白盒测试的目标,如确保代码覆盖率,找出隐藏的逻辑错误,验证程序的数据...

    Junit白盒测试学习文档

    Junit作为Java领域最常用的单元测试框架,是进行白盒测试的重要工具。本文档将深入探讨Junit4的基础知识和应用技巧,帮助开发者提升测试效率和代码质量。 **一、Junit简介** Junit是由Erich Gamma和Kent Beck共同...

    软件测试基础-单元测试

    常用的单元测试框架包括JUnit(Java)、pytest(Python)、NUnit(.NET)等,它们提供了丰富的API和测试模板,支持自动化测试、断言检查等功能,帮助开发者快速构建和运行测试用例。 #### 避免单元测试的常见误区 ...

    如何利用JUnit进行单元测试.ppt

    它是用于单元测试框架体系xUnit的一个实例,主要用于白盒测试。 四种Java测试工具简介 -------------------- ### 1. JUnit JUnit是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。它是用于单元测试...

    单元测试用例实例设计说明

    单元测试是软件开发过程中的重要环节,用于验证代码的各个独立模块是否按预期工作。测试用例的设计是单元测试的核心,它确保了测试的覆盖率和有效性。本文将深入探讨如何编写测试用例,以及黑盒测试和白盒测试的区别...

    JUnit和单元测试简介PDF格式

    ### JUnit和单元测试简介 #### 一、基础知识与概念 ...总之,JUnit不仅是一个强大的单元测试框架,而且通过其丰富的特性和良好的社区支持,成为Java开发人员进行测试驱动开发(TDD)的重要工具之一。

    junit基本介绍,junit常用的接口和类,如何编写测试代码

    JUnit是一种开源的Java测试框架,它属于xUnit家族的一员,主要用于单元测试,特别是白盒测试和回归测试。白盒测试是指测试人员完全了解程序内部的逻辑结构,可以针对性地进行测试;而回归测试是在软件或环境进行修复...

    sofa-acts:ACTS是基于数据模型驱动程序的白盒测试框架

    ACTS 是基于数据模型驱动测试引擎的的新一代测试框架,它的数据以 YAML 为载体,在此上构建基于数据模型的驱动引擎,适配 TestNg+SOFABoot 的测试上下文环境;支持高效、标准化构建用例,可视化编辑测试数据,精细化...

    东北大学软件测试课件

    东北大学所提供的软件测试课件,为学生和从业者提供了一套全面、系统的教学材料,覆盖了从黑盒测试到白盒测试,再到单元测试和系统测试的全方位知识体系。 黑盒测试,作为一种功能性测试方法,它的核心理念是从用户...

    Junit实例图解,Junit快速入门

    《Junit实例图解:快速掌握单元测试框架》 Junit是Java开发中广泛使用的单元测试框架,它为开发者提供了一种便捷的方式来编写和执行针对单个代码单元的测试。本文将通过实例图解的方式,逐步介绍如何在Eclipse环境...

    高效软件测试自动化软件测试自动化

    - **单元测试**:针对单个模块或函数进行测试。 - **集成测试**:验证不同模块之间的接口是否正常工作。 - **回归测试**:确保新版本没有引入新的错误或破坏旧功能。 #### 六、实例应用与练习 书中不仅提供了理论...

    不看后悔!软件测试18张精品知识脑图,最全总结,快速入门!

    它包括单元测试、集成测试、系统测试和验收测试等阶段。 2. **测试类型**: - 单元测试:针对代码模块进行测试,确保每个小部分功能正确。 - 集成测试:多个模块组合后的测试,检查模块间的交互是否正确。 - ...

    软件测试面试题

    - **JUnit与TestNG**:Java环境下的单元测试框架,TestNG功能更为强大。 5. **性能测试**: - **压力测试**:检查系统在高负载下的表现和稳定性。 - **负载测试**:评估系统在正常和预期负荷下的性能。 - **...

    软件测试系列最佳实践

    - **1.6 34个方法**:介绍了34种测试方法和技术,这些方法和技术可以帮助测试人员更有效地发现缺陷,包括但不限于黑盒测试、白盒测试、压力测试等。 #### 第2章 测试架构从何而来 第二章深入探讨了测试架构的概念...

    软件测试的光盘!!!

    2. **测试方法论**:有多种测试方法论,如黑盒测试(关注功能行为,不考虑内部结构)、白盒测试(关注代码逻辑和结构)、灰盒测试(结合黑盒和白盒测试)以及探索性测试(强调测试者自主发现和解决问题)。...

    JUnit单元测试

    JUnit 是一个广泛使用的Java编程语言的单元测试框架,它的核心目标是帮助开发者对代码进行单元测试,确保每个独立的代码单元都能按预期工作。单元测试通常被视为白盒测试,因为它涉及对代码内部逻辑的深入理解。 ...

    软件测试面试经典题2024年

    - **JUnit:** 用于Java应用程序的单元测试框架,能够帮助开发者编写和运行测试用例。 #### 三、理论与技能类 1. **敏捷开发与敏捷测试** - **敏捷理念:** 强调快速响应变化、迭代开发、持续交付高质量的软件...

Global site tag (gtag.js) - Google Analytics