在执行自动化测试用例时,自然少不了测试数据;同一条用例逻辑,如何使用不同数据驱动测试用例?这里列举以下两种参数化方式:
方式一:
Pytest中装饰器@pytest.mark.parametrize(‘参数名’, list) ,此参数化方法支持传入单个参数或多个参数。
使用py文件存放测试数据,封装一个函数返回数据。
login_data.py
def login_data_list():
login_data_list = [
{'username': '', 'password': 'xxxx', 'expect': '账号为空'},
{'username': 'xxxx', 'password': '', 'expect': '密码为空'},
{'username': 'xxxx', 'password': 'xxxxx', 'expect': '无效的用户名或密码。'},
]
return login_data_list
test_login.py
import pytest
from page_objects.login import Login
from data.login_data import login_data_list
from page_locators.login_page import LoginPage
@pytest.mark.parametrize('test_data', login_data_list())
@pytest.mark.usefixtures('geturl')
def test_sing_in_failed(self, browser, test_data):
username = login['username']
password = login['password']
expected = login['expect']
try:
LoginPage.user_login(browser, username, password)
actual = LoginPage(browser).error_text()
assert actual == expect
except Exception as e:
raise e
使用yaml存放测试数据,dict嵌套dict。(读取yaml文件的方法此处省略)
test_data.yaml
login_data1:
username:
password: xxxxx
login_data2:
username: xxxxx
password:
@pytest.mark.parametrize('test_data', YamlUtil(os.getcwd() + '/test_data.yaml').read_yaml().values())
@pytest.mark.usefixtures('geturl')
def test_sing_in_failed(self, browser, test_data):
username = test_data['username']
password = test_data['password']
LoginPage.user_login(browser, username, password)
跟以上的方式类似,list嵌套dict。
test_data.yaml
- user: username1
pwd: 'xxxxx'
- user: username2
pwd: 'xxxxx'
- user: username3
pwd: 'xxxxx'
@pytest.mark.parametrize('login', YamlUtil(os.getcwd() + '/test_data.yaml').read_yaml())
@pytest.mark.usefixtures('geturl')
def test_sign_in_failed(self, browser, login):
usr = login['user']
pwd = login['pwd']
LoginPage.user_login(browser, usr, pwd)
方式二:
@pytest.fixture(),此参数化装饰的函数可以作为参数传入其他函数;参数化装饰函数放在conftest.py,这种方式较少使用,因为
conftest.py一般用于存放测试的前置、后置条件。