重庆品牌型网站建设多少钱,如何k掉网站,怎么看网站被惩罚,做鞋的垂直网站前言
unittest单元测试框架使用DDT进行数据驱动测试#xff0c;那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢#xff1f;其实Pytest是使用pytest.mark.parametrize装饰器来实现数据驱动测试的#xff0c;那么今天我们就简单来说说在它是如何进… 前言
unittest单元测试框架使用DDT进行数据驱动测试那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢其实Pytest是使用pytest.mark.parametrize装饰器来实现数据驱动测试的那么今天我们就简单来说说在它是如何进行数据驱动测试的
装饰测试类 ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata_1 [(1, 2, 3),(4, 5, 9)
]def add(a, b):return a bpytest.mark.parametrize(a, b, expect, data_1)
class TestParametrize(object):def test_parametrize_1(self, a, b, expect):print(\n测试函数1测试数据为\n{}-{}.format(a, b))assert add(a, b) expectdef test_parametrize_2(self, a, b, expect):print(\n测试函数2数据为\n{}-{}.format(a, b))assert add(a, b) expectif __name__ __main__:pytest.main([-sv]) 输出 collecting ... collected 4 itemstest_parametrize.py::TestParametrize::test_parametrize_1[1-2-3]
测试函数1测试数据为
1-2
PASSED
test_parametrize.py::TestParametrize::test_parametrize_1[4-5-9]
测试函数1测试数据为
4-5
PASSED
test_parametrize.py::TestParametrize::test_parametrize_2[1-2-3]
测试函数2数据为
1-2
PASSED
test_parametrize.py::TestParametrize::test_parametrize_2[4-5-9]
测试函数2数据为
4-5
PASSED 4 passed in 0.21 seconds Process finished with exit code 0 说明
当装饰器装饰测试类时给数据集合会被传递给给类的所有方法
装饰测试函数
单个数据 ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata [1, 2]pytest.mark.parametrize(a, data)
def test_parametrize(a):print(\n被加载测试数据为\n{}.format(a))if __name__ __main__:pytest.main([-s]) 输出 test session starts
platform win32 -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: E:\CnblogCode\pytest_parametrize, inifile:
plugins: rerunfailures-7.0, metadata-1.8.0, html-1.20.0
collected 2 itemstest_parametrize.py
被加载测试数据为
1
.
被加载测试数据为
2
. 2 passed in 0.16 seconds Process finished with exit code 0 说明
当测试用例只需要一个参数时我们存放数据的列表无序嵌套序列pytest.mark.parametrize(a, data)装饰器的第一个参数也只需要一个变量接收列表中的每个元素第二个参数传递存储数据的列表那么测试用例需要使用同名的字符串接收测试数据(实例中的a)且列表有多少个元素就会生成并执行多少个测试用例
一组数据 ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata [[1, 2, 3],[4, 5, 9]
] # 列表嵌套列表
# data_tuple [
# (1, 2, 3),
# (4, 5, 9)
# ] # 列表嵌套元组pytest.mark.parametrize(a, b, expect, data)
def test_parametrize_1(a, b, expect): # 一个参数接收一个数据print(\n测试数据为\n{}{}{}.format(a, b, expect))actual a bassert actual expectpytest.mark.parametrize(value, data)
def test_parametrize_2(value): # 一个参数接收一组数据print(\n测试数据为\n{}.format(value))actual value[0] value[1]assert actual value[2]if __name__ __main__:pytest.main([-s]) 输出 test session starts
platform win32 -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: E:\CnblogCode\pytest_parametrize, inifile:
plugins: rerunfailures-7.0, metadata-1.8.0, html-1.20.0
collected 4 itemstest_parametrize.py
测试数据为
123
.
测试数据为
459
.
测试数据为
[1, 2, 3]
.
测试数据为
[4, 5, 9]
. 4 passed in 0.17 seconds Process finished with exit code 0 说明
当测试用例需要多个数据时我们可以使用嵌套序列(嵌套元组嵌套列表)的列表来存放测试数据
装饰器pytest.mark.parametrize()可以使用单个变量接收数据也可以使用多个变量接收同样测试用例函数也需要与其保持一致
当使用单个变量接收时测试数据传递到测试函数内部时为列表中的每一个元素或者小列表需要使用索引的方式取得每个数据
当使用多个变量接收数据时那么每个变量分别接收小列表或元组中的每个元素
列表嵌套多少个多组小列表或元组测生成多少条测试用例
图解对应关系 组合数据 ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata_1 [1, 2]
data_2 [3, 4] pytest.mark.parametrize(a, data_1)
pytest.mark.parametrize(b, data_2)
def test_parametrize_1(a, b):print(\n测试数据为\n{}{}.format(a, b))if __name__ __main__:pytest.main([-s]) 输出 test session starts
platform win32 -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: E:\CnblogCode\pytest_parametrize, inifile:
plugins: rerunfailures-7.0, metadata-1.8.0, html-1.20.0
collected 4 itemstest_parametrize.py
测试数据为
13
.
测试数据为
23
.
测试数据为
14
.
测试数据为
24
. 4 passed in 0.24 seconds Process finished with exit code 0 说明
通过测试结果我们不难分析一个测试函数还可以同时被多个参数化装饰器装饰那么多个装饰器中的数据会进行交叉组合的方式传递给测试函数进而生成n*n个测试用例这也为我们的测试设计时提供了方便
标记用例
可以直接标记测试用例参数化装饰器也可以识别(标记用例失败或跳过)
标记为无条件跳过(标记为失败为xfail自己尝试) ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata_1 [[1, 2, 3],pytest.param(3, 4, 8, markspytest.mark.skip)
]def add(a, b):return a bpytest.mark.parametrize(a, b, expect, data_1)
def test_parametrize_1(a, b, expect):print(\n测试数据为\n{}{}.format(a, b))assert add(a, b) expectif __name__ __main__:pytest.main([-vs]) 输出 test session starts
platform win32 -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0 -- C:\Programs\Python\Python37-32\python.exe
cachedir: .pytest_cache
metadata: {Python: 3.7.2, Platform: Windows-7-6.1.7601-SP1, Packages: {pytest: 4.3.1, py: 1.8.0, pluggy: 0.9.0}, Plugins: {rerunfailures: 7.0, metadata: 1.8.0, html: 1.20.0}, JAVA_HOME: D:\\JDK}
rootdir: E:\CnblogCode\pytest_parametrize, inifile:
plugins: rerunfailures-7.0, metadata-1.8.0, html-1.20.0
collecting ... collected 2 itemstest_parametrize.py::test_parametrize_1[1-2-3]
测试数据为
12
PASSED
test_parametrize.py::test_parametrize_1[3-4-8] SKIPPED 1 passed, 1 skipped in 0.17 seconds Process finished with exit code 0 说明
输出结果显示收集到2个用例一个通过一个被跳过当我们不想执行某组测试数据时我们可以标记skip或skipif当我们预期某组数据会执行失败时我们可以标记为xfail等
嵌套字典 ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata_1 ({user: 1,pwd: 2},{user: 3,pwd: 4}
)pytest.mark.parametrize(dic, data_1)
def test_parametrize_1(dic):print(\n测试数据为\n{}.format(dic))if __name__ __main__:pytest.main([-s]) 输出 test session starts
platform win32 -- Python 3.7.2, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: E:\CnblogCode\pytest_parametrize, inifile:
plugins: rerunfailures-7.0, metadata-1.8.0, html-1.20.0
collected 2 itemstest_parametrize.py
测试数据为
{user: 1, pwd: 2}
.
测试数据为
{user: 3, pwd: 4}
. 2 passed in 0.20 seconds Process finished with exit code 0 增加可读性
使用ids参数
参数化装饰器有一个额外的参数ids可以标识每一个测试用例自定义测试数据结果的显示为了增加可读性我们可以标记每一个测试用例使用的测试数据是什么适当的增加一些说明
在使用前你需要知道ids参数应该是一个字符串列表必须和数据对象列表的长度保持一致我们可以试着使用ids看下效果 ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata_1 [(1, 2, 3),(4, 5, 9)
]ids [a:{} b:{} expect:{}.format(a, b, expect) for a, b, expect in data_1]def add(a, b):return a bpytest.mark.parametrize(a, b, expect, data_1, idsids)
class TestParametrize(object):def test_parametrize_1(self, a, b, expect):print(\n测试函数1测试数据为\n{}-{}.format(a, b))assert add(a, b) expectdef test_parametrize_2(self, a, b, expect):print(\n测试函数2数据为\n{}-{}.format(a, b))assert add(a, b) expectif __name__ __main__:pytest.main([-v]) # -v 更加详细的输出测试结果 输出 装饰器不传递ids参数的输出 collecting ... collected 4 itemstest_parametrize.py::TestParametrize::test_parametrize_1[1-2-3] PASSED [ 25%]
test_parametrize.py::TestParametrize::test_parametrize_1[4-5-9] PASSED [ 50%]
test_parametrize.py::TestParametrize::test_parametrize_2[1-2-3] PASSED [ 75%]
test_parametrize.py::TestParametrize::test_parametrize_2[4-5-9] PASSED [100%] 4 passed in 0.16 seconds Process finished with exit code 0 装饰器传递ids参数的输出 collecting ... collected 4 itemstest_parametrize.py::TestParametrize::test_parametrize_1[a:1 b:2 expect:3] PASSED [ 25%]
test_parametrize.py::TestParametrize::test_parametrize_1[a:4 b:5 expect:9] PASSED [ 50%]
test_parametrize.py::TestParametrize::test_parametrize_2[a:1 b:2 expect:3] PASSED [ 75%]
test_parametrize.py::TestParametrize::test_parametrize_2[a:4 b:5 expect:9] PASSED [100%] 4 passed in 0.20 seconds Process finished with exit code 0 说明
执行命令我使用了-v会更加详细的显示输出结果可以看到所有的数据结果中的用例都被一个列表明确的标记了而且通过这种标记可以更加直观的看出来每个测试用例使用的数据名称及测试内容
自定义id做标识
除了使用ids参数增加输出可读性外我们还可以在参数列表的参数旁边定义一个id值来做标识看下面实例 ------------------------------------
Time : 2019/7/25 19:18
Auth : linux超
File : test_parametrize.py
IDE : PyCharm
Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
QQ : 28174043qq.com
GROUP: 878565760
------------------------------------import pytestdata_1 [pytest.param(1, 2, 3, id(ab):pass), # id的值可以自定义 只要方便理解每个用例是干什么的即可pytest.param(4, 5, 10, id(ab):fail)
]def add(a, b):return a bclass TestParametrize(object):pytest.mark.parametrize(a, b, expect, data_1)def test_parametrize_1(self, a, b, expect):assert add(a, b) expectif __name__ __main__:pytest.main([-v]) 输出 test_parametrize.py::TestParametrize::test_parametrize_1[(ab):pass] PASSED [ 50%]
test_parametrize.py::TestParametrize::test_parametrize_1[(ab):fail] FAILED [100%] FAILURES
_______________ TestParametrize.test_parametrize_1[(ab):fail] ________________self pytest_parametrize.test_parametrize.TestParametrize object at 0x000001D7BFC4C748
a 4, b 5, expect 10pytest.mark.parametrize(a, b, expect, data_1)def test_parametrize_1(self, a, b, expect):assert add(a, b) expect
E assert 9 10
E -9
E 10test_parametrize.py:28: AssertionError1 failed, 1 passed in 0.35 seconds Process finished with exit code 0 说明
如果使用此方法来标记测试用例一定要严格按照我写的格式来使用语法为pytest.param(value, idsomthing)
总结
Pytest中实现数据驱动就是如此了
掌握
1.装饰器与测试用例使用单个变量接收多组数据与多个变量接收多个数据的访问方法
2.不同测试数据形式(列表嵌套元组列表字典等)时如何传递数据及访问数据
3.装饰器装饰测试类和测试函数的不同之处装饰测试类时类内所有的方法必须接送测试数据否则会报错装饰测试函数时比较灵活如果函数不使用数据就可以不装饰
4.为了输出结果的可读性可以选择使用ids参数与测试数据中定义id参数值来标识测试用例
注意
1. 装饰器的第一个参数是一个列表形式的字符串参数a, b, c 不能写成a, b, c
2. ids是个字符串列表它的长度需要与测试数据列表的长度一致
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你