接口自动化测试框架实战:Pytest框架

在这里插入图片描述

前置条件

#conftest.py
import pytest


@pytest.fixture()
def login():
    print('登陆了')

例子 1

import pytest

@pytest.fixture(scope="module", autouse=True)
def open_browser():
    print("\n打开浏览器,打开百度首页")

    yield

    print('执行teardown')

    print('最后关闭浏览器')


def test_soso(login):

    print('case1: 登际后执行搜索')

def test_cakan():

    print('case2:不登陆就看')

def test_cart(login):

    print('case3,登陆,加购物车')

if __name__ == '__main__':
    pytest.main(['-s','test_fixture.py'])

在这里插入图片描述
例子 2

import pytest

@pytest.fixture(scope="module", autouse=True)
def open_browser():
    print("\n打开浏览器,打开百度首页")

    yield

    print('执行teardown')
    print('最后关闭浏览器')

@pytest.mark.usefixtures('open_browser')
def test_soso():
    print('case1: 登际后执行搜索')

def test_cakan():
    print('case2:不登陆就看')

@pytest.mark.usefixtures('open_browser')
def test_cart():
    print('case3,登陆,加购物车')

if __name__ == '__main__':
    pytest.main(['-s','test_fixture2.py'])

在这里插入图片描述

import pytest

@pytest.fixture(scope="function", autouse=True)
def open_browser():
    print("\n打开浏览器,打开百度首页")

    yield

    print('执行teardown')
    print('最后关闭浏览器')

@pytest.mark.usefixtures('open_browser')
def test_soso():
    print('case1: 登际后执行搜索')

def test_cakan():
    print('case2:不登陆就看')

@pytest.mark.usefixtures('open_browser')
def test_cart():
    print('case3,登陆,加购物车')

if __name__ == '__main__':
    pytest.main(['-s','test_fixture2.py'])

在这里插入图片描述
例子3

#test_fixture_assert_skip_01.py
import pytest
import sys
# 默认 scope=function

def test_soso(login):
    print('case1: 登际后执行搜索')
    assert 1 == 1
    assert {'name': 'linda', 'age': 18} == {'name': 'linda', 'age': 188}
    a = 'hello'
    age = 35
    assert a in 'hello world'
    assert 20 < age < 80

def f():
    return 3

@pytest.mark.skip
def test_cakan():
    print('case2:不登陆就看')
    assert f() == 4

environment = 'android'

@pytest.mark.skipif('environment=="android"', reason='android平台没有这个功能')
def test_cart_3(login):
    print('case3,登陆,点击苹果图标')

@pytest.mark.skipif(sys.platform =='win32', reason='不在windows下运行')
@pytest.mark.skipif(sys.version_info < (3,6), reason='3.6版本以下不执行,您需要更高版本')
def test_cart(login):
    print('case3,登陆,点击苹果图标,3.6以下版本无法执行')

@pytest.mark.xfail
def test_xfail():
    print(broken_fixture())


def broken_fixture():
    raise Exception("Sorry, it's 中断异常.")

if __name__ == '__main__':
    pytest.main(['-s','test_fixture_assert_skip_01.py'])

在这里插入图片描述
例子4

import pytest

test_user_data = ["linda", "servenruby"]

@pytest.fixture(params=test_user_data)
def login_r(request):
    user = request.param
    print("\n打开首页准备登陆,登陆用户:%s" % user)
    return user


def test_login_s(login_r):
    print(login_r)

if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture_request_06.py'])

在这里插入图片描述
例子5

import pytest


@pytest.fixture()
def start():
    print("\n----begin-登陆--")


def test_soso():
    print('\ncase1: 登际后执行搜索')


def test_cakan():
    print('\ncase2:不登陆就看')


def test_cart():
    print('\ncase3,登陆,加购物车')


def test_quit():
    print('case3,登陆,退出')
if __name__ == '__main__':
    pytest.main(['-s','-v','test_fixture_usefixtures_05.py'])

在这里插入图片描述
例子6

import pytest

# 参数化,前面两个变量,后面是对应的数据;3+5--->test_input,8-->expected
@pytest.mark.parametrize("test_input,expected",[("3+5", 8),
                                                ("2+5", 7),
                                                ("7*5", 30),
                                                ])
def test_eval(test_input, expected):
    # eval将字符串str当成有效的表达式来求值并返回计算结果
    assert eval(test_input) == expected

if __name__ == '__main__':
    pytest.main()

在这里插入图片描述
例子7

import pytest

test_user_data = ["linda", "servenruby"]

@pytest.fixture(scope="module")
def login_r(request):
    # 这是接收传入的参数,接收一个参数
    user = request.param
    print("\n打开首页准备登陆,登陆用户:%s" % user)
    return user

# 这是pytest的参数化数据驱动,indirect=True 是把login_r当作函数去执行
@pytest.mark.parametrize("login_r", test_user_data, indirect=True)
def test_login(login_r):
    # 登陆用例
    a = login_r
    print(test_user_data)
    print("测试用例中login的返回值:%s" % a)
    assert a != ""
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture7.py'])

在这里插入图片描述
例子8

import pytest


test_user_data = [{"user": "linda", "password": "888888"},
                  {"user": "servenruby", "password": "123456"},
                  {"user": "test01", "password": ""}]


@pytest.fixture(scope="module")
def login_r(request):
    # 可以通过dict形式,虽然传递一个参数,但通过key的方式可以达到类似传入多个参数的效果
    user = request.param['user']
    pwd = request.param['password']

    print("\n打开首页准备登陆,登陆用户:%s,密码:%s" % (user, pwd))
    if pwd:
        return True
    else:
        return False


# 这是pytest的参数化数据驱动,indeirect=True 是把login_r当作函数去执行
@pytest.mark.parametrize("login_r", test_user_data, indirect=True)
def test_login(login_r):
    # 登陆用例
    a = login_r
    print("测试用例中login的返回值:%s" % a)
    assert a, "失败原因:密码为空"
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture8.py'])

在这里插入图片描述
在这里插入图片描述
例子9

import pytest

test_user_data1 = [{"user": "linda", "password": "888888"},
                  {"user": "servenruby", "password": "123456"},
                  {"user": "test01", "password": ""}]

test_user_data2 = [{"q": "中国平安", "count": 3, "page": 1},
                  {"q": "阿里巴巴", "count": 2, "page": 2},
                  {"q": "pdd", "count": 3, "page": 1}]


@pytest.fixture(scope="module")
def login_r(request):
    # 这是接收传入的参数,接收一个参数
    user = request.param['user']
    password = request.param['password']

    print("\n用户名:%s,密码:%s" % (user, password))


@pytest.fixture(scope="module")
def query_param(request):
    q = request.param['q']
    count = request.param['count']
    page = request.param['page']
    print("查询的搜索词:%s" % q)
    return request.param


# 这是pytest的参数化数据驱动,indeirect=True 是把login_r当作函数去执行
# 从下往上执行
# 两个数据进行组合测试有3*3个测试用例执行(test_user_data1的个数*test_user_data2的个数)
@pytest.mark.parametrize("query_param", test_user_data2, indirect=True)
@pytest.mark.parametrize("login_r", test_user_data1, indirect=True)
def test_login(login_r, query_param):
    # 登陆用例
   print(login_r)
   print(query_param)

在这里插入图片描述
在这里插入图片描述
例子10

import pytest

test_user_data1 = [{"user": "linda", "password": "888888"},
                  {"user": "servenruby", "password": "123456"},
                  {"user": "test01", "password": ""}]

test_user_data2 = [{"q": "中国平安", "count": 3, "page": 1},
                  {"q": "阿里巴巴", "count": 2, "page": 2},
                  {"q": "pdd", "count": 3, "page": 1}]


@pytest.fixture(scope="module")
def login_r(request):
    # 这是接收传入的参数,接收一个参数
    user = request.param['user']
    password = request.param['password']

    print("\n用户名:%s,密码:%s" % (user, password))


@pytest.fixture(scope="module")
def query_param(request):
    q = request.param['q']
    count = request.param['count']
    page = request.param['page']
    print("查询的搜索词:%s" % q)
    return request.param


# 这是pytest的参数化数据驱动,indeirect=True 是把login_r当作函数去执行
# 从下往上执行
# 两个数据进行组合测试有3*3个测试用例执行(test_user_data1的个数*test_user_data2的个数)
@pytest.mark.parametrize("query_param", test_user_data2, indirect=True)
@pytest.mark.parametrize("login_r", test_user_data1, indirect=True)
def test_login(login_r, query_param):
    # 登陆用例
   print(login_r)
   print(query_param)

if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture10.py'])
"D:\Program Files\ProgramData\envs\python36_ttsx\python.exe" C:/Users/luojun/Desktop/demo/test_fixture10.py
============================= test session starts =============================
platform win32 -- Python 3.6.12, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: C:\Users\luojun\Desktop\demo
plugins: allure-pytest-2.8.40, html-3.1.1, metadata-1.11.0, rerunfailures-9.1.1
collected 9 items

test_fixture10.py 
用户名:linda,密码:888888
查询的搜索词:中国平安
None
{'q': '中国平安', 'count': 3, 'page': 1}
.查询的搜索词:阿里巴巴
None
{'q': '阿里巴巴', 'count': 2, 'page': 2}
.
用户名:servenruby,密码:123456
None
{'q': '阿里巴巴', 'count': 2, 'page': 2}
.查询的搜索词:中国平安
None
{'q': '中国平安', 'count': 3, 'page': 1}
.查询的搜索词:pdd
None
{'q': 'pdd', 'count': 3, 'page': 1}
.
用户名:linda,密码:888888
None
{'q': 'pdd', 'count': 3, 'page': 1}
.
用户名:test01,密码:
None
{'q': 'pdd', 'count': 3, 'page': 1}
.查询的搜索词:阿里巴巴
None
{'q': '阿里巴巴', 'count': 2, 'page': 2}
.查询的搜索词:中国平安
None
{'q': '中国平安', 'count': 3, 'page': 1}
.

例子11

import pytest


@pytest.mark.webtest
def test_send_http():
    pass


@pytest.mark.apptest
def test_devide():
    pass


@pytest.mark.android
def test_search():
    pass


@pytest.mark.ios
def test_add():
    pass


def test_plus():
    pass

if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture10.py'])

在这里插入图片描述
例子12

import pytest

def test_01():
    print('test01')

@pytest.mark.last
def test_02():
    print('test02')
    assert(4==1)

@pytest.mark.skip
def test_03():
    print('test03')

@pytest.mark.run(order=1)
def test_04():
    print('test04')
    # assert(4==1)
if __name__ == '__main__':
    pytest.main(['-s', 'test_fixture12.py'])

在这里插入图片描述
例子13

import time
import random

def test_rerun():
    time.sleep(1)
    a = random.randint(1, 3)
    print(a)
    assert 3 == a

在这里插入图片描述
最后我也整理了一些软件测试学习资料,对于学软件测试的小伙伴来说应该会很有帮助,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这份资料也已经帮助了很多的软件测试的学习者,希望也能帮助到你。需要的进群 644956177 自取喔。软件测试,与你同行!陪你成为优秀的测试工程师!
在这里插入图片描述

既然都看到这里啦,请你帮个忙:

1、点赞,让更多小伙伴看到;

2、关注我,持续更新测试干货。

敲字不易,如果此文章对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

干货分享

北漂4年,做开发13K,转行自动化测试,真的靠谱吗···

从一个萌新小白到一次拿下5个测试offer,我的测试成长之路···

95后,刚工作2-3年就年薪50W+ ,才发现打败我们的,从来不是年龄···

自动化测试6年后,终于有了属于我自己的团队···

双非流本科毕业,自学软件测试也能成功进入阿里···

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码小怡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值