pytest知识点总结

使用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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球