pytest测试框架

一、流行的测试框架

#python:unittest和pytest
#java框架:junit和testng

框架的作用:
    1.发现用例:根据每个框架默认的规则去发现并且加载测试用例
    2.执行用例:将测试用例安装一定的顺序和条件执行,并生成结果
    3.判断结果:通过断言来判断实际结果和预期结果是否相同
    4.生成报告:统计测试进度,耗时,通过率,生成报告。

二、Pytest框架详解 

 

 

 官方文档地址

#英文-文档地址
https://docs.pytest.org/en/7.1.x/

#中文-文档地址
https://www.osgeo.cn/pytest/contents.html#full-pytest-documentation

pytest安装与依赖

 

 

 

 

pytest框架的优势

复制代码
pytest是一个非常成熟的python用例测试框架,它可以和很多的工具或框架搭配使用。
1.和selenium,requests,appium实现多种自动化测试。
2.和allure结合生成美观的报告
3.和jenkins实现持续集成。


#最重要的是,它有很多的插件:
"""
pytest-html 生成html报告插件 
pytest-xdist 多线程 
pytest-ordering 标记测试用例的执行顺序 
pytest-returnfailers 失败用例重跑 
pytest-base-url 管理基础路径 
allure-pytest 生成allure报告 
pytest
requests 
pyyaml
"""
复制代码

pytest框架使用规范

#基于pytest单元测试框架,默认测试用例的规则:
    1.模块名(py文件)必须以test_开头或_test结尾。
    2.类名必须Test开头 
    3.用例名必须以test_开头

#使用requirements.txt文件保存,并通过以下命令执行包装:pip install -r requirements.txt

 pytest框架的,3种执行方式

#1.通过main执行
import pytest

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

 

#2.通过命令行执行 
pytest -vs

 

复制代码
#3.通过读取pytest.ini配置文件来执行测试用例 
不管使用main还是命令行都会自动的去读取pytest.ini的配置文件。

[pytest] 
#命令行参数 
addopts =-vs 

#改变默认的测试用例的路径 
testpaths =./testcase 

#改变测试用例的模块名规则 
python_files = test_*.py

#改变测试类的默认规则
python_classes = Test*

#改变测试用例名称规则
python_functions = test_*

#设置基础路径
base_url = http://www.baidu.com

#标记执行:-m "smoke or product_manage"
markers =
    smoke:冒烟测试
    login:登陆用例
    product_manage:商品管理
    user_manage:用户管理
复制代码

 

三、执行测试用例的,2前后置处理方式

1.设置前后置方法:和unittest相似

复制代码
import pytest
import requests

class Testfirst:
    def setup_class(self):
        print("用例前置")
    def teardown_class(self):
        print("用例后置处理")
    def test_main(self):
        print("测试主程序")
        url = "https://www.baidu.com"
        res = requests.get(url=url)
        return res.status_code
if __name__ == '__main__':
    pytest.main()
"""
============================= test session starts =============================
platform win32 -- Python 3.10.5, pytest-7.1.2, pluggy-1.0.0
rootdir: C:\Users\Lenovo\Desktop\pytest_excel\pytest_demo
plugins: anyio-3.6.1
collected 1 item
test_01.py .                                                             [100%]
============================== 1 passed in 0.25s ==============================
"""
复制代码

 2.fixture固件方式:随心所欲的设置前后置

复制代码
#定义前后置
#参数说明:@pytest.fixture(scope="function",autouse=False,params=read_yaml(),ids=['bl','bf','xy'],name="ea") 
@pytest.fixture(scope="",params="",autouse="",ids="",name="") 
"""
            scope:作用域【function方法】【class 类】【module 模块】【package/session 回话】         
            params:数据驱动
            autouse:自动作用还是手动作用【True自动调用,Fasle手动调用(需要在参数里面传入固件名称)】
          ids:当数据驱动时更改参数名 
          name:重定义fixture的固件,方法函数别名,调用处也必须使用别名
"""
@pytest.fixture(scope="作用域",autouse=True)
def assert_func():
    print("用例前置,执行")
    yield "传参信息"
    print("用例后置,执行")
复制代码

 

复制代码
#给指定函数方法,手动添加前后置:提前引用装饰器,不需要autouse参数,默认为False,只需要给指定方法传参装饰器名字
#给全部函数方法,自动添加前后置:提前引用装饰器,设置autouse=True

import pytest
import requests

#@pytest.fixture(scope="function",autouse=True)#自动调用,全部用例生效
@pytest.fixture(scope="function") #指定用例生效
def assert_func():
    print("用例前置,执行")
        yield "传参信息"
    print("用例后置,执行")

class Testfirst:
    def test_main(self, info, assert_func):#指定方法传参assert_func名字,手动调用前后置,只对指定用例生效
        print("测试主程序", info) #源于yield传参信息
        url = "https://www.baidu.com"
        res = requests.get(url=url)
        return res.status_code
if __name__ == '__main__':
    pytest.main()
复制代码

 

复制代码
import pytest
import requests

#@pytest.fixture(scope="class",autouse=True) #设置True,对全部类生效,不设置,可以对某个类生效
@pytest.fixture(scope="class") 
def assert_func():
    print("用例前置,执行")
    yield "传参信息"
    print("用例后置,执行")

@pytest.mark.usefixtures("assert_func") #前后置对单个类生效
class Testfirst:
    def test_main(self, info):
        print("测试主程序", info) #源于yield传参信息
        url = "https://www.baidu.com"
        res = requests.get(url=url)
        return res.status_code
if __name__ == '__main__':
    pytest.main()
复制代码

 

复制代码
#params 使用说明

def read_yaml():
    """
    数据读取方法,数据驱动
    :return:
    """
    return [1,2,3]

@pytest.fixture(scope="function", params=read_yaml())
def assert_func(request):
    print("用例前置,执行")
    yield request.params #每调用一次,就迭代一次
    print("用例后置,执行")

class Testfirst:
    def test_main(self, assert_func):  # 重定义固件方法名
        print("方法" + assert_func)
if __name__ == '__main__':
    pytest.main()
"""
方法:1
方法:2
方法:3
"""
复制代码

 

复制代码
#ids和name参数说明
import pytest
import requests

#ids定义的站位符号,可以传给需要的地方,实现隐藏测试用例参数的作用
@pytest.fixture(scope="function", ids=["占位符"], name="fangfa")
def assert_func(request):
    print("用例前置,执行")
    yield request.params #每调用一次,就迭代一次
    print("用例后置,执行")

class Testfirst:
    def test_main(self,  fangfa): #重定义固件方法名
        print("测试主程序" + fangfa) #源于yield传参信息
        url = "https://www.baidu.com"
        res = requests.get(url=url)
        return res.status_code

if __name__ == '__main__':
    pytest.main()
复制代码
复制代码
#把固件单独放置在一个文件中,简化使用

#同级文件名:conftest.py

import pytest
from XXX import read_yaml
@pytest.fixture(scope="function",autouse=False,params=read_yaml(),ids=['bl','bf','xy'],name="fangfa") 
     defexe_assert(request): 
     print("在用例之前执行:查询数据库用于断言") 
     yield request.param 
     print("在用例之后执行:查询数据库")
复制代码

 

复制代码
#定义session,多个用例都生效,其他用例无需重复获取session

#同级文件名:conftest.py

import pytest
from XXX import read_yaml
@pytest.fixture(scope="session",autouse=True) 
     defexe_assert(request): 
     print("在用例之前执行:查询数据库用于断言") 
     yield info#自定义info信息
     print("在用例之后执行:查询数据库")

复制代码

 

 四、接口自动化框架封装(统一请求封装)

1.统计数据
2.异常处理
3.日志监控

posted @   zwx901323  阅读(477)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示