当你编码时,目标是使程序正常工作。 但作为测试设计者,你希望让它失败。 这是一个微妙但重要的区别。

为什么软件测试很难?

  • 做不到十分详尽:测试一个 32 位浮点乘法运算 。有 2^64 个测试用例!
  • 随机或统计测试效果差:其他工程学科可以测试小的随机样本(例如制造的硬盘驱动器的 1%)并推断整个生产批次的缺陷率。但是对于软件来说并非如此。软件行为在可能输入的空间内不连续且离散地变化,系统可能在广泛的输入范围内似乎工作正常,然后在单个边界点突然失效,堆栈溢出、内存不足错误和数字溢出错误往往会突然发生。

Test-first programming

顺序:

  1. Specification (规范):编写函数签名和注释,明确其行为、输入约束和输出。
  2. Test (测试):根据规范编写测试用例。
  3. Implementation (实现):编写实现代码,并通过已写的测试。

测试优先编程的最大好处是防止错误。 不要将测试留到开发结束,因为此时有一大堆未经验证的代码。 将测试留到最后只会使调试时间更长、更痛苦,因为错误可能存在于代码中的任何位置。

Systematic testing

我们希望进行系统测试,而不是详尽、随意或随机的测试。系统测试意味着我们以有原则的方式选择测试用例,目标是设计一个具有三个理想属性的测试套件:

通过分区选择测试用例

我们希望选择一组足够小的测试用例,以便于编写和维护并快速运行,但又足够彻底以发现程序中的错误。

为此,我们将程序的输入空间划分为多个子域,每个子域由一组输入组成。我们只需要为每个集合测试一个代表。 这种方法通过选择不同的测试用例,并强制测试探索随意或随机测试可能无法到达的输入空间区域,从而充分利用了有限的测试资源。

例:

Math.abs()

测试用例:

  • a = 17 覆盖子域 a > 0
  • a = 0 覆盖子域 a = 0
  • a = -3 覆盖子域 a < 0

Math.max()

测试用例:

  • (a,b) = (1, 2) 覆盖 a < b
  • (a,b) = (10, -8) 覆盖 a > b
  • (a,b) = (9, 9) 覆盖 a = b

子域应具有三个理想的属性:

  • 互斥
  • 完整
  • 非空

自动化单元测试

  • 单元测试 (Unit Test):测试单个模块(如函数)的测试。
  • 自动化:使用测试框架(如Mocha for JS/TS)编写测试代码,自动运行并检查结果(使用assert.strictEqual, assert.deepStrictEqual等断言),输出通过/失败报告。
  • 文档化测试策略 (Documenting Strategy):在测试代码中以注释形式记录所采用的分区策略,并为每个测试用例命名其所覆盖的子域(如it("covers a < b", ...)),这极大地增强了测试套件的可理解性。

黑盒 vs 玻璃盒测试

  • 黑盒测试仅根据规范选择测试用例,不查看实现代码。这是测试优先编程的天然方式。
  • 玻璃盒测试基于对实现代码的了解选择测试用例(例如,测试不同的算法分支、内部缓存机制等)。
  • 结合使用:先进行黑盒测试(定义分区),再通过玻璃盒测试和覆盖率分析来补充测试用例,提高彻底性。

覆盖率

衡量测试套件对代码的覆盖程度,常用指标:

  • Statement coverage (语句覆盖):是否每条语句都被至少一个测试执行过?(常见目标)
  • Branch coverage (分支覆盖):是否每个控制分支(如if/else的两边)都被至少一个测试执行过?
  • Path coverage (路径覆盖):是否所有可能的执行路径都被覆盖?使用工具(如Istanbul/nyc)测量覆盖率,并补充测试用例以提高覆盖率

单元测试 vs. 集成测试

  • 单元测试孤立地测试单个模块。优点:错误更容易定位(就在被测试的模块中)。
  • 集成测试:测试多个模块的组合或整个系统。必要但错误可能出现在任何连接的模块中。
  • 策略:首先依靠全面的单元测试建立对各个模块的信心,然后使用集成测试来检查模块间的交互。尽量避免在单元测试中依赖其他可能出错的模块

自动化回归测试

  • 回归测试 (Regression Testing):在每次修改代码后(修复bug、添加功能、优化性能)运行完整的测试套件,防止修改引入新的错误
  • 测试优先调试 发现bug时,立即编写一个能重现该bug的测试用例,并将其加入测试套件。修复bug后,该测试用例就成为防止未来回归的回归测试
  • 自动化是回归测试可行的关键。

迭代式测试优先编程

软件开发不是线性的,应采用迭代方式:

  1. 编写初步规范和测试。
  2. 编写初步实现。
  3. 根据实现中发现的问题,迭代改进规范、测试和实现。
    迭代允许更快地获得反馈,更有效地利用时间,特别是在解决复杂问题时。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity开发】Unity核心学习(三)

四、三维模型导入相关设置 1、Model模型页签&#xff08;1&#xff09;场景相关&#xff08;2&#xff09;网格相关&#xff08;3&#xff09;几何体相关2、Rig操纵&#xff08;骨骼&#xff09;页签 &#xff08;1&#xff09;面板基础信息&#xff08;i&#xff09;None&…

C#语言入门详解(17)字段、属性、索引器、常量

C#语言入门详解&#xff08;17&#xff09;字段、属性、索引器、常量前言一、字段 Field二、属性三、索引器四、常量内容来自刘铁猛C#语言入门详解课程。 参考文档&#xff1a;CSharp language specification 5.0 中文版 前言 类的成员是静态成员 (static member) 或者实例成…

Total PDF Converter多功能 PDF 批量转换工具,无水印 + 高效处理指南

在办公场景中&#xff0c;PDF 格式的 “不可编辑性” 常成为效率瓶颈 —— 从提取文字到格式转换&#xff0c;从批量处理到文档加密&#xff0c;往往需要多款工具协同。Total PDF Converter 破解专业版作为一站式 PDF 解决方案&#xff0c;不仅支持 11 种主流格式转换&#xff…

[Windows] WPS官宣 64位正式版(12.1.0.22525)全新发布!

[Windows] WPS官宣 64位正式版 链接&#xff1a;https://pan.xunlei.com/s/VOYepABmXVfXukzlPdp8SKruA1?pwdeqku# 自2024年5月&#xff0c;WPS 64位版本在WPS社区发布第一个内测体验安装包以来&#xff0c;在近一年多的时间里&#xff0c;经过超过3万名WPS体验者参与版本测试…

WinExec

函数原型&#xff1a; __drv_preferredFunction("CreateProcess","Deprecated. See MSDN for details") WINBASEAPI UINT WINAPI WinExec(__in LPCSTR lpCmdLine,__in UINT uCmdShow); preferred : 更好的 __drv_preferredFunction("CreateProcess…

基于GA遗传优化的双向LSTM融合多头注意力(BiLSTM-MATT)时间序列预测算法matlab仿真

目录 1.前言 2.算法运行效果图预览 3.算法运行软件版本 4.部分核心程序 5.算法仿真参数 6.算法理论概述 7.参考文献 8.算法完整程序工程 1.前言 时间序列预测是机器学习领域的重要任务&#xff0c;广泛应用于气象预报、金融走势分析、工业设备故障预警等场景。传统时间…

Multi-Head RAG: Solving Multi-Aspect Problems with LLMs

以下是对论文《Multi-Head RAG: Solving Multi-Aspect Problems with LLMs》的全面解析&#xff0c;从核心问题、方法创新到实验验证进行系统性阐述&#xff1a;​​一、问题背景&#xff1a;传统RAG的局限性​​传统检索增强生成&#xff08;RAG&#xff09;在处理​​多维度复…

Jenkins 全方位指南:安装、配置、部署与实战应用(含图解)

一、Jenkins 安装 1.1 系统要求 基础环境&#xff1a;Java 8 或 Java 11&#xff08;推荐&#xff09;、至少 2GB 内存、10GB 以上磁盘空间 支持系统&#xff1a;Windows、Linux&#xff08;Ubuntu/CentOS&#xff09;、macOS 网络端口&#xff1a;默认使用 8080 端口&…

以国产IoTDB为代表的主流时序数据库架构与性能深度选型评测

> &#x1f4a1; 原创经验总结&#xff0c;禁止AI洗稿&#xff01;转载需授权 > 声明&#xff1a;本文所有观点均基于多个领域的真实项目落地经验总结&#xff0c;数据说话&#xff0c;拒绝空谈&#xff01; 目录 引言&#xff1a;时序数据库选型的“下半场” 一、维…

7.2elementplus的表单布局与模式

基础表单<template><el-form ref"ruleFormRef" :model"form" :rules"rules" label-width"100px"><el-form-item label"用户名" prop"username"><el-input v-model"form.username"…

PyTorch实战(3)——PyTorch vs. TensorFlow详解

PyTorch实战&#xff08;3&#xff09;——PyTorch vs. TensorFlow详解0. 前言1. 张量2. PyTorch 模块2.1 torch.nn2.2 torch.optim2.3 torch.utils.data3. 使用 PyTorch 训练神经网络小结系列链接0. 前言 PyTorch 是一个基于 Torch 库的 Python 机器学习库&#xff0c;广泛用…

在win服务器部署vue+springboot + Maven前端后端流程详解,含ip端口讲解

代码打包与基本配置 首先配置一台win系统服务器&#xff0c;开放你前端和后端运行的端口&#xff0c;如80和8080 前端打包 前端使用vue3&#xff0c;在打包前修改项目配置文件&#xff0c;我使用的是vite所以是vite.config.js。 import { defineConfig } from vite import …

Springcloud-----Nacos

一、Nacos的安装 Nacos是阿里推出的一种注册中心组件&#xff0c;并且已经开源&#xff0c;目前是国内最为流行的注册中心组件。下面我们来了解一下如何安装并启动Nacos。 Nacos是一个独立的项目&#xff0c;我们可以去GitHub上下载其压缩包来使用&#xff0c;地址如下&#x…

腾讯云重保流程详解:从预案到复盘的全周期安全防护

摘要 腾讯云针对国家级重大活动&#xff08;如进博会、冬奥会等&#xff09;提供的网络安全保障服务&#xff08;重保&#xff09;是一套系统化的主动防御体系。本文从“事前准备”“事中响应”“事后复盘”三个核心阶段出发&#xff0c;结合民生银行等典型用户的实战案例&…

单表查询-group by rollup优化

1、group by rollup基本用法 我们有时候在项目上看到group by rollup用法&#xff0c;其实就是对group by分组进行合计。 下面看一下例子 select count(1),c3 from t1 group by rollup(c3); 计划从计划中解读亦是如此&#xff0c;另外可以从结果上进行分析第21行的count其实就是…

云网络(参考自腾讯云计算工程师认证)

计算机网络&#xff1a;OSI七层模型&#xff1a; 应用层&#xff1a;负责处理网络应用程序之间的通信、 表示层&#xff1a;负责数据的格式化和加密、 会话层&#xff1a;负责建立、管理和终止会话、 传输层&#xff1a;负责端到端的可靠传输、 网络层&#xff1a;负责数据的路…

【MLLM】多模态理解Ovis2.5模型和训练流程(更新中)

note 模型架构&#xff1a;延续 Ovis 系列创新的结构化嵌入对齐设计。 Ovis2.5 由三大组件构成&#xff1a;动态分辨率 ViT 高效提取视觉特征&#xff0c;Ovis 视觉词表模块实现视觉与文本嵌入的结构对齐&#xff0c;最后由强大的 Qwen3 作为语言基座&#xff0c;处理多模态嵌…

mysql中的通用语法及分类

MySQL 是一种广泛使用的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;其语法设计遵循 SQL 标准&#xff0c;但也有一些特有的扩展。以下从​​通用语法规范​​和​​SQL 语句分类​​两个维度系统梳理 MySQL 的核心语法体系。一、MySQL 通用语法规范通用语法…

Linux-搭建NFS服务器

Linux-搭建NFS服务器前言一、网络配置二、在nfs服务器上安装nfs-utils软件包三、设置共享目录四、挂载NFS共享目录前言 NFS&#xff08;Network File System&#xff0c;网络文件系统&#xff09; 是一种分布式文件系统协议&#xff0c;最初由 Sun Microsystems 于 1984 年开发…

eslasticsearch+ik分词器+kibana

eslasticsearch 下载地址:https://www.elastic.co/cn/downloads/past-releases ik分词器 下载地址&#xff1a;https://release.infinilabs.com/analysis-ik/stable/ kibana 下载地址&#xff1a;https://www.elastic.co/cn/downloads/kibana 1、解压安装包 将下载的 zi…