BDD (Behavior Driven Development)和U2S (User Stories to Scenarios)测试

U2S(User Stories to Scenarios)和BDD(Behavior Driven Development)都是软件开发中用来描述功能需求和行为的方法,但它们的侧重点和应用方式有所不同。

U2S (User Stories to Scenarios)

U2S是一种方法,它将用户故事(User Stories)转化为更具体的场景(Scenarios)。这种方法强调从用户的视角出发,定义软件需要实现的功能。用户故事通常很简短,描述了一个特定的功能需求,而场景则是这些需求的具体实现步骤。

例子

假设有一个用户故事如下:

  • 用户故事:作为一个在线购物平台的客户,我希望能查看商品详情,以便了解更多商品信息。

转化为场景可能是这样的:

  • 场景:客户点击商品页面上的"详情"按钮时,系统应显示该商品的详细信息。

BDD (Behavior Driven Development)

BDD是一种敏捷软件开发的技术,它鼓励软件项目的开发人员、QA(质量保证)和非技术人员或业务参与者之间的协作。BDD专注于获取明确的理解软件应该如何行为的共享视图。这通常通过使用简单的语言描述软件行为的场景来实现,这种语言可以被非技术人员理解。

例子

在BDD中,行为是通过一种称为"Gherkin"的语言来描述的,例如:

gherkin 复制代码
功能: 产品详情展示
  作为一个在线购物平台的客户
  我希望能查看商品详情
  以便了解更多商品信息

  场景: 查看商品详情
    假设 客户已经选择了一个商品
    当 客户点击"详情"按钮
    那么 应该显示该商品的详细信息

区别

  • 焦点不同:U2S侧重于将用户故事转化为具体的操作场景,强调的是从用户故事到实现步骤的转换。BDD则更加强调通过对话和协作,确保所有参与者对软件应有的行为有共同的理解。
  • 形式和结构:BDD使用特定的格式(如Gherkin语法)来描述行为,这种格式旨在对技术和非技术人员都是可读的,便于沟通和理解。而U2S更多是一个从概念到实现的过程,可能没有固定的格式。
  • 参与者:BDD通常涉及更广泛的团队成员,包括业务分析师、开发人员和测试人员,以确保软件的行为符合业务需求。U2S可能主要是由开发团队内部使用,转化用户故事为开发的具体任务。

如果你选择使用Cypress来实现BDD和编写测试用例,你可以通过集成Cucumber插件来编写.feature文件和对应的步骤定义文件。Cypress和Cucumber的结合可以让你以BDD的方式来编写和运行端到端的测试。

下面是如何使用Cypress和Cucumber进行配置和编写测试用例的例子。

准备环境

  1. 安装Cypress和Cypress Cucumber Preprocessor

    首先,确保你已经安装了Cypress。然后,安装Cypress Cucumber Preprocessor以支持.feature文件的解析和执行。

    css 复制代码
    npm install cypress --save-dev
    npm install cypress-cucumber-preprocessor --save-dev
  2. 配置Cypress和Cucumber Preprocessor

    cypress.json配置文件中,添加或修改以下配置以支持Cucumber:

    json 复制代码
    {
      "testFiles": "**/*.feature"
    }

    cypress/plugins/index.js文件中,添加Cucumber Preprocessor的配置:

    javascript 复制代码
    const cucumber = require('cypress-cucumber-preprocessor').default;
    
    module.exports = (on, config) => {
      on('file:preprocessor', cucumber());
    };

    并且,在package.json中,添加以下配置以支持.feature文件的解析:

    json 复制代码
    {
      "cypress-cucumber-preprocessor": {
        "nonGlobalStepDefinitions": true
      }
    }

编写.feature文件

以商品搜索功能为例,创建一个.feature文件:

gherkin 复制代码
# cypress/integration/search_product.feature

功能: 商品搜索
  作为一个在线购物平台的客户
  我希望能通过商品名称搜索商品
  以便快速找到我想要的商品

  场景: 通过商品名称搜索
    假设 我访问了购物平台首页
    当 我在搜索框中输入"Angular书籍"
    并且 点击搜索按钮
    那么 我应该看到含有"Angular"字样的商品列表

编写步骤定义

接下来,为.feature文件中定义的每一步编写对应的步骤定义。步骤定义文件应该放在与.feature文件相同的路径下。

javascript 复制代码
// cypress/integration/search_product/searchProductSteps.js

import { Given, When, Then } from "cypress-cucumber-preprocessor/steps";

Given('我访问了购物平台首页', () => {
  cy.visit('http://你的在线购物平台网址');
});

When('我在搜索框中输入"Angular书籍"', () => {
  cy.get('input.search-box').type('Angular书籍');
});

When('点击搜索按钮', () => {
  cy.get('button.search-button').click();
});

Then('我应该看到含有"Angular"字样的商品列表', () => {
  cy.get('.product-item').should('contain', 'Angular');
});

运行测试

安装和配置完成后,你可以通过Cypress的命令行接口或图形界面来运行测试。Cypress将会自动识别.feature文件并执行对应的步骤定义。

使用Cypress图形界面:

arduino 复制代码
npx cypress open

或者使用命令行运行Cypress测试:

arduino 复制代码
npx cypress run

U2S(User Stories to Scenarios)通常是将用户故事转化为具体的测试场景和步骤,用于指导测试编写。在BDD(行为驱动开发)中,这些场景直接体现在.feature文件中,而具体的步骤则在步骤定义文件中实现。如果你的意思是如何在测试中模拟或实现与后端的交互,这通常涉及到两种策略:直接与真实的后端服务交互,或者使用模拟(Mocking)/桩(Stubbing)技术来模拟后端服务。

在使用Cypress进行前端测试时,你可以通过Cypress内建的网络请求命令来与后端服务进行交互,或者使用Cypress的cy.intercept()功能来拦截和模拟网络请求。以下是如何实现这两种策略的示例:

与真实后端服务交互

如果你选择直接与真实的后端服务进行交互,你的测试将会发送真实的网络请求到后端服务。这在集成测试环境中比较常见,但可能会因为网络延迟、后端服务的不稳定等因素影响测试的可靠性和速度。

javascript 复制代码
// 示例:发送POST请求创建一个新商品
When('我尝试添加一个新的商品', () => {
  cy.request('POST', 'http://你的后端服务/api/products', {
    name: 'Angular书籍',
    description: '一本关于Angular的书',
    price: 29.99
  }).then((response) => {
    expect(response.body).to.have.property('id');
  });
});

使用Mocking/Stubbing模拟后端服务

更常见的做法是在测试中模拟后端服务的响应,这样可以使测试更加快速和可靠,同时也避免了对真实后端服务的依赖。

Cypress的cy.intercept()函数允许你拦截应用发出的网络请求,并返回自定义的响应。这样,你就可以模拟后端服务的响应数据,而无需实际与后端服务进行交互。

javascript 复制代码
// 示例:拦截商品搜索的API请求,并返回模拟数据
Given('后端服务已准备好模拟的商品数据', () => {
  cy.intercept('GET', '/api/products/search?query=Angular书籍', {
    statusCode: 200,
    body: [{ id: 1, name: 'Angular入门', price: 29.99 }]
  }).as('searchProducts');
});

When('我在搜索框中输入"Angular书籍"', () => {
  cy.get('input.search-box').type('Angular书籍');
});

When('点击搜索按钮', () => {
  cy.get('button.search-button').click();
  cy.wait('@searchProducts'); // 等待拦截的请求
});

Then('我应该看到含有"Angular"字样的商品列表', () => {
  cy.get('.product-item').should('contain', 'Angular');
});

这里的关键是使用cy.intercept()来定义当某个特定的HTTP请求发生时,应返回什么样的响应。这种方法非常适合于单元测试和端到端测试中,可以让测试在没有真实后端服务的情况下运行。

总之,将用户故事转化为具体测试场景(U2S)并实现与后端的交互,既可以通过直接与真实后端服务进行交互的方式,也可以通过Mocking/Stubbing技术来模拟后端服务的响应。在实际操作中,选择哪种方法取决于你的测试需求、测试环境的配置以及对测试稳定性和速度的考虑。

相关推荐
观无6 分钟前
JWT认证服务
前端·c#·vue
匹马夕阳12 分钟前
(一)前端程序员转安卓开发分析和规划建议
android·前端
Monly2120 分钟前
Vue:Table在点击删除的时候阻止行点击事件
前端·javascript·vue.js
我自纵横20231 小时前
使用 JavaScript 动态设置 CSS 样式
开发语言·前端·javascript·css·html·json·html5
Z编程1 小时前
纯css实现环形进度条
前端·css
CopyLower1 小时前
优化 Web 性能:压缩 CSS 文件(Unminified CSS)
前端·css
leluckys1 小时前
flutter 专题 六十八 Flutter 多图片上传
前端·javascript·flutter
Enti7c2 小时前
数据一键导出为 Excel 文件
前端·javascript·excel·jquery
Jinuss2 小时前
源码分析之Leaflet中control模块Zoom类实现原理
前端·leaflet
qiyue772 小时前
用claude3.7,不到1天写了一个工具小程序(11个工具6个游戏)
前端