web自动化测试进阶篇02 ——— BDD与TDD的研究实践

news2024/11/20 19:42:43

在这里插入图片描述

 
 

在这里插入图片描述
😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。
📡主页地址:【Austin_zhai】
🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。
💎声明:博主日常工作较为繁忙,文章会不定期更新,各类行业或职场问题欢迎大家私信,有空必回。

在这里插入图片描述

 
 

阅读目录

  • 1. 目的
  • 2. BDD
    • 2.1 工作流程
      • 2.1.1 需求理解
      • 2.1.2 规范定义
      • 2.1.3 用例编写
      • 2.1.4 测试执行
      • 2.1.5 后续优化
    • 2.2 用例的编写
    • 2.3 脚本实现
  • 3. TDD
    • 3.1 工作流程
      • 3.1.1 编写用例
      • 3.1.2 执行用例
      • 3.1.3 编写代码
      • 3.1.4 执行用例
      • 3.1.5 代码重构
      • 3.1.6 重复迭代
    • 3.2 用例与代码实现
  • 4. 后话

1. 目的

在这里插入图片描述

  web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”,通常都会作为广大测试从业者的首选学习对象,相较于C/S架构的自动化来说,B/S有着其无法忽视的诸多优势,从行业发展趋、研发模式特点、测试工具支持,其整体的完整生态已经远远超过了C/S架构方面的测试价值。

  在我们所熟知的自动化测试过程中,除了测试同学之外还有着另外一个非常重要的角色,开发。我们的被测对象的“亲生父母”,那么在自动化测试开展的过程中,如何才能显著提升被测对象的质量与健壮性呢,今天我们就来讲讲与之息息相关的两个开发方法,BDD与TDD。

 
 

2. BDD

在这里插入图片描述

  BDD也就是我们常说的行为驱动开发(Behavior-Driven Development),它是一种基于用户行为的开发方法,强调以用户需求为核心,用自然语言描述用例场景,并在此基础上进行开发和测试。那么在BDD的行为模式下就需要开发人员与产品人员进行紧密的合作,将用户故事和场景描述转化为可执行的测试用例。这样可以确保软件的功能符合用户需求,同时也有助于产品人员更好地理解软件开发过程。从上面我们不难看出这个开发的行为模式下,开发不是拿到产品需求就开始设计概设、详设就开始开发工作的,基于产品的需求之上还要求开发要参照产品与用户的行为与需求,重点根据以用户行为为中心而设计的故事进行侧重开发。我们在BDD模式下将产品故事成为测试用例,而这个测试用例则是需要产品、开发、测试共同进行设计、编写与审核的,这个与我们日常测试活动中所涉及的工作流程会有所不同,所以对于三个团队的紧密合作与沟通要求水准会比较高。

 

2.1 工作流程

  对于BDD模式下项目活动,这个大致的主线与一般的开发模式相同,只不过在每个阶段的执行过程中会有着其独特的特征存在并左右项目的质量优良与否。接下来我们就一起来看一看该模式下的一些基础工作流程。

 

2.1.1 需求理解

  开发团队、测试团队和产品团队需要深入理解用户的需求和期望,包括功能需求、行为规范等。这包括与需求人员的讨论、用户故事编写和使用场景描述等。

2.1.2 规范定义

  围绕用户需求,开发团队与产品团队、测试团队一起定义可执行的用户行为规范。这些规范用自然语言描述系统的行为和期望结果,一般采用类似于Gherkin语言的格式进行规范与编写。

2.1.3 用例编写

  测试团队根据行为规范编写测试用例,将其转化为可执行的测试脚本。测试用例描述了具体的场景和期望结果,用于验证系统的行为是否符合预期。测试用例应该具有可读性和可理解性,以便业务人员能够理解和参与讨论。

2.1.4 测试执行

  测试团队使用适当的自动化测试框架和工具,将测试用例转化为可执行的自动化测试脚本。这些脚本可以模拟用户的行为,与系统交互并验证行为是否符合规范。然后开始执行这些测试脚本,至于是否放在开发本地还是CI环境中都可以。

2.1.5 后续优化

  根据测试结果和反馈,测试团队进行迭代和改进,修复问题并改进系统的行为。这包括与产品团队、开发团队的协作和讨论,以确保软件开发朝着正确的方向进行。

 

  从上面的基础流程上来看,大家不难发现,在很多的阶段中测试团队都担任了非常重要的角色,不仅仅要和产品与开发团队保持高度的通过与合作频率,更需要主导大部分的流程工作内容。所以BDD的模式下对于产品的需求与用户行为有着很强的针对性,相较于一般的测试模式,BDD模式在需求理解、沟通和测试用例编写方面具有较为明显的优势,通过强调共同理解、用户需求驱动和自然语言描述的测试用例,提高了团队合作和软件质量。另外该模式对于自动化测试持续改进与优化迭代有很好的兼容性,所以也主要出现在团队的自动化测试活动中。

 

2.2 用例的编写

  故事的编写(用例)是BDD中极其重要的一步,可以说没有一个设计完整的故事,后续就很难高质量的将产品需求覆盖完整,开头方向都错了后续就更加不要指望可以高效高质的完成质量保障工作了。

  前面也介绍过了,BDD模式下的故事编写方式一般为类似Gherkin语法的方式,其实可以理解为你将某一个功能的应用场景设计为了一个简单的故事,故事里面会将所有的前情与条件描述清楚,然后根据条件与剧情发展的不同而达成不同的结局,就好像在拍一部电影一样。那么下面就由博主来为大家描述一个简单的故事场景(产品功能使用场景)。

  在金融行业中我们经常会接触到需要购买境外基金的情况,那么这样的一个场景我们在BDD模式下应该如何进行用例的编写呢?

场景:普通用户进行境外基金购买
 
场景描述: 作为一位投资者,用户希望能够成功购买境外基金,以便将资金投资于跨境投资机会。
 
Given:
用户已登录到其投资账户;
用户已完成合规认证,具备购买境外基金的资格;
账户余额足够购买所选境外基金;
目标基金的代码为 【ABC456】,属于美国市场。
 
When:
在基金市场页面,用户选择了境外基金 【ABC456】;
用户输入了购买金额 “2000”;
用户选择了购买货币为人民币(CNY);
用户点击购买按钮。
 
Then:
用户应该看到购买确认页面显示基金的详细信息,包括名称、代码、购买金额和货币类型;
用户确认购买信息无误后,点击确认按钮;
系统应该跳转到境外基金购买流程,并提供用户需要提供的信息;
用户按照指引输入和确认所需的个人身份信息和资金来源信息;
系统应该显示购买成功的提示信息,并更新用户的投资账户余额;
用户的投资账户余额应该减少购买金额 “2000”;
用户的投资账户的交易记录中应该出现一条购买境外基金的记录,包括基金名称、代码、购买金额和货币类型。

  以上就是一个基础的BDD模式下的产品故事(测试用例),大家可以看到,它其实就是通过一些关键字(given、when、then)来清晰地描述了测试的场景、条件和预期结果。那么有了这个测试团队可以基于测试用例编写自动化测试脚本,并执行验证功能的正确性和流程的完整性。

 

2.3 脚本实现

  那么基于以上所设计的测试用例,我们就可以在编写脚本的过程中按照实现定好的剧本走向来设计业务流程的走向与其测试点。

  具体的整体脚本就不演示了,编写所需要的技巧已经在前几篇文章中介绍过了,这里就直接演示如何根据测试用例来实现测试脚本。

class TestPurchaseOverseasFund(unittest.TestCase):
    
    def setUp(self):
        self.driver = webdriver.Chrome()  
        self.driver.implicitly_wait(10) 

    def tearDown(self):
        self.driver.quit()

    def test_purchase_overseas_fund(self):
        # 购买境外基金的测试用例
        
        # Given
        self.driver.get("https://example.com")  # 替换为基金交易平台的URL
        self.driver.find_element_by_id("login_username").send_keys("your_username")  # 替换为用户名输入框的ID
        self.driver.find_element_by_id("login_password").send_keys("your_password")  # 替换为密码输入框的ID
        self.driver.find_element_by_id("login_button").click()  # 替换为登录按钮的ID
        self.driver.find_element_by_id("balance").text = "5000"  # 替换为账户余额显示元素的ID或选择器
        
        # When
        self.driver.find_element_by_id("fund_market").click()  # 替换为基金市场入口的ID
        self.driver.find_element_by_id("fund_code_input").send_keys("ABC456")  # 替换为基金代码输入框的ID
        self.driver.find_element_by_id("purchase_amount_input").send_keys("2000")  # 替换为购买金额输入框的ID
        self.driver.find_element_by_id("currency_dropdown").click()  # 替换为货币选择下拉菜单的ID
        self.driver.find_element_by_id("currency_cny").click()  # 替换为人民币选项的ID
        self.driver.find_element_by_id("purchase_button").click()  # 替换为购买按钮的ID

        # Then
        self.assertTrue(self.driver.find_element_by_id("purchase_confirmation").is_displayed())  # 替换为购买确认页面元素的ID或选择器
        self.driver.find_element_by_id("confirm_button").click()  # 替换为确认按钮的ID
        self.assertTrue(self.driver.find_element_by_id("success_message").is_displayed())  # 替换为购买成功提示信息的ID或选择器
        self.assertEqual(self.driver.find_element_by_id("balance").text, "3000")  # 替换为账户余额显示元素的ID或选择器
        self.assertTrue(self.driver.find_element_by_id("transaction_record").is_displayed())  # 替换为交易记录元素的ID或选择器

if __name__ == '__main__':
    unittest.main()

 
 

3. TDD

在这里插入图片描述

  TDD相信做测试的大家都应该不陌生,测试驱动开发(Test-Driven Development),这种开发的行为模式的核心主旨就是要求测试同学在开发人员做功能实现的工作之前就完成测试用例的编写,将测试用例做为代编写代码的依照与参考,完成接下去的工作。正所谓字如其名,测试驱动开发。

 

3.1 工作流程

  相较于BDD的开发行为模式,TDD的变化其实非常大,这个可以说在某些特定环节中是基本颠覆了我们日常的项目流程顺序,也正因如此,排除团队与其他不可控因素的影响,TDD模式下产出的产品与项目,其质量与需求完成度可以说是相当之高了。

3.1.1 编写用例

  对,你没看错,在这个模式下,一上来就要编写测试用例,但对于大多数测试同学来说,这个却应该不是难事,基于需求编写测试用例早已不是什么稀罕事了。在开发人员进行代码编写的工作前,测试同学就需要早早的开始用例的编写,结束的节点也差不多是开发开始之前再早些时候。而测试用例的内容则与普通测试流程中所需要设计的用例一致。

3.1.2 执行用例

  看到这里,大家是不是觉得更离谱了?没有任何代码与程序的前提下为什么要执行测试用例呢?但我想说的是,这是一个不可或缺的验证阶段,检验的当然不是被测对象,而是测试用例本身,确保用例本身可以正确的执行。

3.1.3 编写代码

  依照对应功能模块的测试用例,开发人员开始编写对应的代码,这里的目标是编写最少量的代码,以使得当前的测试用例能够通过。这里需要区别开的是,此阶段的代码编写通常关注于满足测试用例的需求,而不是关注整体的实现。

3.1.4 执行用例

  基于编译完的功能再次执行测试用例,验证当前编写的功能代码是否通过测试。如果测试用例通过,意味着功能代码满足了需求。如果测试用例失败,说明功能代码存在问题,需要进行修复。其实此步骤的执行流程与普通阶段的基本一致。

3.1.5 代码重构

  在功能代码通过测试之后,可以对代码进行重构。重构是指对代码的结构、设计和可读性进行优化,以改进代码的质量和可维护性,而不改变代码的功能。重构后需要再次运行测试用例,确保代码重构没有引入新的错误。

3.1.6 重复迭代

  之后的动作基本就是重复以上的这些流程了,以规定好的功能为范围,进行测试驱动开发。

  其实可以看出TDD的工作流程是一个持续循环的过程,每个功能都会经历一轮完整的测试、开发、验证和重构。通过频繁运行测试用例,其优势就是开发人员可以尽早发现问题并及时修复,从而保证代码的正确性和可靠性。

 

3.2 用例与代码实现

  用例的写法与普通流程的一致,如果需要了解普通的黑盒用例写法,大家可以翻看之前的测试用例设计相关博文,测试脚本也是类似,不再展开讨论。

 
 

4. 后话

在这里插入图片描述

  无论是BDD也好,还是TDD也罢,并没有所谓的最好的开发行为模式,真正有效的针对各自团队与产品、公司现状而使用以上两种开发行为模式才是正道。如果你的项目需求明确、关注用户行为与产品业务价值的权重比较高,而团队之间又可以高度紧密合作在一起的,BDD模式就是你们产研的不二之选;另一方面,如果你的项目需求较为模糊或变动频繁、业务功能复杂且没有什么试错的空间、同时又需要业务代码又较强的维护性和质量,那么就可以大胆的尝试TDD。当然两者的使用场景不单单如此,更有甚者,将两者结合使用,据项目需求和团队特点进行灵活选择和调整。重要的还是在于如何理解并加之在日常工作中真正的实践总结和反复优化。

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

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

相关文章

Apollo oracle适配

前言:公司数据库统一切换为oracle,减少部署mysql,现需要将Apollo的数据库做oracle适配,当前使用版本为Apollo2.0.0,网上找到最新版本的适配oracle的版本也仅为1.4.0,现决定自己适配。 部分参考了官方介绍的…

使用FFMPEG加载外挂或内封字幕小记

ffmpeg版本: FFMEPEG 4.4 继上一篇实现音视频播放器后,将加载字幕的过程和遇到的坑记录如下: 字幕初识 视频字幕分为三种。 内嵌字幕,字幕与视频图像合二为一,成为视频帧的一部分,也叫硬字幕。 内封字…

数据库完整性

完整性概述 数据库的完整性是指数据库的正确性、一致性、相容性 正确性:数据库的数据符合语义约束 一致性:数据间的逻辑关系是正确的,从一个一致性状态转移到另一个一致性状态 相容性:同一事物的两个数据应当是一致的 约束的分类…

Zookeeper(一)

简介 设计模式角度 Zookeeper:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知已经在Zookeeper上注册的那…

JDBC从入门到精通

1 JDBC概述 在开发中我们使用的是java语言,那么势必要通过java语言操作数据库中的数据。这就是接下来要学习的JDBC。 1.1 JDBC概念 JDBC 就是使用Java语言操作关系型数据库的一套API 全称:( Java DataBase Connectivity ) Java 数据库连接 我们开发的同…

两年时间,成为测试组老大....

看到行业的前辈都分享一些过往的经历来指导我们这些测试人员,我很尊敬我们的行业前辈,没有他们在前面铺路,如今我们这帮年轻的测试人估计还在碰壁或摸着石头过河,结合前辈们的经验,作为年轻的测试人也有自己的一些职场…

IMX6ULL裸机篇之DDR3的时钟配置

一. MMDC 控制器 对于 I.MX6U 来说,有 DDR 内存控制器,否则的话它怎么连接 DDR 呢?MMDC控制器 就是 I.MX6U 的 DDR内存控制器。 MMDC 外设包含一个内核(MMDC_CORE)和 PHY(MMDC_PHY),内核和 PHY 的功能如下: MMDC 内…

nacos服务端源码集群同步源码分析

nacos集群状态同步源码分析 ServerStatusReporter ServerStatusReporter 是 ServerListManager的内部类 通过Component注解被解析到spring容器中 再通过PostConstruct初始化执行init方法 上边代码启动了一个延时2秒的线程 private class ServerStatusReporter implements Run…

信号时域分析方法

主要参考: 时域分析——有量纲特征值含义一网打尽 信号时域分析方法的理解(峰值因子、脉冲因子、裕度因子、峭度因子、波形因子和偏度等) 重要笔记如下: 建议跟参考笔记同步看。 有量纲特征值8个——最大值、最小值、峰峰值、均值…

Unable to resolve resource vscode-vfs://github%2B7b2276223a312c22726566223a7

github无法访问?vscode 无法使用github登录同步? 改 hosts 吧 Unable to resolve resource vscode-vfs://github%2B7b2276223a312c22726566223a7一、无法访问 github.com ? 想要去 github.com 上拿来主义,结果访问不了,或者 np…

Go基础篇:接口

目录 前言✨一、什么是接口?二、空接口 interface{}1、eface的定义2、需要注意的问题 三、非空接口1、iface的定义2、itab的定义3、itab缓存 前言✨ 前段时间忙着春招面试,现在也算告一段落,找到一家比较心仪的公司实习,开始慢慢回…

Linux防火墙之iptables(上)

目录 一、iptables防火墙的相关知识 1)防火墙的概念 2)iptables的简介 3)netfilter/iptables 的关系 netfilter iptables 二、iptables中的四表五链 1 )四表五链的关系 2)iptables中的四表 3&#xff0…

0基础要怎么开始学习c++?

先放一张学习线路图: 对于初学者看到这张线路图可能有点晕。实际上耐心一点,有足够的毅力还是可以自学攻克C这门语言的。 一、C语言 基础内容就是两块:基础语法和一个小游戏案例 进阶一点也是两块内容:C高级和数据结构。包括一…

怎么画骑鹅旅行记思维导图?办公常备工具

骑鹅旅行记不仅是一本神奇的奇幻童话,更是一本寓教于乐的启蒙读物,引导着孩子们学习正确的价值观和道德观。在开始制作骑鹅旅行记思维导图之前,我们需要先整理好故事情节:小男孩尼尔斯因捉弄动物而被一个小精灵变成了拇指大小&…

中国社科院与美国杜兰大学金融管理硕士——与时间赛跑,充分利用每一分钟

不管你愿不愿意,时间总是在不经意间流去。林清玄在《和时间赛跑》中写道:“虽然我知道人永远跑不过时间,但是可以比原来快跑几步。那几步虽然很小很小,但作用却很大很大”。是的,我们需要与时间赛跑,充分利…

就业内推 | 上市公司招网工,最高25k*14薪,六险一金

01 锐捷网络 招聘岗位:网络工程师 职责描述: 1、承接本产品线(无线或数通)所有咨询、故障、网络变更等业务,响应内外部客户的业务响应需求,需要值班。 2、同时作为产品线技术力的核心,需要负责…

购票API接口商品详情信息API

购票网是一个在线购票平台,为音乐会、演唱会、话剧、体育比赛等各类娱乐活动提供门票销售服务。通过大麦网,用户可以轻松购买心仪的演出门票,并享受到良好的购票体验。 为了让更多用户了解到大麦网的商品详情,并能够方便地获取相…

内防泄密重要,还是外防窃密重要?

内防泄密是组织为防止内部敏感信息未经授权泄露所采取的各种管理与技术措施的总称。它主要针对内部人员的信息访问与操作行为进行管控,减少故意或疏忽泄密事件的发生几率。 内防泄密的工作,通常包括员工管理、权限管控、监控检查、分级保护、离岗管控、技术防护、事…

高赞热门,这是B站值得一看的商单作品

3月30日、5月11日,第十届中国网络视听大会和首届上海网络视听内容创作者大会先后开幕。 在现场,陈睿共发表了《科技与青年的双向奔赴》、《B站,高质量内容的沃土》两次主题演讲。陈睿分享道,“优质的内容和创作者,是能…

主动防御更安全 混沌工程助力企业系统稳定

数字经济时代背景下,各个行业迎来数字化转型浪潮,随着企业对于云计算的理解和实践不断深入,数据作为生产要素参与到市场分配当中,全面渗透金融、政务、医疗、教育、能源等各个领域,已成为企业发展乃至国家发展的重要战…