第一章 introduction to software testing

news2024/11/23 4:35:24

文章目录

  • 基本概念
    • validation / verification
    • input domain / output domain
    • deterministic / non-deterministic
    • terminate / not-terminate
  • Testing
    • 概念
    • testing 的目的
    • Fault, failure, error
    • 测试三要素 (3 essential pieces of information)
      • 测试输入
      • 预期输出
      • 执行测试 test execution
      • 测试评估 test evaluation
    • testability 可测试性
    • successful test case
    • 软件测试的心理学原则(Principles of software testing psychology)
      • 预期测试结果
      • 不只靠自己测自己的程序
      • 已经被发现很多错误的地方倾向于被发现更多的错误(places with already many discovered errors tend to be discovered even more errors.)
    • input domains
      • 白盒测试的输入来源(什么内容可以构成 input domains)
    • 黑盒 / 白盒测试
      • 黑盒的好处
      • 黑盒的坏处
      • 白盒好处
      • 白盒坏处
    • Error guessing
    • 一些testing的准则

基本概念

validation / verification

  • validation: 是否构建了正确的系统
  • verification: 是否以正确的方式构建系统
    在这里插入图片描述

input domain / output domain

  • input domain & input domain
    在这里插入图片描述
    • 输入类型中的值集称为输入域,
    • 输出类型中的值集称为输出域。
      在这里插入图片描述
  • 上述例子中,输入的类型是 stringchar,因此根据输入域的定义,输入域应该是所有 string 和 char 的组合;可以表示成 (s,c) 的集合,其中 s 是字符串,c 是字符
  • 输出类型是隐式的,因为squeeze的参数是按引用传递的。如果非说 ouput domain,那么 squeeze 函数的 output domain 是所有的 string

在这里插入图片描述

  • fibonacci 的输入域是所有的 unsigned int,而输出域也是所有的 unsigned int
  • 输入域的 value 可能违反 specification,例如如果一个 input 导致了 divided by 0 问题(这是一个规范),那么也是有可能的
  • 输入域在不同的系统上可能是不同的
    在这里插入图片描述
  • 有效地选择输入和输出域是非常重要的,但是并不像上面说的这么容易

deterministic / non-deterministic

  • deterministic / non-deterministic: 如果对于一个 input,输入 function 之后结果总是相同的,那么这个 function 是 deterministic,否则是 non-deterministic 的。

terminate / not-terminate

  • terminate / not terminate:一个程序是否能够正常终止。以下程序是 not-terminate 的
    • 无限循环
    • 等待事件的程序(例如等待用户输入)
  • 上述的 squeezefibonacci 都是 termiate 的程序,也就是他们最终都会终止,只不过对于 fibonacci 有返回值,因此测试程序可以直接用这个返回值来做判断,而 squeeze 没有返回值,因此必须重新查看 input 进去的数组来确定是否正确地执行操作
  • 对于那些 not-terminate 的程序,由于我们无法得到最后的结果(没有 return)因此,有些 not-terminate 可以通过查看其中间的 observable outputs 来查看,或者有些干脆就对外不可见

Testing

概念

在这里插入图片描述

  • testing 的目的是找 failure,找不到 failure 的 testing 没意义
  • 本课题的主题是上述的最后一个 item:测试不仅仅是检测错误存在与否,而且还涉及对系统及其组件属性进行评估。这意味着软件测试方法被用于评估和确保程序满足其所有要求,包括功能性和非功能性要求。
  • testing 必须在程序(或其 components)构建完成时才能进行
    在这里插入图片描述

testing 的目的

在这里插入图片描述

  • 这句引语表明测试的目的是为了 证明实现与规范之间存在差异

  • 并且不能用来证明实现是正确的。大多数测试方法的目标是系统地和积极地发现程序中的这些差异。

  • 也就是说 testing 是为了发现 difference between specification and implementation

  • testing 和 debug 是不同的。调试是

    • 确定程序中怀疑故障的确切性质和位置;
    • 修复该故障。通常,调试始于对故障存在某种迹象。调试的目的是 定位故障并修复它们。

因此,我们说 测试的目标是证明程序中存在错误调试的目标则是找出这些错误产生原因,并消除或修复它们。

程序验证 (program proving) 旨在显示程序不包含任何错误。 问题在于大多数程序员和质量保证人员没有具备证明程序正确性所需技能。

Fault, failure, error

在这里插入图片描述

  • fault 是代码中出现错误的行(位置);可能是一行代码,也可能是多行代码
  • failure 是有 fault 导致的最终结果和预期的偏差
  • error 是 fault 导致的程序在中间过程进入了错误的状态
  • 因此 error 和 failure 都是 fault 导致的,他们都是 fault 的结果
    在这里插入图片描述
  • specification 是想要实现 n ∗ n n*n nn 但是最终的实现是 x ∗ 2 x*2 x2 因此 return 这一行是一个 fault
  • 当 input 是 2 以外的值都会导致 failure,因为会造成预期与程序的结果不符,此程序不会导致 error
  • 当 input=2 的时候,出现的现象叫 coincidental correctness (偶然正确性)
  • coincidental correctness 是一种经常出现的情况;testing 的目的是发现错误,因此选择 input 就变得非常重要,这些 input 最好能够让所有的 failure 都暴露出来,而减少 coincidental correctness 的发生
  • 通常 testing 和 debugging 的步骤如下:
    • 选择好的 input 来暴露 failure
    • 定位导致 failure 的 faults
    • 修复或者移除这些 faults
    • 重新测试
      在这里插入图片描述
  • 但上述过程中的 2,3 步骤本来就是容易出错的,在修改 faults 的时候就很容易引入新的错误

测试三要素 (3 essential pieces of information)

  • **测试输入:**一组测试输入(set of test inputs),这是对于 terminate 的程序,对于 not-terminate 的程序,需要一组测试输入的序列
  • **预期输出:**需要设定预期的 output
  • 测试环境

测试输入

  • 后面的 2-5 章节讲的就是如何选择合适的 test input 可以以覆盖率更高的情况下更加全面地进行测试(这里的覆盖率由多种衡量标准,例如 branch, condition 等;总之要根据某个覆盖率标准来决定 test input 的集合)

预期输出

  • 必须提供生成的每个测试输入的预期行为(只有知道预期行为才知道这个 test 是否 failure 还是 success)。这被称为 oracle问题。在许多情况下,可以从正在测试的程序的需求中直接推导出该oracle。例如,评估系统性能的测试用例可能与该系统需求规范中关于性能的特定要求相关联。例如如果面对一个排序算法,那么你的 test 输入是 [1,3,2,5,4] 那么你的预期输出就可以是 [1,2,3,4,5] 因为我的 specification 已经规定了这是个排序算法,因此这样产生的 oracle 往往简单

执行测试 test execution

一旦准备好可执行的测试用例,下一步是在被测程序上执行测试输入,**并记录软件的实际行为。**例如,记录功能测试输入产生的输出,或者测量执行性能测试输入所需的时间。

  • 测试执行是测试过程中通常可以自动化的一个步骤。这不仅节省了测试人员的时间,还允许以最小案例进行回归测试。

测试评估 test evaluation

  • 将测试输入下程序的实际行为与该测试输入下程序的预期行为进行比较,并确定实际行为是否满足要求。例如,在性能测试中,确定运行一个测试所需时间是否小于所需阈值。

testability 可测试性

  • 可测试性 testability 完全取决于 controllability 可控性observability 可观测性
    在这里插入图片描述
  • 可控性就是 tester 能够提供输入的程度
  • 可观测性就是 tester 能够观察软件行为的程度
  • squeeze 程序的可控性和可观测性都很强, 因为 tester 完全可以掌控输入的内容,并且也可以自由地观察输入(通过其他函数可以调用他最后生成的数组来观察 output)
  • 带 user interface 的程序更难以 控制观测
  • 嵌入式软件就更难

successful test case

  • 一个测出了 failure 的 test case 才是成功的

软件测试的心理学原则(Principles of software testing psychology)

预期测试结果

在这里插入图片描述

  • 对预期的 output 和结果的定义是必要的

不只靠自己测自己的程序

在这里插入图片描述

已经被发现很多错误的地方倾向于被发现更多的错误(places with already many discovered errors tend to be discovered even more errors.)

在这里插入图片描述

input domains

白盒测试的输入来源(什么内容可以构成 input domains)

在这里插入图片描述

黑盒 / 白盒测试

在这里插入图片描述

  • 黑盒测试是基于 specification 的 (仅测试其功能和程序的 features)
    在这里插入图片描述
  • 白盒测试是 specification + 程序的设计和代码

黑盒的好处

  • 可以在 program 完成之前就开始测试
  • 擅长于测试缺失的功能和程序行为与规范不符。

黑盒的坏处

  • 无法检测到已添加到代码中的附加功能或特性。这对于安全关键系统(额外的代码可能会干扰系统的安全性)或需要保密性(额外的代码可能被用来破解安全措施)尤为重要。例如一些安全相关的代码不会出现在 specification 中明确地规定,因此黑盒可能无法测试

在这里插入图片描述

白盒好处

  • 它测试代码的内部细节,并尝试检查程序可以执行的所有路径,以确定是否发生问题。因此,白盒测试用例可以检查已实施但未指定的任何附加代码。

在这里插入图片描述

白盒坏处

  • 白盒测试的主要缺点是必须在设计和编码被测试的程序之后才能选择测试用例。此外,如果系统的某些功能未实现,则使用白盒测试可能无法检测到这一点。
    在这里插入图片描述

Error guessing

  • 错误猜测是一种基于直觉和经验的即兴方法。其思想是识别出可能暴露错误的测试用例。
  • 基于:
    在这里插入图片描述
  • 错误猜测是即兴行动,因此不是系统化的。 这些笔记中描述的其他技术都是系统化的

一些testing的准则

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1174421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI写作神器,轻松搞定职场公文写作!

在当今数字化时代,人工智能技术的快速发展为各行各业带来了许多便利,因为AI写作的普及,使许多职场人士能够更加快速地撰写出高质量的公文,作为一家引领智能AI写作潮流的在线平台,boardmix博思白板以其独特的优势在这个…

D-Link账号密码泄露

构造payload: /getcfg.php SERVICESDEVICE.ACCOUNT&attackture%0D%0AAUTHORIZED_GROUP%3D1漏洞证明: 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免责声明:由于传播或利用此文所提供的信息、技…

CCF-CSP真题《202305-4 电力网络》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看:CCF-CSP真题附题解大全 试题编号:202305-4试题名称:电力网络时间限制:1.0s内存限制:512.0MB问题描述: 问题描述 西西艾弗岛电力公司需要修建一套电网对岛上的众…

贝叶斯网络:利用变量消除(Variable Elimination)进行推理

贝叶斯网络简介 贝叶斯网络(Bayesian network)也叫贝氏网路、信念网络(belief network)或是有向无环图(DAG)模型,是一种概率图模型。它利用DAG的结构,得到一组随机变量{X1,X2,...,Xn}的条件概率分布&#…

Java中的static

目录 static修饰成员变量 静态成员变量特征 static修饰成员方法 【静态方法特性】 static成员变量初始化 就地初始化 静态代码块初始化 注意事项 static修饰成员变量 静态成员变量特征 static修饰的成员变量,称为静态成员变量,静态成员变量最大的…

matplotlib从起点出发(10)_Tutorial_10_Layout

使用受约束的绘图干净整洁地将图形合适排列。 受约束的布局会自动调整子图,以便刻度标签、图例和颜色条等装饰不会重叠,同时仍保留用户请求的逻辑布局。 受约束布局类似于“紧密布局”,但它要更灵活。它处理放置在多个轴上的Axes(放置颜色条…

python 命令行界面的用户交互

背景 说一千,道一万,程序是为用户服务的,所以在程序运行过程,与用户交互以获取用户的信息输入和决策确认,是无法避免的编程需要考虑和解决的需求。 一个简单的demo 如下的程序中,程序需要生成一个新的 i…

图片批量归类:告别混乱,实现高效文件管理

在日常生活中,我们经常需要处理大量的图片文件。这些图片可能来自于不同的设备、不同的目录,甚至不同的存储介质。随着时间的推移,这些图片文件会越来越多,管理起来也会越来越困难。如何高效地整理这些图片文件,告别混…

初步利用Ansible实现批量服务器自动化管理

1.Ansible介绍 Ansible是一款开源的自动化运维工具, 在2012年由Michael DeHaan创建, 现在由Red Hat维护。Ansible是基于Python开发的,采用YAML语言编写自动化脚本playbook, 可以在Linux、Unix等系统上运行, 通过SSH协议管理节点, 无需在被管理节点安装agent。Ansible以其简单、…

MySQL 数据库安全性练习题

数据库安全性 一、实验目的 (1)熟悉通过MySQL对数据进行安全性控制 二、实验环境 Windows 11 MySQL Navicat 三、实验内容 今有以下两个关系模式: 职工(职工号,姓名,年龄,职务,工…

11.3递归建二叉树,二叉树函数规范化输入输出,一些二叉树性质,求叶子结点与树的高度

建树 ,递归建树 输入为 建立树 递归 函数参数表为引用或指针 void Creat(BiTree *T){char ch;scanf("%c",&ch);if(ch#){*TNULL;}else{*T(BiTree)malloc(sizeof(BiTNode));(*T)->datach;Creat(&(*T)->nextleft);Creat(&(*T)->nex…

标签识别中的数据泄露:关键分析

一、介绍 在数据驱动的决策时代,收集、处理和分析数据的过程在从医疗保健到金融,从营销到研究的各个领域都发挥着举足轻重的作用。数据分析的基本步骤之一是正确识别数据集中的标签或类别。然而,这项看似简单的任务可能充满挑战,尤…

springboot苍穹外卖实战:八、开发小程序准备工作+入门案例+小程序微信用户登录流程+商品浏览

开发小程序准备工作 官方网址:https://mp.weixin.qq.com/cgi-bin/wx?token&langzh_CN 1、微信小程序注册 注册地址:https://mp.weixin.qq.com/wxopen/waregister?actionstep1 2、 完善小程序信息 登录小程序后台:https://mp.weixin.…

前端框架Vue学习 ——(三)Vue生命周期

生命周期:指一个对象从创建到销毁的整个过程。 生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法(钩子) mounted:挂载完成,Vue 初始化成功,HTML 页面渲染成功…

Linux学习第33天:Linux INPUT 子系统实验(二):Linux 自带按键驱动程序的使用

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 本节笔记主要内容是学会如何使用Linux自带的按键驱动程序。 一、自带按键驱动程序源码简析 配置选项路径如下: -> Device Drivers ->…

内存学习(3):DRAM的基础存储结构(存储层级、读写过程,刷新与暂存)

1 DRAM背景简介 DRAM,全称为 Dynamic Random Access Memory ,中文名是“动态随机存取存储器”。所谓“动态”是和“静态”相对应的,芯片世界里还有一种 SRAM 静态随机存取存储器的存在。 笼统地说,DRAM 的结构比 SRAM 更简单&am…

UE5——源码阅读——2

这个是非常大的作用域,当程序离开这个东西,就会把它释放掉,设置了一个作用域把当前线程标记为主线程 插入了一个默认的Main,这个东西其实是标记点,这个标记是在UE内部有个性能分析工具可以看到这个标记点,主要是确定位…

【java学习—十三】处理流之三:标准输入输出流(3)

文章目录 1. 相关概念2. 举例与练习2.1. 举例2.2. 练习 1. 相关概念 System.in 和 System.out 分别代表了系统标准的输入和输出设备,默认输入设备是键盘,输出设备是显示器。     System.in 的类型是 InputStream     System.out 的类型是 PrintS…

SpringMvc从菜鸟到大拿完成蜕变

SpringMvc从菜鸟到大拿完成蜕 介绍 Why springmvc Servlet缺点: servlet中的service:方法一次只能处理一类请求;单拿用户表来说,得需要创建五个Servlet;在url中输入的是urlpattern;默认只访问service方法;如何减少Servlet的个数呢? 增加了一个method参数;其他人有可能会喜欢…

腾讯云CVM S5服务器优惠价格表,买一年送3个月

腾讯云服务器CVM标准型S5有活动,CVM 2核2G S5优惠价280.8元一年自带1M带宽,15个月313.2元、2核4G配置748.2元15个月、4核8G配置1437.24元15个月、8核16G优惠价3048.48元15个月,公网带宽可选1M、3M、5M或10M,腾讯云服务器网txyfwq.…