当前位置: 首页 > news >正文

集成测试怎么做?

任何产品想要长期保持高质量运行,集成测试正是实现这一目标必不可少的工具。

本文重点介绍集成测试实现的流程,而非测试工具本身。我们的目的是聚焦于创建测试过程中你可能遇到的问题,以便你能自主地推进工作。

缺陷的成本

细节决定成败,在软件工程领域,这一点尤为真实,大多数缺陷都隐藏在细节之中。

然而,你是否思考过缺陷究竟是什么?或许你会不假思索地回答,它是应用程序中的一个错误状态,但你可能会感到惊讶,因为这个定义并不准确,实际上这是对应用程序运行不一致的定义。

确实,缺陷表现为一种与预期不一致的行为,但并非所有不一致的行为都是缺陷。两者之间的区别在于,缺陷必须是外部可观察到的。理解这一点至关重要,因为它能帮助我们避免编写无用的测试——这些测试可能会验证一个与预期不一致但并不构成缺陷的场景。

图片

明确了缺陷的定义后,你可能接下来会问自己的第二个问题是:为什么不让缺陷逃逸并让用户去反馈呢?

原因很简单,你是否有过需要重做过去已完成任务的经历?这难道不令人烦恼吗?你需要重新投入进去,努力回忆相关细节,换句话说,你的效率会降低,而这种效率的降低是有代价的。

这就是为什么缺陷发现得越晚,修复它的成本就越高的一个完美例证。在开发初期发现并修复缺陷,比起在产品发布后由用户发现再进行修复,所耗费的时间、资源和对用户信任度的影响都要小得多。因此,通过集成测试等手段提前捕捉并解决缺陷,对于控制成本、提高软件质量和用户满意度至关重要。

图片

这一成本正是我们希望在缺陷尚且廉价且容易修复的早期就发现它们的原因。

验证你是否完成了任务,而非你是否工作过。

关于测试,我最讨厌的一句话之一就是:“你测试过你的代码了吗?”大多数开发者不喜欢这句话,因为他们将测试视为一种被迫承担的任务,而我之所以不喜欢这句话,还有另一个原因:这句话从根本上就是错误的!

良好的意图有时也会导致糟糕的结果,这句话就是一个典型例子。当你对另一位开发者说这句话时,你的本意是好的,提醒他们别忘了测试,但你没有意识到的是,你也正在引导他们走向一个误区。

在进行测试时,你永远不能仅仅测试代码本身,而应该测试代码运行是否符合预期。

它并不是检验你的程序是否完全没有缺陷,而是检查测试预期与你的代码之间是否存在差距。

如果你基于代码来设计测试,那么即使你的代码没有达到项目期望,你也可能找不到任何缺陷,因为两者是匹配的!因此,正确的做法是确保测试是基于项目的实际需求和预期结果来编写的,而不是简单地验证代码逻辑本身。

那么,我们应该测试什么呢?

我们应该基于项目期望来进行测试,确保测试是围绕这些期望展开的,而绝不是在测试过程中揪住代码实现细节。

现在,你或许会对如何测试项目期望以及这些期望是什么感到困惑。这就是我想要向你介绍的——验收标准(Acceptance Criteria)的原因。

制定规范

没有什么比面对着一张白纸,完全不知道接下来该做什么更糟糕的了。而且,可以肯定的是,当你开始学习测试时,这种感觉会经常出现。

不过,我有一个好消息要告诉你,有一种方法可以减少这种迷茫感,那就是以一种特殊的方式编写规范,这种方式被称为验收标准。

验收标准是一句简单的句子,描述了应用程序中的一个原子行为,这样就便于测试,因为我们为每个场景都有了精确的指导。每个场景都会有一个精确描述它的验收标准,这让测试变得更加直接和有针对性。

图片

流程规范

与初学者常认为的不同,编写测试和代码之间存在着一定的顺序。

并非不遵循这一顺序就无法进行,但可能会使过程更加艰难且容易出错。

为此,一种既实用又流行的开发方式是测试驱动开发(Test Driven Development,TDD)。

然而,这种实践也有些教条化,作为初学者,在各种规则间很容易迷失方向。

因此,对初学者而言,回归基础,确保理解这一过程是非常重要的。

这是最重要的,一开始没有采用完美的流程并不可耻,罗马非一日建成,你的测试技能也是如此。

相反,最好专注于测试驱动开发的三个原则,并以最适合自己的方式去应用它们。

  1. 第一条原则是在编写任何代码之前先实现测试。

这样做的目的是确保你不是在测试代码本身,而是基于验收标准来设计测试。

  1. 第二条原则是,在编写任何代码之前,确保测试失败。

在小型项目中,这可能没有太多意义,但随着项目规模的扩大,很难追踪某个问题是否已被其他部分解决。这个检查是为了确保之前没有完成相同的工作,实施这段代码将为公司带来实际效益。

  1. 最后一条原则是,一旦完成代码编写,所有测试都应通过。

确保所有测试都能通过,有助于我们跟踪应用程序中重要的内容,并确保在将来重构或添加新功能时不会破坏任何现有功能。

图片

AAA框架

为了实现一个场景,我们有描述每个场景的验收标准,但如何从一句描述转换成实际代码呢?

第一步是确保验收标准是完整的,为此我们需要了解测试的三个组成部分。

1. 我们要安排应用程序的状态,确保每次运行时都有验收标准中明确规定的特定状态。这里的目的是每次运行测试时都拥有完全相同的状态,确保我们能够复现它。

2. 接下来的步骤是执行我们想要测试的逻辑。

3. 最后一步是断言新的状态是我们预期的,否则就让测试失败。

图片

如你所猜测的那样,如果了解AAA框架,就会发现每个步骤都遵循了该框架的一个步骤,并且为了明确定义验收标准,它也需要遵循这三步。

快速识别并不总是简单,因此设计了一种称为Gherkin的伪代码语言来解决这个问题。

在这个语言中,每个验收标准至少应包含以下每个关键词一次:

  • Given:这个关键词与设置步骤相关联,用于定义初始状态。

  • When:这个关键词用于定义需要执行的逻辑。

  • Then:这个关键词与断言步骤相关联,确保测试在验证最终状态是否符合预期。

最后总结下

测试是复杂的,但是通过遵循一些原则并妥善划分步骤,可以实现有效的测试。

首先,不能为了测试代码而测试,应该关注代码预期。

然后,遵循测试驱动开发的三条规则,确保你为公司编写了真正有效的代码,并且可以跟踪应用程序中哪些内容是重要的。

最后,为了编写每个场景,你需要遵循AAA框架,确保没有遗漏(Arrange)、(Act)和(Assert)这三个步骤中的任何一个。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:

集成测试怎么做?

任何产品想要长期保持高质量运行,集成测试正是实现这一目标必不可少的工具。 本文重点介绍集成测试实现的流程,而非测试工具本身。我们的目的是聚焦于创建测试过程中你可能遇到的问题,以便你能自主地推进工作。 缺陷的成本 细节决定成败&a…...

java mybatis 使用work id

在 MyBatis-Plus 中,如果你想要使用 WORK_ID 作为 ID 生成策略的一部分,通常是指使用雪花算法(Snowflake Algorithm)的一种变体来生成全局唯一 ID。雪花算法能够生成一个递增的 64 位整数作为 ID,这种 ID 在分布式系统…...

MySQL 的子查询(Subquery)

在数据库查询中,有时候我们需要从一个查询的结果集中获取数据,再将这些数据作为另一个查询的一部分来使用。MySQL 提供了子查询(Subquery)这一强大工具,帮助我们实现嵌套查询,从而解决复杂的数据检索需求。…...

后端Web之数据库(以MySQL为例)

目录 1.概述 2.MySQL 3.DDL 4.DML 5.DQL 1.概述 对于我们自己写的一些小功能,数据一般存储在文件中,比如XML文件。而在实际项目中,数据都是存放在数据库中的。数据库(DataBase )是一个存储数据的集合&#xff0c…...

委托发布 | 进迭时空联合移动云能力中心实现业界首个RISC-V IO虚拟化方案

仟江水商业电讯(8月22日 北京 委托发布)虚拟化是云计算技术基石,是RISC-V走进云计算等高性能计算场景的必然要求。RISC-V国际基金会2021年制定了Hypervisor 1.0规范,2023年制定了AIA 1.0规范和IOMMU 1.0规范,这3个规范…...

3-Electron打开新窗口,并跳转到指定的路由

需要配置路由。src/router/index.js {path: "/selectMode",name: "selectMode",component: () > import("//view/selectMode/index.vue"),},src/**.vue import { ipcRenderer } from "electron";const openNewTab () > {let p…...

comfyUI和SD webUI都有哪些差别呢?

ComfyUI和SD WebUI都是用于AI绘画的用户界面,它们各自有着不同的特点和适用场景。以下是两者之间的一些关键差别: 1、用户体验与界面友好性: SD WebUI(Stable Diffusion Web User Interface)以其直观易用著称,特别受初…...

MySql中常用的sql语句大全(工作常用篇)

1. DDL 1.1 操作数据库 --创建库 create database 库名;--创建库时判断库是否存在,不存在则创建 create database if no exists 库名;--查看所有数据库 show databases;--使用指定数据库 use 库名;--查看当前指定数据库包含的数据表 show tables;--查看数据库的结…...

React+Vis.js(03):vis.js设置节点形状

文章目录 Vis支持的形状类型代码实现完整代码实现效果Vis支持的形状类型 circle(圆形)box(盒子)dot(点)star(五角星)triangle(三角形)ellipse(椭圆形)triangleDown(倒三角形)diamond(菱形)代码实现 通过shape属性来定义每个节点的形状 const nodes = new vis…...

Pod和Deployment

一、pod Evicted状态: 在Kubernetes中,当节点资源紧张时,Kubelet可能会驱逐节点上的一些Pods以释放资源。当这种情况发生时,Pod的状态会被设置为"Evicted"。 1.pod的探针 1.就绪性探针: 一般用于探测容器…...

7. 数据结构—二叉树(链式存储)

1. 内容 包括链式存储二叉树的 递归与非递归实现的先序、中序以及后序遍历、层序遍历、创建二叉树、计算深度、总节点数。 2. 实现代码 注意:只是伪代码,如果想要运行的话在细节方面需要自己修正,栈和队列的方法实现需要引进或者使用其C自…...

AScript 的UI asui模板的导入

两种方案: 第一种直接在web端,右击UI文件夹 第二种在pycharm,也是右击UI文件夹 调用UI,在init类中直接调用即可...

Linux shell编程学习笔记75:sed命令——沧海横流任我行(下)

0 前言 在 Linux shell编程学习笔记73:sed命令——沧海横流任我行(上)-CSDN博客文章浏览阅读684次,点赞32次,收藏24次。在大数据时代,我们要面对大量数据,有时需要对数据进行替换、删除、新增、…...

探索Scratch中的物理世界:碰撞与重力的编程之旅

标题:探索Scratch中的物理世界:碰撞与重力的编程之旅 Scratch是一款由麻省理工学院媒体实验室开发的编程教育工具,它以图形化编程界面为特色,让初学者能够轻松地学习编程基础。Scratch不仅支持基本的编程逻辑,如循环、…...

大模型重塑就医体验:医联MedGPT助力健康中国建设

来源:新华网 2024 08/22 11:24:15 【责任编辑:吴起龙】 随着“百模大战”的加速推进,AI大模型的应用逐渐成为各行业关注的焦点。在这一背景下,医疗行业也迎来了AI技术的深度渗透。自2023年起,百度、科大讯飞、百川智能、商汤…...

TOMCAT全解

目录 一 、WEB技术简介 HTTP协议 B/S 结构 前端三大核心技术简介 HTML CSS JavaScript 二 、WEB框架 web资源和访问 后台应用架构 三、tomacat的介绍 四、tomcat的部署 tomcat的反向代理 tomcat的负载均衡 memcached的安装与启动 tomcat的session会话保持 一 、WE…...

UDP+TCP

一、UDP协议 1.recvfrom:recvform(int sockfd,void *buf,size_t len,int flags,struct sockaddr *src_addr,socklen_t *addrlen); 参数:socket的fd; 保存数据的空间地址 ; 空间大小; 默认接收方式(默认阻塞&#xf…...

分页查询面试记录和面试详情

文章目录 1.分页查询面试记录1.req和vo1.InterviewHistoryReq.java2.InterviewHistoryVO.java 2.InterviewController.java3.service1.InterviewHistoryService.java2.InterviewHistoryServiceImpl.java 4.测试 2.查询面试详情1.InterviewQuestionHistoryVO.java2.InterviewCon…...

Oracle 同义词SYNONYM 的实战使用

Oracle中的同义词(SYNONYM)是一种数据库对象,它为其他数据库对象(如表、视图、序列、存储过程、函数等)提供了一个别名。这个别名可以在SQL语句中代替原始对象的名称,从而简化查询和引用,提高数…...

实验11-1-8 查找子串

本题要求实现一个字符串查找的简单函数。 函数接口定义: char *search( char *s, char *t );函数search在字符串s中查找子串t,返回子串t在s中的首地址。若未找到,则返回NULL。 输入样例1: The C Programming Language ram输出样…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如&#xff1a…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...