一、前言
Pytest基于Python设计,是一款开源免费、功能全面的单元测试框架,车载以太网测试中被广泛使用。
二、工具说明
Pycharm 2023
pytest 7.4.3
三、创建工程
创建工程时重点要求使用VituralEnvironment
,这里直接选择。
四、Pytest环境安装
在根目录下创建文件Requirements.txt
文件,内容为:
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
随后在Pycharm的命令行窗口输入运行:
pip install -r Requirements.txt
安装完毕后继续命令行输入查看是否正确:
pytest --version
查看到版本号后即可正确使用,解释下刚才安装的包:
pytest pytest环境
pytest-html 用于生成pytest-html格式报告
pytest-xdist 用于用例的分布式执行
pytest-ordering 用于用例的顺序调整
pytest-rerunfailures 用于失败重跑
allure-pytest 用于生成allure报告
五、Pytest框架
5.1 框架示意
在Pytest中表现为:
5.2 配置文件
Requirements.txt
为环境安装文件,前面小节已经提到
pytest.ini
文件为参数配置文件,具体见下一节。
5.3 主文件
测试入口,使用pytes.mian()
开始测试,
import pytest
#执行本文件中的所有测试类,一个main会自动执行所有的py文件
if __name__ == '__main__':
#基于pytest.ini运行
pytest.main()
5.4 测试模块
定义编写各测试用例,例如:
import pytest
#测试类
class TestEcuSleepWakeup:
#测试用例/测试接口/测试函数
def test_01_sleep(self,test_fixture):
print("这是一个测试ECU休眠用例!")
@pytest.mark.useragemode #装饰器
def test_02_wakeup(self,test_fixture):
print("这是一个测试ECU唤醒用例!")
六、Pytest语法基础
6.1 命名规则
1.模块名必须以test_开头或者_test结尾
2.测试类必须以Test开头,不能有int方法
3.测试用例必须以test开头
6.2 运行方式
6.2.1 运行模式
1.主函数模式:
(1)全局运行:pytest.main(['-vs'])
(2)指定模块:pytest.main(['-vs','test_login.py'])
(3)指定目录:pytest.main(['-vs','../test_interface'])
(4)指定函数:pytest.main(['-vs','../test_interface/test_interface_01.py::test_02_TestcaseInterface'])
2.命令行模式:
(1)切换到测试用例的目录:cd testcase
(3)运行:pytest -vs test_login.py
3.读取ini文件运行:pytest.ini
(1)ini文件,一般放在项目的根目录中
(2)ANSI格式,可以Notepad修改,pytest 7.4.3 支持UTF8编码
(3)将会同步修改主函数模式和命令函模式
(4)分组执行:冒烟测试,分模块执行,分接口和web执行
单选:pytest.main(['-vs','test_login.py','-m=somke'])
多选:pytest.main(['-vs','-m=smoke or useragemode'])
6.2.2 基于读取Pytest.ini文件运行
主要解释下第三种读取INI文件运行,需要在根目录下创建一个pytest.ini
文件:
[pytest]
#命令行
addopts = -vs -m 'smoke or useragemode' --html ./report/report.html
#测试路径
;testpaths = ./testcase
#测试文件
python_files = test_*.py
#测试类名
python_classes = Test*
#测试函数名
python_functions = test_*
#分组名
markers =
smoke:somking test
useragemode:usage mode
pytest.ini
与主函数pytest.main()
会有多个参数冲突,比如文件名、路径等,切记不可冲突!
6.2.3 命令行基础命令
在pytest.ini - addopts
或者Pycharm的命令行
运行pytest时,可以有以下几种参数:
-s 打印所有的调试信息
-v 打印用例名及测试结果
-vs 组合使用
-x 测试失败时停止测试
-k='string' 根据用例的部分字符串指定测试用例
-m='string' 根据ini文件定义的测试分组执行用例 pytest.main(['-vs','test_login.py','-m=somke'])
--maxfail=num 最大用例失败数
-n=num 多线程/分布式运行 pytest.main(['-vs','test_login.py','-n=2'])
--reruns=num 失败重跑num次 pytest.main(['-vs','test_login.py','--reruns=2'])
例如我们已经给出的:
#命令行
addopts = -vs -m 'smoke or useragemode' --html ./report/report.html
6.2.4 分组执行
在pytest.ini文件中,我们定义了分组名Smoke
与useragemode
,因此测试函数前只需要加上相关标签即可。
import pytest
#测试类
class TestEcuSleepWakeup:
#测试用例/测试接口/测试函数
def test_01_sleep(self,test_fixture):
print("这是一个测试ECU休眠用例!")
@pytest.mark.useragemode #分组
def test_02_wakeup(self,test_fixture):
print("这是一个测试ECU唤醒用例!")
在pytest.ini的命令行添加即可选择分组运行:
#命令行
addopts =-m 'smoke or useragemode'
6.2.5 顺序执行及跳过
可以在用例前添加装饰器来执行当前测试类中的用例执行顺序:
@pytest.mark.run(order=1) #执行顺序:1为执行顺序,可以是3,可以时2
@pytest.mark.skip(age<=18,reason = '年龄跳过') #有条件跳过:小于18岁跳过;可以删除条件
import pytest
import time
import setuptools
#测试类
class TestLogin:
#测试用例/测试接口/测试函数
@pytest.mark.run(order=2) #装饰器:第二个执行
def test_login_01_Print(self):
time.sleep(3)
print("这是一个TestLogin用例!")
assert 1==2 #断言
# @pytest.mark.skip(reason = '不想执行')
@pytest.mark.run(order=1) #装饰器:第一个执行
def test_login_02_Print(self):
time.sleep(3)
print("这是一个TestLogin用例!")
6.2.6 固定夹具及装饰器
setup_method() 相当于prepare,作用于添加的测试类中每一个用例
teardown_method() 相当于finalize,作用于添加的测试类中每一个用例
setup_class() 作用于添加的测试类整体,只执行一次初始化工作
setup_teardown() 作用于添加的测试类整体,只执行一次扫尾动作
分组执行时pytest用例执行的核心:
import pytest
import time
import setuptools
#测试类
class TestLogin:
def setup_class(self):
print("\n给类做一些前置工作");
#夹具
def setup_method(self):
print("\n给用例做一些前置工作");
#测试用例/测试接口/测试函数
@pytest.mark.run(order=2) #装饰器:第二个执行
@pytest.mark.smoke #装饰器:自定义测试分组,比如冒烟测试
def test_login_01_Print(self):
time.sleep(3)
print("这是一个TestLogin用例!")
assert 1==2 #断言
# @pytest.mark.skip(reason = '不想执行')
@pytest.mark.run(order=1) #装饰器:第一个执行
@pytest.mark.useragemode
def test_login_02_Print(self):
time.sleep(3)
print("这是一个TestLogin用例!")
def teardown_method(self):
print("\n给用例一些结束动作")
def teardown_class(self):
print("\n给类做一些结束工作");
标签:vs,基础,pytest,用例,Pytest,测试,test,main From: https://www.cnblogs.com/YiMo9929/p/17798127.html