Pytest-Bdd-Playwright 系列教程(6):在测试步骤函数中设置别名数据共享
Pytest-Bdd-Playwright 系列教程(6):在测试步骤函数中设置别名&数据共享
- 前言
- 一、步骤别名
- 二、特性文件
- 三、测试脚本
- 四、运行测试
- 五、小测验
- 总结
前言
有的时候,为了提高可读性,我们需要使用不同的名称来声明相同的 fixtures或步骤。在pytest-bdd,要使用同一步骤函数而赋予多个步骤名称,可以简单地对函数进行多次装饰。
通过本文内容的学习,你将能够:
- 步骤别名:通过为步骤函数添加多个装饰器(例如 @given、@when、@then)来创建步骤别名;
- target_fixture 参数:利用 target_fixture 共享步骤返回值,使其可被其他步骤引用。
一、步骤别名
在 steps
目录中定义的 common_steps.py
文件:
import logging
from playwright.sync_api import Page, expect
from pytest_bdd import given, when, then, parsers
log = logging.getLogger(__name__)
@given(parsers.parse('访问网站[{url}]'), target_fixture='get_url')
@given(parsers.parse('王大锤打开网址[{url}]'), target_fixture='get_url')
def goto(page: Page, url: str):
page.goto(url)
return url
@given('等待页面加载完成')
@given('页面完全加载')
def wait_for_page_load(page: Page, get_url):
log.info(f'返回的网址是:{get_url}')
page.wait_for_load_state()
@when(parsers.parse('王大锤点击元素[{selector}]'))
@when(parsers.parse('点击元素[{selector}]'))
@when(parsers.parse('单击[{selector}]'))
def click(page: Page, selector: str):
page.locator(selector).click()
@when(parsers.parse('在[{selector}]中输入[{text}]'))
@when(parsers.parse('向[{selector}]输入文本[{text}]'))
def input_text(page: Page, selector: str, text: str):
page.locator(selector).fill(text)
@then(parsers.parse('元素[{selector}]的文本应为[{text}]'))
@then(parsers.parse('验证元素[{selector}]文本为[{text}]'))
def check_element_has_text(page: Page, selector: str, text: str):
expect(page.locator(selector)).to_have_text(text)
- 我们可以通过添加多个装饰器的方式,为每个步骤函数来提供别名。这些步骤别名是独立的,只要被提到就会执行。
target_fixture
参数,是用来指定步骤返回的 fixture 名称,使其在其他步骤中可以直接引用这个 fixture。在我们希望在多个步骤中共享数据时非常有用。
例如,在上述代码的 goto
步骤中使用 target_fixture
,并在 wait_for_page_load
步骤中引用 goto
的返回值。
二、特性文件
在 features
目录下的 login.feature
文件:
Feature: 登录功能
Scenario: 登录
Given 访问网站[https://parabank.parasoft.com/parabank/index.htm]
Given 等待页面加载完成
Scenario: 王大锤登录
Given 王大锤打开网址[https://parabank.parasoft.com/parabank/index.htm]
Given 页面完全加载
三、测试脚本
在tests
目录下的test_login.py
文件:
import pytest
from steps.common_steps import *
from pytest_bdd import scenario
@scenario('login.feature', '登录')
def test_login():
pass
@scenario('login.feature', '王大锤登录')
def test_wang_login():
pass
四、运行测试
pytest .\tests\test_login.py
运行结果如下:
五、小测验
为了帮助小伙伴们巩固对步骤别名和 target_fixture 参数的理解,请根据提示补充 login.feature 文件中的缺失测试步骤,以确保覆盖用户登录的完整流程。
请补充完整的 login.feature 文件,确保涵盖所有步骤:
Feature: 登录功能
Scenario: 登录
Given 访问网站[https://parabank.parasoft.com/parabank/index.htm]
Given 等待页面加载完成
# 请在此处补充缺失的步骤
Scenario: 王大锤登录
Given 王大锤打开网址[https://parabank.parasoft.com/parabank/index.htm]
Given 页面完全加载
# 请在此处补充缺失的步骤
总结
通过为步骤函数添加多个装饰器,可以提高测试代码的可读性,使其更易于理解和维护。同时,利用 target_fixture 参数,能够有效地共享步骤之间的数据,从而简化测试逻辑并提升代码的复用性。