一、pytest简洁和好处
unittest的好处:
1.标准库,兼容性好
2.更加容易理解
pytest和unittest兼容是有条件的,pytest使用以下功能就不能和unittes兼容:
二、自动发现测试用例原理,命名方式
三、断言: 自定义提示文案
assert 1==1, "提示文案"
四、运行方式
1.在控制台指定执行范围
2.编辑器
Run -->Run…-->Edit Configurations-->+ -->python test -->pytest -->Run
3.通过python代码执行pytest
直接执行pytest.main(),自动查找当前目录下,以test_开头的文件或者以_test结尾的py文件
五、自定义查找规则(在根目录下pytest.ini)
[pytest]
python_files =
test_*.py
check_*.py
example_*.py
python_functions = *_test
python_classes = *Suite
四、mark随机测试(冒烟测试,给测试用例打标签)
第一步:mark注册,新建ini文件
#pytest.ini
[pytest]
markers =
login
demo
第二步:
1.把标签贴到测试用例(方法)上,一个测试用例上可以贴多个标签,标签不仅可以贴到测试用例上,还可以贴到测试类上
@pytest.mark.标签名
2.贴标签第二种方法:标记在测试类中,固定写法
pytestmark = [pytest.mark.标签名, pytest.mark.标签名]
import pytest
class TestDemo4:
pytestmark = [pytest.mark.login]
# @pytest.mark.login
def test\_demo\_4(self):
assert 1 == 1
第三步:运行的时候指定标签,在Terminal输入pytest -m "mark1 and not mark2"
注意:一定要使用双引号,单引号会报错
五、跳过函数
@pytest.mark.skip(reason='out-of-data api')
# skipif 当满足某个条件时就跳过
@pytest.mark.skipif(sys.plafform == "win32", reason="does not run on windows")
# 跳过预见错误
@pytest.mark.xfail(gen.__version__ < '0.2.0', reason='not supported until v0.2.0')
def test_api():
id_1 = gen.unique_id()
id_2 = gen.unique_id()
assert id_1 != id_2
六、pytest的用例执行顺序
pytest有自己内置的执行顺序规则,一般从上到下,可以通过安装插件pytest.ordering:run your tests in order
七、参数化
ddt数据驱动只是unittest支持数据驱动的一种库 ddt != 数据驱动
ddt模块不能和fixture共用,所以要换用pytest的参数化实现ddt
参数化会和unittest冲突,因为setUp这些东西都不会运行了!要改成pytest,不要继承unittest.TestCase
方法一:使用pytest.mark.parametrize()方式进行参数化
import pytest
Data = [1, 2, 3]
@pytest.mark.parametrize("data", Data)
def test_mock(data):
print('测试开始')
assert data == 2, "备注信息"
方法二:使用pytest.fixture()方式进行参数化,fixture装饰的函数可以作为参数传入其他函数
1.在固件中添加返回值
2.然后在测试方法中传入固件
3.在测试方法中,用固件名来表示其返回值
test_demo.py
import pytest
class TestDemo1:
# 定义参数列表
list_a = [1, 2, 3]
# 定义固件名is\_success,并设置返回值
@pytest.fixture(params=list\_a)
def is\_success(self, request):
return request.param
# 在测试方法中传入固件名
@pytest.mark.success
def test\_success(self, is\_success):
assert is\_success == 1
方法三:测试数据和用例分离
可以采用conftest.py文件存储参数化数据和函数,模块下的用例执行时,会自动读取conftest.py文件中的数据
1.先定义一个固件is_success
conftest.py
import pytest
list_a = [1, 2, 3]
@pytest.fixture(params=list_a)
def is_success(request):
return request.param
2.在测试类中传入固件名称
test_demo4.py
import pytest
class TestDemo4:
@pytest.mark.test
def test\_demo\_4(self, is\_success):
# print('测试一下')
assert is\_success == 1
八、fixture的使用(原文链接:https://blog.csdn.net/BearStarX/article/details/101000516)
fixture相对于setUp和tearDown来说的优势:
通过yield生成器实现了前置条件和后置条件的组合
1.先在根目录conftest.py文件中定义一个名为init_web的固件
import pytest
@pytest.fixture()
def init_web():
print("启动浏览器")
yield driver
print("关闭浏览器")
2.作为参数传到测试用例中
def test_demo(init_web):
3.接收这个东西
driver = init_web
import pytest
class TestDemo3:
@pytest.mark.login
def test\_demo3(self, init\_web):
driver = init\_web
assert driver == 2
注意:
1.pytest 运行默认不会打印固件中print(),如果想打印,那么使用python -m login -s 或者 pytest --capture=no
九、重运行
安装插件:pip install pytest -rerunfailures
pytest --reruns 3 --reruns-delay 5
十、测试报告
各种插件地址:https://plugincompat.herokuapp.com/
html:--html=\report\demo.html
需要安装:
pip install pytest-html
# log
--resultlog=report/demo.txt 相对路径
# xml,jenkins使用
--junitxml=report/demo.xml
# html
--html=report/demo.html
main.py
import pytest
import time
if __name__ == '__main__':
ts = time.time()
pytest.main(['-m test', '-s',
'--resultlog=report/{}.txt'.format(ts),
'--junitxml=report/demo.xml',
'--html=report/demo.html'])
在Terminal输入:python main.py
查看结果:在根目录下会生成一个含有各种报告的report文件夹
手机扫一扫
移动阅读更方便
你可能感兴趣的文章