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

自动化UI测试 | 什么是测试驱动开发(TDD)和行为驱动开发(BDD)?有何区别?

TDD(测试驱动开发)和BDD(行为驱动开发)是两种独特的软件开发技术,它们在测试的内容和方式上有所不同。尽管名称相似,但服务于不同的目的。 

什么是TDD?

TDD代表测试驱动开发。它是一个过程,即为特定功能部分编写测试,运行测试以确定故障,然后根据需要调整代码以修复这些故障。通过TDD测试,开发人员可以确保他们编写的代码是功能性的、可靠的。此外,如果其他开发人员需要使用代码组件,他们也可以通过运行测试来确认代码的功能性。

TDD流程

执行测试驱动开发需要执行以下几个步骤:

  1. 开发人员编写自动化测试用例来测试代码行。

  2. 然后执行这些测试,以确定程序中出现故障的位置。

  3. 随后进行更改(重构),以确保修复故障,并且将来不会再次发生。

  4. 最后,再次执行测试,直到无误通过。

TDD优势

使用TDD有诸多优势,例如:

  • 减少返工时间:测试驱动开发不允许编写新代码,除非现有代码已成功通过无故障测试。在完全解决和消除故障之前,编写代码的过程会停止。因此,重新修复损坏代码的时间可以降到最低。

  • 快速反馈:由于测试每一次只针对特定的代码部分,开发人员可以获得更即时的反馈,从而更快地实施更改。

  • 提高开发效率:使用TDD时,重点是编写功能性代码,而不是设计测试用例。因此,生产力得以提高,开发工作得以顺利进行。

  • 代码更灵活、更易维护:由于代码在进入软件开发过程的下一环节之前,每个部分都经过测试,因此代码可以保持功能性,并在未来具有适应性。

测试驱动开发示例

为了更好地理解测试驱动开发在开发中的作用,我们通过一个示例来了解。在该示例中,我们可以定义一个密码类,以满足它必须为5-10个字符的条件。

第一步是编写满足必要要求的代码。然后运行测试以确保代码有效。例如,创建一个类来测试密码长度,运行测试,然后根据设置的条件(密码长度是否为5-10个字符),检查输出的是true还是false。如果测试返回false,则可以根据需要调整代码。

什么是BDD?

BDD代表行为驱动开发,它是软件开发团队和其他人员共同合作的一种方法,通过以下方式缩小业务团队人员和技术团队人员之间的距离:

  • 鼓励团队进行跨角色的合作,以增进对当前问题的理解

  • 对已完成的工作进行快速、小规模的迭代,以推进反馈并优化价值流

  • 生成系统文档,并根据系统行为进行自动检查

BDD通常涉及软件开发人员、测试工程师、项目经理以及其他利益相关者。这个团队一起开发用户故事中的具体验收标准示例。使用领域的特定语言,将这些示例进行描述并放入一个功能文件中。然后,这个功能文件被转换成可以执行的规范,从而允许开发人员编写也可以执行的实际测试。

BDD流程

行为驱动开发的步骤相当简单,必要时可以重复:

  1. 行为描述通常使用用户情景。这可以让团队讨论新功能的具体示例,以便每个人都能就行为的期望达成一致。

  2. 然后,将示例转换为文档来编写操作,使其可以自动化。

  3. 执行该测试,以协助开发人员,并指导他们开发代码。

  4. 然后创建代码,以使操作通过并使代码具有功能性。

BDD优势

使用BDD进行软件开发有几个好处,包括:

  • 融入用户体验:BDD注重用户体验,因此可以让团队形成更广阔的视角,并注意到他们在理解方面的差距。

  • 成本效益:由于BDD为用户、开发人员和投资者设定了优先级,因此可在程序开发过程中优化资源使用。

  • 简单的跨浏览器测试:BDD侧重于行为,这意味着它为跨浏览器测试提供了一个理想框架。

行为驱动开发示例

行为驱动开发遵循“Given-When-Then”框架。例如,如果您的网站具有语言翻译功能,并能将整个网页翻译为意大利语、西班牙语和法语,您可能会遇到如下场景:

场景:以我设置的语言(意大利语)接收信息

Given我是用户 “fmallo”

When系统发送消息 “InvalidLogin(登录无效)” 时

Then 我就会看到错误信息 “Login non valido(登录无效)”

场景:更改我使用的语言

Given 我是用户 “dmessina”

When我将语言设置为 “Spanish(西班牙语)” 时

Then 我的语言应该等于 “Spanish(西班牙语)”

TDD和BDD的区别

TDD(测试驱动开发)与BDD(行为驱动开发)主要区别在于测试的内容和方式。BDD主要站在最终用户的立场上测试应用程序,而TDD则注重于测试小部分的功能。

此外,BDD涉及更多人员——项目经理、开发人员和测试工程师,他们共同开发行为示例。因此,在实施任何内容之前需要进行大量的沟通。另一方面,TDD可以由单个开发人员完成,无需项目经理或利益相关者的外部投入。

使用Ranorex进行BDD和TDD

使用Ranorex进行行为驱动开发

DesignWise为BDD框架而构建。使用DesignWise,您可以更快地创建测试,同时减少冗余、降低风险和减少编码量。然后,您可以将它们导入Ranorex Studio 中来运行BDD测试。

使用Ranorex进行测试驱动开发

如果测试驱动开发更适合您的项目,Ranorex同样可以满足您的需求。无论您是想为您的TDD进行功能测试、回归测试,还是任何开发人员主导的测试,Ranorex Studio都能为您提供自动化所有测试的理想平台。

使用Ranorex提高测试自动化水平

Ranorex Studio是一款多功能且功能强大的工具,适用于开发人员和新手,它具有一系列功能,让您无需复杂的编码或手动测试即可创建和运行测试。

Ranorex中国授权合作伙伴——创实信息

电话:021-61210910
邮箱:customer@shcsinfo.com
官网:www.shcsinfo.com

相关文章:

自动化UI测试 | 什么是测试驱动开发(TDD)和行为驱动开发(BDD)?有何区别?

TDD(测试驱动开发)和BDD(行为驱动开发)是两种独特的软件开发技术,它们在测试的内容和方式上有所不同。尽管名称相似,但服务于不同的目的。 什么是TDD? TDD代表测试驱动开发。它是一个过程&…...

在 PyCharm 中接入deepseek的API的各种方法

在 PyCharm 中接入 DeepSeek 的 API,通常需要以下步骤: 1. 获取 DeepSeek API 密钥 首先,确保你已经在 DeepSeek 平台上注册并获取了 API 密钥(API Key)。如果没有,请访问 DeepSeek 的官方网站注册并申请 …...

postman登录cookie设置

1.设置环境变量, 定义变量存放共享的登录信息 如Cookie 2.登录接口编码test脚本获取cookie信息 let jsessionidCookie pm.cookies.get("JSESSIONID");if (jsessionidCookie) {let cookie "JSESSIONID" jsessionidCookie "; Admin-Tok…...

如何使用ps批量去除固定位置水印

使用 Photoshop 批量去除固定位置的水印,有几种方法可以实现自动化,具体取决于水印的复杂程度和你对 Photoshop 的熟悉程度: 1. 动作(Actions) 批处理(Batch): 这是最常用的方法&…...

AI代理软件行业白皮书

本AI代理软件行业白皮书的前言应涵盖以下核心内容: 行业背景与市场趋势 全球AI代理构建软件市场2023年销售额达3.17亿美元,预计2030年将增至4.77亿美元(年复合增长率6.7%),中国市场增长尤为显著。IBM、Microsoft等企业…...

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…...

机器学习·逻辑回归

前言 逻辑回归虽然名称中有 “回归”,但实际上用于分类问题。基于线性回归的模型,通过使用逻辑函数(如 Sigmoid 函数)将线性组合的结果映射到0到1之间的概率值,用于表示属于某个类别的可能性。 一、逻辑回归 vs 线性回…...

C#上位机--结构

引言 在 C# 上位机开发中,我们常常需要处理各种数据,例如从硬件设备采集到的传感器数据、与下位机通信时传输的数据包等。结构(struct)作为 C# 中的一种值类型,在这种场景下有着广泛且重要的应用。它可以将多个相关的…...

hydra.utils.instantiate函数介绍

hydra.utils.instantiate 是 Hydra 提供的一个动态实例化函数,它可以根据 OmegaConf 配置字典(DictConfig) 自动创建 Python 对象(如类、函数等)。 它的主要作用是: ✅ 从配置文件动态创建对象&#xff08…...

Qt的QTableWidget样式设置

在 Qt 中,可以通过样式表(QSS)为 QTableWidget 设置各种样式。以下是一些常见的样式设置示例: 1. 基本样式设置 tableWidget->setStyleSheet(// 表格整体样式"QTableWidget {"" background-color: #F0F0F0;…...

Moretl 增量文件采集工具

永久免费: <下载> <使用说明> 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架构 技术架构: Asp…...

dedecms 开放重定向漏洞(附脚本)(CVE-2024-57241)

免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

深入理解 MyBatis 框架的核心对象:SqlSession

Mybatis框架中的SqlSession对象详解 引言 MyBatis 是一个优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0…...

ndk 编译opencv(去除libandroid.so mediandk依赖)

简单的bash运行 需要关注的&#xff1a; OPENCV_EXTRA_MODULES_PATH &#xff1a; opencv contrib库BUILD_opencv_XXX &#xff1a;添加contrib库后默认是contrib库全部编译&#xff0c;用这个控制需要关闭的NDK的路径 export ANDROID_NDK/media/hello/data/3rd_party/25.2.…...

MySQL索引和其底层数据结构介绍

索引在项目中非常常见&#xff0c;它是一种帮助MySQL高效获取数据的数据结构&#xff0c;主要用来提高数据检索效率&#xff0c;降低数据库的I/O成本。同时&#xff0c;索引列可以对数据进行排序&#xff0c;降低数据排序的成本&#xff0c;也能减少CPU的消耗。就像是书的目录&…...

No module named ‘posepile.util‘

目录 No module named posepile.util 解决方法: No module named posepile.util 错误代码: import posepile.datasets3d as ds3d pip install git+https://github.com/isarandi/PosePile.git. And then, I executed the following command, " python -m metrabs_py…...

SQL布尔盲注、时间盲注

一、布尔盲注 布尔盲注&#xff08;Boolean-based Blind SQL Injection&#xff09;是一种SQL注入技术&#xff0c;用于在应用程序不直接显示数据库查询结果的情况下&#xff0c;通过构造特定的SQL查询并根据页面返回的不同结果来推测数据库中的信息。这种方法依赖于SQL查询的…...

RocketMQ与kafka如何解决消息丢失问题?

0 前言 消息丢失基本是分布式MQ中需要解决问题&#xff0c;消息丢失时保证数据可靠性的范畴。如何保证消息不丢失程序员面试中几乎不可避免的问题。本文主要说明RocketMQ和Kafka在解决消息丢失问题时&#xff0c;在生产者、Broker和消费者之间如何解决消息丢失问题。 1.Rocket…...

Uniapp 获取定位详解:从申请Key到实现定位功能

文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …...

【Vue3 入门到实战】14. telePort 和 Suspense组件

目录 ​编辑 1. telePort 2. 异步组件Suspense 3. 总结 1. telePort telePort 允许你将子组件渲染到 DOM 中的任何位置&#xff0c;而不仅仅是在其父组件的范围内。这对于模态框&#xff08;modals&#xff09;、提示框&#xff08;tooltips&#xff09;和其他需要脱…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...