使用pytest.mark.parametrize()进行参数化传递,参数传递有以下三种方式,分别适用不同的场景
data1 = ['zhangsan', 'lisi']
data2 = [('zhangsan', '男'),('lisi', '女')]
data3 = [{'公司': 'XXX公司','强项':'打台球'},{'公司': '智能','强项':'骑驴'}]
@pytest.mark.parametrize('name_data', data1)
def test_a(name_data):
print('参加踢球的人有{}'.format(name_data))
@pytest.mark.parametrize('sex_data', data2)
def test_b(sex_data):
print('{0}的性别是{1}'.format(sex_data[0],sex_data[1]))
@pytest.mark.parametrize('aihao_data', data1)
def test_b(aihao_data):
print('%s公司的强项是%s' % (aihao_data['公司'],aihao_data['强项']))
skip3与skipif可以放在单个函数前,也可以放在整个类前
1、skip(reason)
@pytest.mark.skip()
@pytest.mark.parametrize('name', data)
def test_a(name):
print('hahahah')
2、skipif(condition, reason)
@pytest.mark.skipif(sys.platform=='win32',reason='如果是win系统就跳过')
def test_a():
pass
3、skip和skipif标记功能的巧用:
skip_mark = pytest.mark.skip(reason='这里写理由')
@skip_mark
def test_a():
pass
skipif_mark = pytest.mark.skipif(sys.platform=='win32',reason='如果是win系统就跳过')
@skipif_mark
def test_b():
pass
4、最常用的用法
@pytest.mark.parametrize('my_name', ['小李', '小王', '小刘'])
def test_pytest_dot_skip_01(my_name):
if my_name == '小刘':
pytest.skip('我是【{0}】,但我被跳过了。'.format(my_name))
else:
print('我是', my_name)
- setup_module、teardown_module # 整个.py模块开始前后
- setup_function、teardown_function # 每个独立函数级别用例开始前后
- setup_class、teardown_class # 类的开始前后
- setup_method/teardown_method、setup/teardown #都是类内的每个用例方法,但是如果存在
- setup_method/teardown_method,先执行setup_method/teardown,再执行setup
使用@pytest.fixture()装饰器生成固件函数
@pytest.fixture()
def login():
print('我登录了')
1、调用方式(一)
把fixture固件函数作为入参
注意:只有Pytest的测试函数或方法可以把fixture固件函数作为入参
def test_a(login):
print('成功进入了我的主页。')
2、调用方式(二)
使用@pytest.mark.usefixtures(‘固件函数名称’)装饰器
@pytest.mark.usefixtures('login')
@pytest.mark.parametrize('course_name', ['PyTest', 'UnitTest'])
def test_buy_course(course_name):
print('购买课程【{0}】成功。'.format(course_name))
3、调用方式(三)
使用@pytest.fixture()装饰器时可以传入autouse和scope参数
- autouse:默认为False,设置为True后会自动调用,且调用优先级高于autouse=False的
- scope:有四个级别参数”function”(默认),”class”,”module”,”session
- function:每一个函数或方法都会调用
- class:每一个类调用一次,一个类中可以有多个方法
- module:每一个.py文件调用一次,该文件内又有多个function和class
- session:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module
@pytest.fixture(autouse=True)
def open_app():
print('成功打开了App首页。')
可以理解conftest是PyTest的中央处理器,文件名只能是conftest.py
注意:一定要注意conftest.py的位置,不同文件夹下均可以有此文件
1、用法:初始化数据
@pytest.fixture(scope="session",autouse=True)
def setup_function():
print("执行conftest文件")
basefunc.delfile()
yield
print("执行conftest文件")
basefunc.delfile()
2、用法:作为变量传递
@pytest.fixture
def url_ip():
ip = '127.0.0.1'
return ip
data = ['liyanda']
@pytest.mark.parametrize('api_data', data)+
def test_api(url_ip, url_port, api_data):
print(url_ip)
print(url_port)
print(api_data)
@pytest.mark.xxx可以自定义标记(个人觉得很有实用性的功能),可以标记测试类,也可以标记测试函数
@pytest.mark.high
class TestApi:
def test_a():
assert 1 != 1
@pytest.mark.medium
def test_b():
assert 2 > 1
@pytest.mark.low
def test_c():
assert 1 == 1
使用命令行模式启用PyTest配合上-m参数,可以指定执行的函数
pytest -v -m "high or medium" test_api.py
Original: https://blog.csdn.net/qq_45499910/article/details/125189487
Author: 克里斯蒂亚诺·罗纳尔达
Title: pytest知识点总结
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/775548/
转载文章受原作者版权保护。转载请注明原作者出处!