测试框架体系 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 是一种“测试先行”的开发模式。它要求在实际代码开发之前先编写测试用例,通过不断的“红-绿-重构”循环来驱动代码演进。
核心循环流程:
- Add a Test (红):编写一个会失败的测试(因为功能尚未实现)。
- Run Tests (红):运行测试,确认失败。
- Write Code (绿):编写刚好能让测试通过的代码。
- Run Tests (绿):运行测试,确认通过。
- Refactor (重构):优化代码结构,消除重复,保持测试通过。
核心思想
- 在真正开发之前先根据需求写出测试用例
- 开发根据此测试用例写出刚好可以通过的功能需求代码
- 测试通过后,开发在此基础上优化代码逻辑
核心目的
确保每一个代码单元都十分健壮,从根源上减少 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)==5Unittest 示例
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();// 测试结束,关闭浏览器}}
- Cucumber 本身并不懂怎么操作网页,它需要程序员写一段“胶水代码”(Step Definitions),把上面剧本里的每一句话,跟真实的底层代码(比如用 Selenium 控制浏览器)绑定起来。
四. 验收测试驱动开发 (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:检查是否到了欢迎页
- Robot Framework代码示例:
五. 数据驱动测试 (DDT)
1. DDT的核心观念
DDT 将测试逻辑与测试数据分离。测试脚本只关注流程,数据存储在外部文件(Excel, CSV, YAML, JSON)中。
2. DDT的优势
- 维护成本低:数据变更无需修改代码。
- 技术融合:随着流量回放(如 JVM-Sandbox-Repeater)和录制回放技术的成熟,DDT 成为实现自动化回归的核心手段。