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.日志监控
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)