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

测试框架体系 TDD DDT BDD ATDD 介绍

文章目录

  • 一. 测试框架体系介绍
    • 1. 核心价值
    • 2常见框架类型
  • 二. 测试驱动开发 (TDD)
    • 1. 定义与流程
    • 2. 代表工具与代码示例
  • 三. 行为驱动开发 (BDD)
    • 1. 行为驱动开发 (BDD) 的定义与价值
    • 2. BDD 与 TDD 的关系
    • 3. BDD 的核心
    • 4. BDD 流程实现
  • 四. 验收测试驱动开发 (ATDD)
    • 1. 什么是 ATDD
    • 2. 核心工具:FitNesse 和 Robot Framework
  • 五. 数据驱动测试 (DDT)
    • 1. DDT的核心观念
    • 2. DDT的优势
    • 3. 数据驱动开发的使用

一. 测试框架体系介绍

测试框架不仅仅是工具的集合,它是一套指导测试用例设计与执行的规则体系。它由最佳实践、编码标准、数据处理方法、对象库管理及结果报告机制组成,旨在帮助 QA 团队更高效、规范地进行测试工作。

  • 通俗易懂理解:不同的测试框架体系其实就是几种不同的自动化测试“玩法”,它们各有侧重,可以根据实际的应用场景去匹配合适的测试框架体系。
    • 这些测试框架体本质上··就是一种思想,比如如下示例

      原本软件开发流程通常是设计需求文档,然后开发及多方协商根据需求文档进行软件设计和开发,开发完成或者开发到一定阶段,测试介入开始质量验证,验证合格后交付给客户进行进一步验收,客户验收完成,项目进入维护阶段,流程基本结束。

      但是如果甲方对项目质量要求特别高,那么就需要用到TDD测试框架体系了,这种体系成本较高,但是可以做到项目单元模块级别的质量保证。

      不同的测试框架其实就是在软件开发不同的阶段介入测试,以此达到对应的预期效果

1. 核心价值

引入成熟的测试框架能为团队带来显著收益:

  • 降本增效:降低维护成本,提高测试效率,减少重复劳动。
  • 质量保障:最大化测试覆盖率,减少人工干预带来的不确定性。
  • 资产复用:提高代码复用率,提升投资回报率 (ROI)。

2常见框架类型

框架类型核心特征适用场景
TDD测试驱动开发代码逻辑验证,白盒测试
BDD行为驱动开发业务行为描述,跨部门协作
ATDD验收测试驱动开发需求验收,业务方参与
MBT基于模型的测试复杂状态流转,路径覆盖
DDT数据驱动测试多组数据验证同一逻辑

二. 测试驱动开发 (TDD)

1. 定义与流程

  • TDD 是一种“测试先行”的开发模式。它要求在实际代码开发之前先编写测试用例,通过不断的“红-绿-重构”循环来驱动代码演进。

    核心循环流程:

    1. Add a Test (红):编写一个会失败的测试(因为功能尚未实现)。
    2. Run Tests (红):运行测试,确认失败。
    3. Write Code (绿):编写刚好能让测试通过的代码。
    4. Run Tests (绿):运行测试,确认通过。
    5. Refactor (重构):优化代码结构,消除重复,保持测试通过。
  • 核心思想

    1. 在真正开发之前先根据需求写出测试用例
    2. 开发根据此测试用例写出刚好可以通过的功能需求代码
    3. 测试通过后,开发在此基础上优化代码逻辑
  • 核心目的

    确保每一个代码单元都十分健壮,从根源上减少 Bug。


2. 代表工具与代码示例

  • Java (JUnit/TestNG):
    使用注解(如@Test@BeforeClass)管理生命周期,断言清晰。

    • @Test示例

      @TestvoidstandardAssertions(){assertEquals(2,calculator.add(1,1));assertTrue('a'<'b',()->"Assertion messages can be lazy");}
    • @BeforeClass示例

      packageexample1;importorg.testng.annotations.*;publicclassSimpleTest{@BeforeClasspublicvoidsetUp(){// 测试时真实需要调用的代码}@Test(groups={"fast"})publicvoidaFastTest(){System.out.println("Fast test");}@Test(groups={"slow"})publicvoidaSlowTest(){System.out.println("Slow test");}}
  • Python (Pytest/Unittest):
    Pytest 语法简洁,可以直接使用 assert 进行断言;Unittest 则更接近 JUnit 风格。

    • Pytest 示例

      deftest_answer():assertinc(3)==5
    • Unittest 示例

      importunittest# 被测函数definc(x):returnx+1# 测试类,必须继承 unittest.TestCaseclassTestIncFunction(unittest.TestCase):# 测试方法,必须以 test_ 开头deftest_answer(self):# 使用 self.assertEqual 进行断言,而不是直接使用 assertself.assertEqual(inc(3),5)# 运行测试的标准写法if__name__=='__main__':unittest.main()


三. 行为驱动开发 (BDD)

1. 行为驱动开发 (BDD) 的定义与价值

BDD 是 TDD 的延伸,其主要目的解决开发过程中的沟通鸿沟
举个粒子:

在传统的开发中,产品经理(业务方)、程序员(开发)和测试员(QA)往往“鸡同鸭讲”。产品说“我要一个丝滑的登录体验”,程序员以为“加个动画”,测试员以为“测试一下密码错误提示”。大家理解都不一样,最后做出来的东西肯定不对。

而 BDD 就是全员先商讨和使用通用语言(Ubiquitous Language)来描述软件行为。全员无异议,并都明确需求,自然就没有沟通鸿沟了。

2. BDD 与 TDD 的关系

双层循环:BDD 处于外层循环,确保做正确的事,即:站在用户的视角看问题,比如作为用户;TDD 处于内层循环,关注“单元测试”,确保正确地做事。

  • 流程对比:
    • TDD:关注代码实现细节(输入 -> 输出)
    • BDD:关注业务行为(Given -> When -> Then)
  • 总结:BDD 管大方向(业务行为),TDD 管小细节(代码实现)。

3. BDD 的核心

  • BDD 的核心

    业务人员负责写 .feature 剧本,程序员负责写 @Given/@When/@Then 的翻译代码。

  • 核心工具:Cucumber

    Cucumber 是 BDD 的标志性工具,它将自然语言编写的文档转化为可执行的测试代码。

  • 三大支柱:自动化测试 (Automated Tests) + 可执行规范 (Executable Specs) + 活文档 (Living Documentation)。
    Gherkin 语法示例:

4. BDD 流程实现

  • 第一步:业务人员编写Gherkin 语法,用以需求沟通(通常以.feature结尾)示例:

    Feature:User RegistrationScenario:User can register with valid credentials Given User is on the registration page When User enters "john_doe" as username And User enters "password123" as password And User clicks on register button Then User should be registered successfully
    • 大白话翻译:
      • Feature:我们要测试的是“用户注册”功能。
      • Scenario:这是一个具体的场景——“用有效凭证注册”。
      • Given:前置条件(舞台布景)——用户已经打开了注册页面。
      • When:触发动作(演员表演)——用户输入了用户名、密码,并点击了注册按钮。
      • Then:预期结果(剧情结局)——系统应该提示注册成功。

  • 第二步:开发者代码翻译” (Step Definitions)
    • Cucumber 本身并不懂怎么操作网页,它需要程序员写一段“胶水代码”(Step Definitions),把上面剧本里的每一句话,跟真实的底层代码(比如用 Selenium 控制浏览器)绑定起来。
      • 代码示例(Java,python写法也是一样的):

        publicclassRegistrationStepDefs{WebDriverdriver;// 1. 绑定 Given 步骤:打开注册页面@Given("User is on the registration page")publicvoiduserIsOnRegistrationPage(){// 启动浏览器并访问注册网址driver=newChromeDriver();driver.get("http://your-website.com/register");}// 2. 绑定 When 步骤:输入用户名@When("User enters {string} as username")publicvoiduserEntersUsername(Stringusername){// 找到用户名输入框,并填入剧本中传过来的参数 "john_doe"driver.findElement(By.id("username")).sendKeys(username);}// 3. 绑定 When 步骤:输入密码@When("User enters {string} as password")publicvoiduserEntersPassword(Stringpassword){// 找到密码输入框,并填入参数 "password123"driver.findElement(By.id("password")).sendKeys(password);}// 4. 绑定 When 步骤:点击注册按钮@When("User clicks on register button")publicvoiduserClicksOnRegisterButton(){// 找到注册按钮并点击driver.findElement(By.id("registerButton")).click();}// 5. 绑定 Then 步骤:验证结果@Then("User should be registered successfully")publicvoiduserShouldBeRegisteredSuccessfully(){// 检查页面上是否出现了“注册成功”的提示StringsuccessMsg=driver.findElement(By.id("success-message")).getText();assertEquals("Registration successful!",successMsg);driver.quit();// 测试结束,关闭浏览器}}


四. 验收测试驱动开发 (ATDD)

1. 什么是 ATDD

“写代码前先开会,大家共同定好验收标准,然后用像搭积木一样的工具(如 Robot Framework)把这些标准变成自动化测试。”
它的核心价值就是两个词:共识(确保大家目标一致)和可读性(用自然语言/关键字写测试,业务人员也能看懂)。

  • 举例如下

    开发之前,开发测试和产品可以一起确定验收标准,如,产品说登录要有验证,开发说使用验证码,测试说,那就用这个。大家达成共识后,把这个标准写成测试用例。

2. 核心工具:FitNesse 和 Robot Framework

ATDD 需要一种非技术人员也能看懂的工具。

  • FitNesse:就像是一个内部维基百科(Wiki),业务人员可以直接在网页上编辑测试表格,非常直观。

  • Robot Framework(机器人框架):这是目前最火的 ATDD 工具。它的特点是“关键字驱动”。你可以把它想象成搭乐高积木,你不需要写复杂的代码,只需要用现成的“积木块”(关键字)拼出测试流程。

    • Robot Framework代码示例:
      ***Test Cases***Valid Login Open Browser To Login Page# 积木1:打开浏览器Input Username and password# 积木2:输入用户名和密码Enter the verification code# 积木3:输入验证码Submit Credentials# 积木4:点击提交Welcome Page Should Be Open# 积木5:检查是否到了欢迎页


五. 数据驱动测试 (DDT)

1. DDT的核心观念

DDT 将测试逻辑与测试数据分离。测试脚本只关注流程,数据存储在外部文件(Excel, CSV, YAML, JSON)中。

2. DDT的优势

  • 维护成本低:数据变更无需修改代码。
  • 技术融合:随着流量回放(如 JVM-Sandbox-Repeater)和录制回放技术的成熟,DDT 成为实现自动化回归的核心手段。

3.数据驱动开发的使用

http://www.jsqmd.com/news/1128852/

相关文章:

  • 2026年7月亲测,汽修引流这样干超有效!
  • 2026 AI 开发者生存指南(9):AI 产品的数据分析与增长方法——从流量到留存
  • WSL2 安装LeRebot开发环境
  • TVA在具身智能商业化部署中的技术突破(10)
  • 腾讯元宝复制内容带乱码怎么办?AI 导出鸭一键解决复制粘贴乱码难题,程序员高效办公必备
  • 论文学习:2.Semi-Supervised Classification with Graph Convolutional Networks(1)
  • Onekey Steam游戏解锁器:智能自动化DLC解锁的全面解决方案
  • Python练习题2
  • TPA3128D2音频放大器与PIC18F4458微控制器的集成应用
  • 26. 【C语言】编译前的“文本大师”:预处理器指令
  • 华盛顿邮报发文:中国企业正在改写全球 AI 竞争格局——不靠最顶尖,靠最实用
  • merge、concat、join:三张表合并搞崩你的不是语法是逻辑
  • 智慧职教自动化学习助手:让在线课程学习更高效
  • X射线光电子能谱(XPS)全元素深度剖析
  • 基于 Simulink 的双向 DC-DC 变换器效率 MAP 图自动化扫描仿真实
  • 医学图像分割神器TotalSegmentator:三步掌握100+解剖结构自动识别
  • 高效智能图像去重解决方案:ImageDedup 终极指南
  • STM32L433RC与MC6470 IMU的高精度姿态检测方案
  • Cangaroo:免费开源CAN总线分析软件的完整指南
  • ConvertToUTF8:终极指南 - 彻底解决Sublime Text中文乱码问题
  • TVA对具身智能领域的核心技术支撑(19)
  • 【QT】qt里的c++项目为啥不能用NULL
  • 现代化文件管理系统:在线预览、权限控制与高效管理实践
  • 本文想借用故事的方式来说一下ADO.net的工作方式。虽然现在都ORM了,但是了解一下ADO.net还是有必要的。
  • FindSomething:5分钟快速部署的浏览器隐私保护终极方案 [特殊字符]
  • 第三视觉理解徐玉生与他的商业活动(28)
  • 流放之路2角色构建:如何用Path of Building告别无效配装?
  • 微软Copilot SearchLeak漏洞:AI指令注入如何导致企业数据泄露
  • Py-GCMS 与 FTIR 的性能比较
  • 跨平台macOS组件下载神器:gibMacOS完全指南