pytest-bdd封装

  • 简介
    pytestbdd主要是用于代码封装
    代码封装的好处:
    1、提升代码复用率
    2、提示测试效率
    手工测试–使用框架0代码 流程+数据驱动
    产品经理这样的不懂测试的人员–流程驱动
    自动化测试–数据驱动

pytest-bdd:流程驱动封装
行为驱动–敏捷开发模式,消除开发/测试对需要了解的歧义

使用方式:
描述需求/用户场景
Feature(需求)
Scenario(场景)
Given(假设)
When(操作步骤)
Then(验证,清除)

#新建feature 文件之前 需要提取安装支持featrue文件的插件

接下来我们就通过一个实例来看看

  • dushuwu.feature文件用于整个正测试流程框架
Feature: 需求写明:读书屋小说网站,这个网站可以xxx

  Scenario: 场景1-正常登录
    Given 我有一个账户 用户名:15173532799 密码:123456
    When 打开登录页面 http://novel.hctestedu.com/
    And 输入用户名
    And 输入密码

    Then 页面中应包含登录连接,文字为:退出
  • dushuwu.feature1文件这里是错误验证, Examples:User里面是我们验证时需要的数据 :
    第一行是标题
    第二行是错误的账号对的密码
    第三行是对的账号,错误的密码
    第四行是对的账号和密码
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实质是相互对应的,测试流程对应测试用例

  • 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

你可能感兴趣的:(python,开发语言,selenium)