第二十二章 开发者测试

  • 单元测试是将一个程序员或者一个开发团队所编写的,一个完整的类、子程序或者小程序,从完整的系统中隔离出来进行测试;
  • 组件测试是将一个类、包、小程序或者其他编程元素,熊一个更加完整的系统中隔离出来进行测试,这些测试代码涉及到多个程序员或者多个团队;
  • 集成测试是对两个或更多的类、包、组件或者子系统进行的联合测试,这些组件由多个程序员或者开发团队所创建。这种测试通常在有了两个可以进行测试的类的时候就应该尽快开始,并且一直持续到整个系统开发完整。
  • 回归测试是指重复执行以前的测试用例,以便在原先通过了相同测试集合的软件中查找缺陷;
  • 系统测试是在最终的配置下运行整个软件。以便测试安全、性能、资源消耗、时序方面的问题,以及其他无法在低级集成上测试的问题。

开发者测试在软件质量中的角色

  • 测试的目标与其他活动背道而驰,测试的目标是找出错误;
  • 测试永远不可能彻底证明程序中没有错误;
  • 测试本身不能改善软件的质量;
  • 测试时要求你假设会在代码中找到错误。

开发者测试的推介方法

  • 对每一项相关的需求进行测试,以确保需求都已实现;
  • 对每一个相关的设计关注点进行测试,以确保设计已被实现;
  • 用基础测试来扩充针对需求和设计的详细测试用例;
  • 使用一个检查表,其中记录着你在本项目迄今位置所犯的,以及在过去的项目中所犯的错误类型。

测试先行还是测试后行

  • 在开始写代码之前先写测试用例,并不比之后再写要多花功夫,只是调整了一下测试用例编写活动的工作顺序而已;
  • 假如你首先编写测试用例,那么你将可以更早发现缺陷,同时也更容易修正它们;
  • 首先编写测试用例,将迫使你在开始写代码之前至少思考一下需求和设计,而这往往会催生更高质量的代码;
  • 在编写代码之前先编写测试用例,能更早地把需求上的问题暴露出来,因为对于一个糟糕的需求来说,要写出测试用例是一件困难的事情;
  • 如果你保存了最初编写的测试用例——这是你应该做的,那么先进性测试并非唯一选择,你仍然可以最后再进行测试。

开发者测试的局限性

  • 开发者测试倾向于干净测试;
  • 开发者测试对覆盖率有过于乐观的估计;
  • 开发者测试往往会忽略一些更复杂的测试覆盖率类型。

测试技巧锦囊

由于进行完全测试实际上是不可能的,因此测试的敲门就在于选择那些最有可能找到错误的测试用例。

结构化测试的思想是,你需要去测试程序中的每一条语句至少一次。

  • 结构化的基础测试;
  • 数据流测试;
  • 等价类划分;
  • 猜测错误;
  • 边界值分析;
  • 几类坏数据;
    • 数据太少;
    • 数据太多;
    • 错误的数据;
    • 长度错误的数据;
    • 未初始化的数据。
  • 几类好的数据;
    • 正常的情形;
    • 最小的局面;
    • 最大的局面;
    • 与旧数据的兼容性。
  • 采用容易手工检查的测试用例;

典型错误

不完善的构建过程引发错误所占的比例

  • 小型项目里面,构件中的缺陷占了所有错误的大多数;
  • 无论项目规模如何,构建缺陷至少占了总缺陷的35%;
  • 修正构建错误的代价虽然要比修正需求和设计的错误相对低廉,但从绝对值来看仍然是高昂的。

测试本身的错误

你可以通过下列几项工作来减少测试用例当中的错误量:

  • 检查你的工作;
  • 开发软件的时候要计划好测试用例;
  • 保留你的测试用例;
  • 将单元测试纳入测试框架;

测试支持工具

  • 为测试各个类构造脚手架;
  • Diff工具;
  • 测试数据生成器;
  • 覆盖率监视器;
  • 数据记录器/日志记录器;
  • 符号调试器;
  • 系统干扰器;
  • 错误数据库。

改善测试过程

  • 有计划的测试;
  • 回归测试;
  • 自动化测试。

保留测试记录

为了评估整个项目,你需要手机下列集中数据:

  • 缺陷的管理方面描述(报告日期、报告人、描述或标题、生成编号以及修正错误的日期等);
  • 问题的完整描述;
  • 复现错误所需要的步骤;
  • 绕过该问题的建议;
  • 相关的缺陷;
  • 问题的严重程度——例如致命的、严重的还是表面的;
  • 缺陷根源:需求、设计、编码还是测试;
  • 对编码缺陷的分类:off-by-one错误、错误赋值、错误数组下标,以及子程序调用错误等;
  • 修正错误所改变的类和子程序;
  • 缺陷所影响的代码行数;
  • 查找该错误所花的时间;
  • 修正该错误所花的时间。

一旦你收集到了这些数据,你就可以对其中部分细节细加思考,从而判断项目是想着更健康,还是更糟糕的趋势发展。

  • 每一个类中的缺陷数目,从最糟糕的类到最好的类依次列出,如果类的规模不同,可能要对这一数字进行归一化处理;
  • 按照同样的方式列出每个子程序中的缺陷数,也可能需要根据子程序的大小归一化处理;
  • 发现一个错误平均所需要花费的测试时间;
  • 每个测试用例所发现缺陷的平均数;
  • 修正一个测试用例的代码覆盖率;
  • 在各个严重级别中未处理缺陷的数量。

核对表:测试用例

  • [ ] 类和子程序所对应的每一项需求是否都有相应的测试用例?
  • [ ] 类和子程序所对应的每一项设计元素是否都有相应的测试用例?
  • [ ] 每行代码是否被至少一个测试用例所测试?同是否通过计算测试到每行代码所学的最好测试用例数量来验证这一点?
  • [ ] 所有已定义-已使用路径是否至少被一个测试用例测试过了?
  • [ ] 是否测试过那些不太可能正确的数据流模式,例如已定义-已定义、已定义-已退出以及已定义-已销毁?
  • [ ] 是否有一张常见错误列表,并据此编写测试用例以检测过去经常出现的错误?
  • [ ] 所有的简单边界是否都已经测试过了:最大、最小以及off-by-one?
  • [ ] 是否测试了组合边界——即,多个输入数据的组合导致输出数据过小或者过大?
  • [ ] 测试用例是否检查了数据类型的错误?
  • [ ] 是否测试那些中规中矩的典型数值?
  • [ ] 是否测试了最小/最大正常形式?
  • [ ] 是否检查了与旧数据的兼容性?以及是否对旧硬件、旧操作系统版本以及其他旧版本软件的接口进行了测试?
  • [ ] 测试用例是否容易手工检验?

要点

  • 开发人员测试时完整测试策略的一个关键部分;
  • 同编码之后编写测试用例相比较,编码之前编写测试用例,工作量和花费的时间差不多,但是后者可以缩短缺陷-侦测-调测-修正这一周期;
  • 即使考虑到了各种可用的测试手段,测试仍然只是良好软件质量计划的一部分;
  • 你可以根据各种不同的思路来产生很多测试用例,这些思路包括基础测试、数据流分析、边界分析、错误数据类型以及正确数据类型等;
  • 错误往往集中在少数几个容易出错的类和子程序上;
  • 测试数据本身出错的密度往往比测试代码还要高;
  • 自动化测试总体来说是很有用的,也是进行回归测试的基础;
  • 从长远来看,改善测试过程的最好办法就是将其规范化,并对其进行评估,然后用从评估中获得经验叫徐来改善这个过程。

原文地址:https://www.cnblogs.com/liam-ji/p/11565458.html

时间: 2024-10-07 09:26:46

第二十二章 开发者测试的相关文章

Gradle 1.12用户指南翻译——第二十二章. 标准的 Gradle 插件

其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc/tree/1.12. 直接浏览双语版的文档请访问: http://gradledoc.qiniudn.com/1.12/userguide/userguide.html. 另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,兼容

第二十二章 TCP/IP层的实现

                      第二十二章    TCP/IP层的实现        我比较喜欢先难后易,如果把GPU显示管理.和网络管理拿下后:我会从头整理.改写一遍APO操作系统.这样,就会形成APO操作系统的锥形.也获得了全局观.内核CPU线路.和用户CPU线路,你可以将它们看成是独立的2个32位CPU核:内核CPU主要任务是实时处理.硬件中断,256个实时线程包含了一些中断程序的后半部.用户CPU主要是动态优先级进程.线程调度,各种应用程序的运行:2个核之间是通过消息交互.句

第二十二章 Linux文件比较,文本文件的交集、差集与求差:comm命令

第二十二章 Linux文件比较,文本文件的交集.差集与求差:comm命令 名词解释 comm 命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.差集操作. 交集:打印两个文件所共有的行 求差:打印出指定文件所包含的其不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. 语法 comm(选项)(参数) 选项 -1 :不显示在第一个文件出现的内容: -2 :不显示在第二个文件中出现的内容: -3 :不显示同时在两个文件中都出现的内容. ? 参数

“全栈2019”Java第二十二章:控制流程语句中的决策语句if-else

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第二十二章:控制流程语句中的决策语句if-else 下一章 "全栈2019"Java第二十三章:流程控制语句中决策语句switch上篇 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf

20190925 On Java8 第二十二章 枚举

第二十二章 枚举 基本 enum 特性 创建 enum 时,编译器会为你生成一个相关的类,这个类继承自 Java.lang.Enum. valueOf() 是在 Enum 中定义的 static 方法,它根据给定的名字返回相应的 enum 实例,如果不存在给定名字的实例,将会抛出异常. 将静态类型导入用于 enum 使用 static import 能够将 enum 实例的标识符带入当前的命名空间,所以无需再用 enum 类型来修饰 enum 实例. 方法添加 除了不能继承自一个 enum 之外

WP8.1学习系列(第二十二章)——在页面之间导航

在本文中 先决条件 创建导航应用 Frame 和 Page 类 页面模板中的导航支持 在页面之间传递信息 缓存页面 摘要 后续步骤 相关主题 重要的 API Page Frame NavigationCacheMode 本主题将讨论基本的导航概念,并演示如何创建一个在两个页面之间进行导航的应用. 有关为你的应用选择最佳导航模式的帮助,请参阅导航模式. 在操作时请参阅平面导航和分层导航模式,它们是应用功能大全系列的一部分. 路线图: 本主题与其他主题有何关联?请参阅: 使用 C# 或 Visual

第二十二章 动态分区管理(LPAR)

一.逻辑分区 Lpar即系统级的逻辑分区,它把一台计算机上的硬件资源划分成多个不同的逻辑服务器,每个逻辑服务器上单独运行一个私有的操作系统,这样就可以实现在一台服务器上多个操作系统的运行. 根据在逻辑分区中调配资源是否需要重启这个分区中的操作系统,可以把逻辑分区分成两种:静态Lpar和动态Lpar.静态Lpar是指系统资源(CPU.内存和I/O等)在不同的分区之间移动的时候需要重新启动所有影响到的Lpar,而动态Lpar则可以使用户在不同的分区之间灵活移动资源时不会影响到分区的正常运行,既不需要

第二十二章 模块代码编写基础

#1. #A:因为模块名在python中会变成变量名,因此模块名需要遵守python的命名规则,否则无法将其导入(定义一个if.py,则无法导入) #B:当一个模块被导入的时候,python会把内部模块名映射到外部文件名,会将模块搜索路径中的目录路径加在前面,而.py或者其他后缀名加在后面 #C:import会读取整个模块,所以必须进行定义后才能读取它的变量名,from会将变量名复制到另一个作用域,所以她就可以让我们直接使用复制后的变量名而不需要通过模块 #D:from语句其实只是稍稍扩展了im

Python之路【第二十二章】:Django 缓存

缓存 由于Django是动态网站,所有每次请求均会去数据进行相应的操作,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中,5分钟内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回 Django中提供了6种缓存方式: 开发调试 内存 文件 数据库 Memcache缓存(python-memcached模块.pylibmc模块) 1.配置 ① 开发配置 # 此为开始