一、 Gherkin简介
Gherkin语言使用的是主要英文关键词Scenario、Given、when 、And、Then和But等,这些关键词可以转换成中文关键词,场景、假如、当、那么等。根据用户故事,需求人员或测试人员使用Gherkin语言编写好测试场景的每个步骤。
feature文件的编写,遵循Gherkin语言规范:
- Feature(特性):功能名称;
- Description(描述)(可选):描述测试中的功能。
- Scenario(场景):测试场景名称;
- Given(假如):给出测试前提条件;
- when(当):相当我们的测试步骤;
- Then(那么):给出期望结果。
二、 目录
主目录 |
二级目录 |
描述 |
steps/ |
login.py |
Step definitions for features. |
reports/ |
jsonDumps/ |
Save behave json reports |
jsonReports/ |
Save behave to cucumber json reports |
|
environment.py |
Environment for global setup… |
|
login.feature |
Feature files. |
三、environment.py
每一个步骤之前,之后执行
代码语言:javascript
复制
before_step(context, step) after_step(context, step)
在这里面的脚本会在每一个场景之前,之后执行
代码语言:javascript
复制
before_scenario(context, scenario) after_scenario(context, scenario)
在这里面的脚本会在每一个feature之前,之后执行
代码语言:javascript
复制
before_feature(context, feature) after_feature(context, feature)
在脚本里面可以设置tag(这个之后会介绍),这里面的脚本会在含有tag的模块里面之前,之后执行
代码语言:javascript
复制
before_tag(context, tag) after_feature(context, tag)
这里面的脚本会在整个脚本开始之前,之后执行 ——- 一般会在这里面添加一些setup的脚本,例如启动浏览器,设置一些变量,连接数据库,关闭浏览器,关闭数据库 等等
代码语言:javascript
复制
before_all(context) after_all(context)
四 脚本
代码语言:javascript
复制
pip3 install behave
英文
4.1 在项目主目录中建立文件test.feature
代码语言:javascript
复制
Feature: Login I want to test the login functionality Scenario: Successful Login Given I am on the login page When I enter valid credentials Then the homepage is displayed Scenario: Failed Login Given I am on the login page When I enter invalid credentials Then an error message is displayed
4.2 建立environment.py
代码语言:javascript
复制
from selenium import webdriver def before_all(context): context.browser = webdriver.Firefox() def after_all(context): context.browser.quit()
4.3 建立steps目录
4.4 进入steps目录,建立login.py文件
代码语言:javascript
复制
from behave import * from selenium.webdriver.common.by import By @given(u'I am on the login page') def step_impl(context): context.browser.get("http://127.0.0.1:8000") @when(u'I enter valid credentials') def step_impl(context): context.browser.find_element(By.ID,"id_username").send_keys("cindy") context.browser.find_element(By.ID,"id_password").send_keys("123456") context.browser.find_element(By.CSS_SELECTOR,"body > div > form > button").click() @then(u'the homepage is displayed') def step_impl(context): assert context.browser.find_element(By.NAME,"good").is_displayed() @when(u'I enter invalid credentials') def step_impl(context): context.browser.find_element(By.ID,"id_username").send_keys("cindy") context.browser.find_element(By.ID,"id_password").send_keys("654321") context.browser.find_element(By.CSS_SELECTOR,"body > div > form > button").click() @then(u'an error message is displayed') def step_impl(context): assert context.browser.title != "电子商务系统"
4.5 打开被测系统,在命令行中运行behave
代码语言:javascript
复制
PS C:\Users\xiang\Desktop\BDD> behave Feature: Login # test.feature:1 I want to test the login functionality Scenario: Successful Login # test.feature:3 Given I am on the login page # steps/login.py:4 When I enter valid credentials # steps/login.py:8 Then the homepage is displayed # steps/login.py:14 Scenario: Failed Login # test.feature:7 Given I am on the login page # steps/login.py:4 When I enter invalid credentials # steps/login.py:18 Then an error message is displayed # steps/login.py:24 1 feature passed, 0 failed, 0 skipped 2 scenarios passed, 0 failed, 0 skipped 6 steps passed, 0 failed, 0 skipped, 0 undefined Took 0m1.576s PS C:\Users\xiang\Desktop\BDD>
中文
1 test.feature
代码语言:javascript
复制
# language: zh-CN 功能: 我想测试登录功能 场景:成功登录 假如我在登录页面上 当我输入有效凭据时 那么显示主页 场景:登录失败 假如我在登录页面上 当我输入无效凭据时 那么显示一条错误消息
2 login.py
代码语言:javascript
复制
from behave import * from selenium.webdriver.common.by import By @given(u'我在登录页面上') def step_impl(context): context.browser.get("http://127.0.0.1:8000") @when(u'我输入有效凭据时') def step_impl(context): context.browser.find_element(By.ID,"id_username").send_keys("cindy") context.browser.find_element(By.ID,"id_password").send_keys("123456") context.browser.find_element(By.CSS_SELECTOR,"body > div > form > button").click() @then(u'显示主页') def step_impl(context): assert context.browser.find_element(By.NAME,"good").is_displayed() @when(u'我输入无效凭据时') def step_impl(context): context.browser.find_element(By.ID,"id_username").send_keys("cindy") context.browser.find_element(By.ID,"id_password").send_keys("654321") context.browser.find_element(By.CSS_SELECTOR,"body > div > form > button").click() @then(u'显示一条错误消息') def step_impl(context): assert context.browser.title != "电子商务系统"
3 运行
代码语言:javascript
复制
PS C:\Users\xiang\Desktop\BDD(中文)>behave --lang zh-CN
五 数据驱动
代码语言:javascript
复制
1 test.feature # language: zh-CN 功能: 我想测试登录功能 场景大纲:登录 假如我在登录页面上 当我输入<用户名>和<密码> 那么进入页面是<标题> 例子: |用户名|密码|标题| |cindy|123456|电子商务系统| |cindy|654321|电子商务系统-登录|
2 login.py
代码语言:javascript
复制
from behave import * from selenium.webdriver.common.by import By @given(u'我在登录页面上') def step_impl(context): context.browser.get("http://127.0.0.1:8000") @when(u'我输入{username}和{password}') def step_impl(context,username,password): context.browser.find_element(By.ID,"id_username").send_keys(username) context.browser.find_element(By.ID,"id_password").send_keys(password) context.browser.find_element(By.CSS_SELECTOR,"body > div > form > button").click() @then(u'进入页面是{title}') def step_impl(context,title): assert context.browser.title == title
六 报告
6.1 普通报告
- pretty:这是默认的报告格式,提供颜色化的文本输出,每个测试步骤的结果都会详细列出。
- plain:这也是一种文本格式的报告,但没有颜色,并且在执行每个步骤后只输出一个新行。
- progress:这种报告格式只在执行每个测试步骤后输出一个单字符。
- json:这种报告格式以 JSON 格式输出测试结果,易于进行进一步处理。使用 -f 参数或 --format 参数来指定报告的格式。
代码语言:javascript
复制
>behave --lang zh-CN -f json.pretty -o './reports/testResult.json'
6.2 allure报告
1 安装allure
2 运行
代码语言:javascript
复制
pip3 install allure-behave
3 运行
代码语言:javascript
复制
behave -f allure_behave.formatter:AllureFormatter -o allure_data
产生allure_data目录,里面包括json文件
4 运行
代码语言:javascript
复制
allure serve allure_data