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技术来模拟后端服务的响应。在实际操作中,选择哪种方法取决于你的测试需求、测试环境的配置以及对测试稳定性和速度的考虑。

相关推荐
艾小码几秒前
为什么你的JavaScript代码总是出bug?这5个隐藏陷阱太坑了!
前端·javascript
辻戋2 小时前
从零实现React Scheduler调度器
前端·react.js·前端框架
徐同保2 小时前
使用yarn@4.6.0装包,项目是react+vite搭建的,项目无法启动,报错:
前端·react.js·前端框架
Qrun3 小时前
Windows11安装nvm管理node多版本
前端·vscode·react.js·ajax·npm·html5
中国lanwp3 小时前
全局 npm config 与多环境配置
前端·npm·node.js
JELEE.4 小时前
Django登录注册完整代码(图片、邮箱验证、加密)
前端·javascript·后端·python·django·bootstrap·jquery
TeleostNaCl6 小时前
解决 Chrome 无法访问网页但无痕模式下可以访问该网页 的问题
前端·网络·chrome·windows·经验分享
前端大卫7 小时前
为什么 React 中的 key 不能用索引?
前端
你的人类朋友7 小时前
【Node】手动归还主线程控制权:解决 Node.js 阻塞的一个思路
前端·后端·node.js
小李小李不讲道理9 小时前
「Ant Design 组件库探索」五:Tabs组件
前端·react.js·ant design