@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
1. argnames 为字符串类型,根据需求决定何时的参数名
2. argvalues 为列表类型,根据需求决定列表元素中的内容
3. 在测试脚本中,参数,名字与 argnames 保持一致
4. 在测试脚本中正常使用
import pytest
class TestLogin:
@pytest.mark.parametrize("name", ["xiaoming", "xiaohong"])
def test_a(self, name):
print(name)
assert 1
scripts/test_login.py xiaoming
.xiaohong
.
多个参数使用方式
示例
import pytest
class TestLogin:
@pytest.mark.parametrize(("username", "password"), [("zhangsan", "zhangsan123"),
("xiaoming", "xiaoming123")])
def test_a(self, username, password):
print(username)
print(password)
assert 1
结果
scripts/test_login.py zhangsan
zhangsan123
.xiaoming
xiaoming123
.
多个参数还可以将装饰器写成 @pytest.mark.parametrize("username,password", [("zhangsan",
"zhangsan123"), ("xiaoming", "xiaoming123")]) 效果是一样的。
四. Pytest-fifixture
应用场景
fifixture 修饰器来标记固定的工厂函数,在其他函数,类调用它时会被激活并优先执行,通常会被用于完成预置处理和重复操作。
4.1 使用方式
使用方式有两种
1. 通过参数引用
2. 通过函数引用
4.1.1 通过参数引用
示例
import pytest
class TestLogin:
@pytest.fixture()
def before(self):
print("------->before")
def test_a(self, before): # test_a方法传入了被fixture标识的函数,已变量的形式
print("------->test_a")
assert 1
运行结果
scripts/test_login.py ------->before
------->test_a
4.1.2 通过函数引用
示例
import pytest
class TestLogin:
@pytest.fixture()
def before(self):
print("------->before")
@pytest.mark.usefixtures("before") # 使用函数引用
def test_a(self):
print("------->test_a")
assert 1
运行结果
scripts/test_login.py ------->before
------->test_a
4.2 参数
4.2.1 默认运行
参数名
@pytest.fixture(autouse=False)
示例
import pytest
class TestLogin:
@pytest.fixture(autouse=True)
def before(self):
print("------->before")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
assert 1
运行结果
scripts/test_login.py ------->before
------->test_a
.------->before
------->test_b
.
v>
4.2.2 作用域
参数名
@pytest.fixture(scope="function")
默认作用域为 函数 级别,在设置自动运行的情况,所有的测试脚本都会运行 fifixture,如果想某个类只运行一次,可
以将作用域改为 class。但前提一定是将 fifixture 函数写在类的外面。
示例
import pytest
@pytest.fixture(autouse=True, scope="class")
def before():
print("------->before")
class TestLogin:
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
assert 1
运行结果
scripts/test_login.py ------->before
------->test_a
.------->test_b
.
4.2.3 参数化
参数名
@pytest.fixture(params=None)
params 是一个列表,列表中有多少元素,脚本就会运行多少次。如果想获取 params 中的数据,需要在 fifixture 里面加上 request 参数,这个参数名必须叫做 request ,通过这个
参数的 .param 属性获取值。
示例
import pytest
class TestLogin:
@pytest.fixture(params=[1, 2])
def before(self, request):
print("------->before")
print(request.param)
def test_a(self, before):
print("------->test_a")
assert 1
运行结果
scripts/test_login.py ------->before
1
------->test_a
.------->before
2
------->test_a
.
4.3 返回值
fifixture 函数是允许有返回值,使用参数的形式进行 fifixture 的引用,可以直接使用 fifixture 的返回值。
示例
import pytest
v>
class TestLogin:
@pytest.fixture()
def before(self):
print("------->before")
return 20
def test_a(self, before):
print("------->test_a")
print(before)
assert 1
运行结果
scripts/test_login.py ------->before
------->test_a
20
.
扩展
如果使用 fifixture 参数化的同时也使用了脚本的参数化,可以达到 “两两” 组合的效果。比如,fifixture的parmas里面
有 3 个元素,脚本的参数化里面有 4 个元素,那么这个脚本会运行 12 次。
示例
import pytest
class TestLogin:
@pytest.fixture(params=[1, 2])
def before(self, request):
print("------->before")
return request.param
@pytest.mark.parametrize("name", [3, 4])
def test_a(self, before, name):
print("------->test_a")
print("%d - %d" % (before, name))
assert 1
scripts/test_login.py ------->before
------->test_a
1 - 3
.------->before
------->test_a
1 - 4
.------->before
------->test_a
2 - 3
.------->before
------->test_a
2 - 4