pytest-bdd:流程驱动封装
行为驱动–敏捷开发模式,消除开发/测试对需要了解的歧义
使用方式:
描述需求/用户场景
Feature(需求)
Scenario(场景)
Given(假设)
When(操作步骤)
Then(验证,清除)
#新建feature 文件之前 需要提取安装支持featrue文件的插件
接下来我们就通过一个实例来看看
Feature: 需求写明:读书屋小说网站,这个网站可以xxx
Scenario: 场景1-正常登录
Given 我有一个账户 用户名:15173532799 密码:123456
When 打开登录页面 http://novel.hctestedu.com/
And 输入用户名
And 输入密码
Then 页面中应包含登录连接,文字为:退出
Feature: 需求写明:读书屋小说网站,这个网站可以xxx
Scenario: 场景2-错误登录
Given 我有一个账户 用户名:<username> 密码:<password>
When 打开登录页面 http://novel.hctestedu.com/
And 输入用户名
And 输入密码
And 点击登录按钮
Then 页面中应包含登录连接,文字为:退出
Examples:User
|username|password|
|admin |1234567890 |
|15173532799|admin111090|
|15173532799|123456|
dushuwu.feature与dushuwu_test.py实质是相互对应的,测试流程对应测试用例
'''
bdd安装: pip install pytest-bdd
'''
import pytest
from pytest_bdd import given,when,then,parsers,scenario
import time
@given(parsers.parse("我有一个账户 用户名:{username} 密码:{password}"),target_fixture="user")
@given(parsers.parse("我有一个账户 用户名: 密码:" ),target_fixture="user")
def user(username,password):#类似于pytest的fixture方法,其他步骤可以使用其返回值
return dict(username=username,password=password)
@when(parsers.parse("打开登录页面{url}"))
def go_to_url(url,browser):
browser.get(url)
browser.find_element_by_link_text('登录').click()
'''
1、为什么这里不需要用到parsers.parse,而前面会都用到呢,是因为这里不需要转换,parsers.parse相当于转换的意思
前面的方法里面都有变量如:{user}所以需要转换
2、brower是调用了共享文件conftest.py里面打开网页的方法,
'''
@when("输入用户名")
def input_username(browser,user):
time.sleep(2)
browser.find_element_by_xpath('//*[@id="txtUName"]').send_keys(user["username"])
@when("输入密码")
def input_password(browser,user):
time.sleep(2)
browser.find_element_by_xpath('//*[@id="txtPassword"]').send_keys(user["password"])
@when("点击登录按钮")
def input_password(browser):
time.sleep(2)
browser.find_element_by_xpath('//*[@id="btnLogin"]').click()
@then(parsers.parse('页面中应包含登录连接,文字为:{logout_text}'))
def check_login(logout_text,browser):
time.sleep(2)
text = browser.find_element_by_xpath('//*[@id="headerUserInfo"]/span/a[2]').text
assert text==logout_text
#以上是流程步骤
#接下来我们需要根据dushuwus.feature一一对应进行运行,这是正常状态下的登录
# @scenario("../features/dushuwus.feature","场景1-正常登录")
当然也有不正常的状态比如,账号错误或者密码错误,我们在平常测试过程中也是需要反向验证的,所以我们就引入ushuwu1.feature,进行执行用例
@scenario("../features/dushuwu1.feature","场景2-错误登录")
def test_dushuwu_login():
pass
这时需要调用共享文件conftest.py中的browser方法
import pytest
from selenium import webdriver
@pytest.fixture(scope='session',autouse=True)
def browser(request):
global driver
driver_path=r"C:\Users\ADMIN\Desktop\桌面\重要安装包\chromedriver.exe"
if driver is None:
driver=webdriver.Chrome(executable_path=driver_path)
def end():
driver.quit()
request.addfinalizer(end)
return driver