文章目录一、前言二、pytest固件1、什么是固件1.1 unittest风格的固件1.1.1 每一个测试用例(方法)加前后置1.1.2 每一个测试类加前后置2、pytest固件风格2.1 使用fixture实现前后置2.2 fixture的介绍2.2.1 fixture的源码2.2.2 fixture的参数化params2.2.3 fixture自动使用autouse2.2.4 fixture动态名称name2.3 fixture的跨文件使用三、conftest 统一管理fixture四、插件中的fixture五、pytest的运行过程六、Allure的企业级测试报告1、搭建Allure的环境配置2、生成Allure的测试报告3、Allure的常用命令4、Allure报告的企业级定制4.1 logo定制4.1.1 启用插件4.1.2 配置插件4.2 内容定制一、前言本文带你系统掌握Pytest的两大核心能力固件fixture与Allure报告。从unittest风格的前后置开始逐步深入到fixture的灵活用法、conftest统一管理、插件集成再到企业级Allure报告的搭建与定制。内容实用、节奏友好帮你轻松写出更规范的自动化测试框架。二、pytest固件1、什么是固件我们当初在学习jmeter接口测试的时候我们可以在取样器的执行之前和取样器的执行之后做一些事情。那么这个固件大概就是这样的一个意思我们更多的名字是叫他前后置在我们的pytest中我们测试用例的执行之前以及测试用例的执行之后自动执行的方法1.1 unittest风格的固件1.1.1 每一个测试用例(方法)加前后置现在我们有这样的一个需求需要在一个在每一个测试用例之前和每一个测试用例执行之后去自动执行一些方法代码classTest:# 第一个方法第一个测试用例deftest_a(self):assert11# 第二个方法第二个测试用例deftest_b(self):assert12那么现在我要写一个main文件里面调用pytest的main方法就可以启动pytest框架那么接下在我们项目的根目录下新建一个配置文件pytest.ini那么这样之后我们就可以在配置文件中输入我们的pytest执行参数这样我们就在启动main方法的时候启动pytest然后pytest就会读取这个配置文件然后将执行的时候就会带上里面的参数比如-v 那么就会打印出详细的信息# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# 配置命令行参数 -v 就是我们在执行的时候 实际是 pytest -v 他会打印出比较详细的信息addopts-vsOK此时我们去执行执行结果如我们所料目前没有前后置上述有两个测试用例OK现在我们会在每一个测试用例之前添加前后置所谓的前后置就是执行这个用例之前要自己做的事情以及执行完这个用例之后要做的事情unittest 方法级别前置处理器setup_methodunittest 方法级别后置处理器teardown_methodclassTest:# 方法级别的前置处理器defsetup_method(self):print(每一个测试用例执行之前自动执行)# 方法级别的后置处理器defteardown_method(self):print(每一个测试用例执行之后自动执行)# 第一个方法第一个测试用例deftest_a(self):assert11# 第二个方法第二个测试用例deftest_b(self):assert12ok那么此时你就看结果1.1.2 每一个测试类加前后置unittest 类级别前置处理器setup_classunittest 累级别后置处理器teardown_class代码classTest:# 类级别的前置处理器defsetup_class(self):print(本类所有测试用例执行之前自动执行)# 类级别的后置处理器defteardown_class(self):print(本类所有测试用例执行之后自动执行)# 第一个方法第一个测试用例deftest_a(self):assert11# 第二个方法第二个测试用例deftest_b(self):assert12ok但是我们自动化测试框架主要使用pytest所以接下来我们就介绍pytest中的前后置。2、pytest固件风格注意固件就是我们是前置处理器和后置处理器说白了就是前置方法和后置方法。我们的pytest中固件的类型会比我们的unittest多一些。2.1 使用fixture实现前后置首先来认识两个单词fixture译为固定装置yield译为产量那么我们在pytest中是使用装饰器来实现前后置的首先我们定义一个函数然后给这个函数加上pytest.fixture()此时就给这个函数赋予了新的功能于是我们就在这个函数体中写前置代码和后置代码前后置代码使用yield分开。importpytestpytest.fixture()deftest_tan():# yield之前写前置代码print(用例之前执行)yield# yield之后写后置代码print(用例之后执行)然后怎么使用呢我们直接将test_tan这个方法引用作为参数传递到你需要执行我们的测试用例的参数中就行importpytestpytest.fixture()deftest_tan():# yield之前写前置代码print(用例之前执行)yield# yield之后写后置代码print(用例之后执行)classTest:# 第一个方法第一个测试用例deftest_a(self,test_tan):assert11# 第二个方法第二个测试用例deftest_b(self):assert12此时的结果如下我们了解了上述的一个流程我们可以知道我们的pytest不仅能够完美的代替unittest而且代码更加简洁方便灵活具有Python语法特色。可以知道pytest的固件风格fixture他的创建方式是一个函数使用装饰器来创建的pytest.fixture()使用一个生成器的关键字yield2.2 fixture的介绍2.2.1 fixture的源码deffixture(fixture_function:FixtureFunction|NoneNone,*,scope:_ScopeName|Callable[[str,Config],_ScopeName]function,params:Iterable[object]|NoneNone,autouse:boolFalse,ids:Sequence[object|None]|Callable[[Any],object|None]|NoneNone,name:str|NoneNone,)-FixtureFunctionMarker|FixtureFunctionDefinition:fixture这个方法里面有以下几个主要参数他是一个装饰器装饰器就是函数。fixture_function被装饰的函数scope共享范围级别主要有以下几个属性默认情况下是function级别function函数范围内都可以共享前后置(最小的级别一个函数就是一个测试用例)class类级范围内都可以共享前后置module模块范围内都可以共享前后置package包范围内都可以共享前后置session 全局范围内都可以共享前后置params、idsfixture的参数化(2.2.2有介绍)autousefixture的自动使用(2.2.3有介绍)namefixture的动态名称(2.2.4有介绍)比如pytest.fixture(scopeclass)# 修改为类级别deftest_tan():# yield之前写前置代码print(用例之前执行)yield# yield之后写后置代码print(用例之后执行)classTest:# 第一个方法第一个测试用例deftest_a(self,test_tan):assert11# 第二个方法第二个测试用例deftest_b(self,test_tan):assert122.2.2 fixture的参数化params此处我们就了解即可后续我们也会很少使用的因为他会让用例也被动的进行了参数化那么具体的效果如下importpytestpytest.fixture(params[1,2,3])deftest_tan():print(前置)yieldprint(后置)deftest_abc(test_tan):print(123)结果2.2.3 fixture自动使用autouse什么意思呢你使用fixture那么你就得调用如下所示那么现在问题来了如果我有几千个函数此时你是不是得每一个方法都要写这个函数参数呢或者说我以后不用fixture修饰的test_tan方法的时候那么以后我是不是就要一个一个方法的将以前调用的test_tan取出呢这个不灵活。所以为了我们的开闭原则我们就引入了autouse如下importpytestpytest.fixture(autouseTrue)deftest_tan():print(前置)yieldprint(后置)deftest_abc():print(123)2.2.4 fixture动态名称name其实这个动态名称就是我们的重命名具体例子如下所示importpytestpytest.fixture(namelisi)# 使用name参数进行重命名deftest_tan():print(前置)# 注意如果只想要我们是前置那么就不需要有yield# yield# print(后置)deftest_abc(lisi):# 此处使用的是重命名之后的函数引用print(123)2.3 fixture的跨文件使用首先看以下这个例子我们在test_a.py中的fixture在test_b.py中不允许被使用其实这个原因是我们的Python文件之间天然是有隔离的他们a文件中的东西如果不做特殊处理是不允许被b文件使用的。那么此时怎么办呢怎么解决呢其实我们的思路很简单我们可以对fixture进行统一的管理这个就是我们接下来要引出的知识点三、conftest 统一管理fixture现在的问题是我在test_a文件中写的fixture在我们的test_b文件中使用不了此时我们的解决办法就是找一个全局文件文件的名字必须是conftest.py。importpytestpytest.fixture(scopesession,autouseTrue)deftest_tan():print(前置)yieldprint(后置)如此一来我们的test_a.py文件中的测试用例和我们的test_b.py文件中的测试用例都可以共享我们的fixture了。注意事项conftest.py文件名是固定的不能修改也不能写错conftest.py中的fixture会自动的被pytest加载会自动的被任意一个文件中的用例使用。conftest.py并不是全局唯一的他可以在每一个目录中创建他遵循就近原则什么意思呢就是如果你的conftest.py中有我们的fixture,此时我们如果在test_a.py中也写了fixture那么他就会遵循就近原则使用我们test_a.py文件中的fixture还有一个种情况就是如果子目录中有conftest.py那么他就会就近的找这个文件即当前文件、同目录conftest、上级目录conftest、上上级目录conftest例子如下用例在执行的时候就近执行的优先级更高可能会混乱所以为了简单起见我们就做一个小小的约定所有的fixture定义在根目录的conftest中如此一来就可以统一的实现管理了。四、插件中的fixture我们上述介绍的fixture是pytest自带的框架的fixture那么其实我们有些插件也是带了fixture的pytest-base-url这个插件提供了一个base_url的fixture这个fixture的内容可以进行灵活的设置fixture他的用法相对简单和固定。怎么使用首先如果你没有安装我们的pytest-base-url插件那么就使用pip install pytest-base-url进行安装。你安装完毕之后那么此时我们这个插件就自己带有一个fixture大概源码是如下所示的pytest.fixture(scopesession)defbase_url(config): Fixture which returns the base URL used for functional testing of a web application or service. try:returnconfig.option.base_urlexceptAttributeError:returnconfig.getoption(--base-url)那么你想使用这个fixture就只需要将这个base_url引用传递给你需要的测试用例即可。接下来看这个base_url的方法有返回值他的返回值是把配置文件中的base_url内容动态的传递到用例中。比如我们的配置文件如下# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# 配置命令行参数 -v 就是我们在执行的时候 实际是 pytest -v 他会打印出比较详细的信息addopts-vs# 注册标记按行一行一个标记markerssmoke:冒烟测试 usermanger:用户管理 api:接口用例 ut:单元测试用例 base_urlhttps://www.baidu.com然后我们就使用这个fixtureclassTest:deftest_a(self,base_url):# 打印我们的base_urlprint(base_url)从本质上看我们的pytest-base-url的插件实现了一种效果把配置文件中的内容动态的传递到用例中。五、pytest的运行过程我们pytest的运行过程启动框架:调用pytest中的main方法或者就是直接使用我们的命令行pytest 参数pytest去读取我们的配置文件pytest.ini里面有我们的参数、标记、配置。加载我们的conftest.py文件中的fixture和hook加载我们的test_*.py文件中的测试用例六、Allure的企业级测试报告我们上一期介绍了一个测试报告就是我们的pytest-html但是这个插件生成的测试报告不好看所以我们本期就介绍Allure企业级测试报告。Allure是一个测试报告框架他可以去生成精美的、企业级的、可扩展的html测试报告。同时Allure是一个Java程序所以意味着我们使用Allure的时候得有Java运行环境。我们Allure的学习目标搭建Allure的运行环境生成Allure的测试报告Allure的常用命令Allure报告的企业级定制1、搭建Allure的环境配置首先得有JDK他是Java的运行环境安装Allure下载https://github.com/allure-framework/allure2/releases选择压缩包下载然后解压配置环境变量将\bin所在的目录路径设置环境变量验证allureAllure详细的环境配置可参考博客看Allure环境配置部分即可2、生成Allure的测试报告生成Allure的测试报告的过程执行用例使用我们的pytest框架来执行用例生成Allure报告的执行数据这个功能使用allure-pytest插件完成生成Allure的测试报告这个功能由我们的Allure完成总结pytest----allure-pytest----allureOK那么知道执行过程之后我们怎么去实现呢第一点你要知道我们执行测试用例使用的是pytest框架那么启动这个框架有多种方式其中我们使用的是调用pytest中main方法的方式那么一旦启动这个main方法之后他就会去读取我们的配置文件此时我们会在配置文件中将我们pytest执行的参数配置上。# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# -vs: -v代表的是我们执行结果会输出比较详细的信息 -s代表的是允许我们的输入输出执行addopts-vs然后我们怎么去生成allure测试报告的执行数据呢就是说你pytest执行测试用例之后有结果数据我怎么将这个结果数据变为allure看得懂的数据呢首先你得有allure-pytest插件然后我们得在配置文件中为我们的pytest框架执行的时候配置一个命令行参数--alluredir./temps和--clean-alluredir代表的是我将测试用例执行之后的结果数据变为allure看得懂的执行数据之后我将这个allure报告的执行数据存在我们的temps目录下同时如果该目录下有我们的原来数据那么我们就得将数据删除从而得到我们的全新的干净的数据。# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# -vs: -v代表的是我们执行结果会输出比较详细的信息 -s代表的是允许我们的输入输出执行# --alluredir./temps : allure的执行数据的目录# --clean-alluredir: 将allure的执行数据的目录中旧数据删除addopts-vs--alluredir./temps--clean-alluredir最后我们生成allure报告怎么做呢你看我们说启动框架我们使用的是pytest中的main方法pytest.main()那么这一行代码经过我们上述的配置文件的配置之后他做了这些事加载插件执行用例得到allure报告的执行数据。现在我们已经有allure数据了那么现在我们唯一却的就是这么生成allure报告了怎么做呢我们导入 os 模块让他执行我们的系统命令os.system(allure generate ./temps -o ./reporst --clean)使用这个os好比就是你在cmd中直接操作一样的完成之前两步的代码importpytest# 导入我们的pytestpytest.main()# 启动我们的测试框架: 加载插件、执行测试用例、生成allure报告生成allure报告的代码importpytest# 导入我们的pytestimportos# 导入我们的os可以执行系统命令好比就在我们的cmd操作一样pytest.main()# 启动我们的测试框架: 加载插件、执行测试用例、生成allure报告os.system(allure generate ./temps -o ./reports --clean)# 根据数据生成报告allure调用allure 命令行工具作用生成 Allure 测试报告generate固定子命令意思生成报告./temps./当前目录temps存放 allure 临时 json 数据的文件夹这个要和什么上述配置文件中配置的allure的执行数据路径要一致。意思从./temps文件夹读取测试结果数据-o ./reports-ooutput 输出目录./reports 要把最终 HTML 报告生成到这个文件夹意思把报告输出到./reports文件夹–clean意思生成前清空旧的报告文件夹不加的话旧报告不会删可能冲突加了最安全最后我们就直接运行即可报告结果如何切换语言为中文3、Allure的常用命令allure generate生成报告allure serve展示报告allure open打开已存在的报告allure plugin展示插件注意serve generate open4、Allure报告的企业级定制4.1 logo定制4.1.1 启用插件你要定制自己的loge那么你的allure框架得有这个logo插件首先我们使用allure plugin看一下有哪些插件到底有没有我们想要的自定义logo的插件里面没有我们的自定义logo插件那么此时我们就怎么办呢我们就吧这个插件加上找到我们的allure安装目录中的\plugins目录复制我们的自定义插件名custom-logo-plugin接下来在我们的allure安装目录下有一个config目录下打开config.yml在最后添加插件plugins:-junit-xml-plugin-xunit-xml-plugin-trx-plugin-behaviors-plugin-packages-plugin-screen-diff-plugin-xctest-plugin-jira-plugin-xray-plugin-custom-logo-plugin# 新增自定义插件此时我们就重新运行我们的测试用例然后打开测试报告4.1.2 配置插件那么我们打开自定义插件的目录他里面就一个logo文件和一个css样式文件所以我们自定义的时候就做两件事情创建一个logo的文件修改CSS文件将css修改为如下所示.side-nav__brand{background:url(tan.jpg)no-repeat left center!important;margin-left:22px;height:90px;background-size:contain!important;}.side-nav__brand-text{display:none;}.node__parameters{display:none;}4.2 内容定制内容定制的本质是对执行结果惊喜标注和分组内容定制的方式通过装饰器来添加不同的标注内容标注的内容具体有以下几种epic史诗也就是项目名称feature特性也就是我们模块的名称story故事也就是我们场景、接口的名称title标题也就是我们用例的名称装饰器allure.上述的标注内容(描述)步骤with allure.step(步骤描述)例如importallure# 轻聊 - 用户管理模块 - 登录接口 成功用例allure.epic([项目名称]轻聊)allure.feature([模块名称]用户管理模块)allure.story([接口名称]登录接口)allure.title([用例名称]登录用例-成功)deftest_login_success():# 登录接口测试步骤withallure.step(1. 构造登录请求参数):pass# 写具体步骤的代码withallure.step(2. 发送登录接口请求):pass# 写具体步骤的代码withallure.step(3. 校验登录返回结果):pass# 写具体步骤的代码# 企悦抽 - 奖品管理模块 - 上传奖品 成功用例allure.epic([项目名称]企悦抽)allure.feature([模块名称]奖品管理模块)allure.story([接口名称]上传奖品接口)allure.title([用例名称]上传奖品用例-成功)deftest_upload_prize_success():withallure.step(1. 启动浏览器):pass# 写具体步骤的代码withallure.step(2. 登录账号):pass# 写具体步骤的代码withallure.step(3. 进入奖品管理界面):pass# 写具体步骤的代码withallure.step(4. 上传奖品数据):# 正常测试用例断言改为正确逻辑assertTrue此时执行测试用例之后打开我们的报告然后在我们的【功能】中打开首先我们的分组就很明确其次我们的用例执行的步骤也体现出来了OK那么老铁们我们本期就到这里就结束了笔记整理不易如果对你有帮助点赞加关注我们下期见~
【接口自动化】02-Pytest固件fixture核心机制与Allure企业级报告实战
文章目录一、前言二、pytest固件1、什么是固件1.1 unittest风格的固件1.1.1 每一个测试用例(方法)加前后置1.1.2 每一个测试类加前后置2、pytest固件风格2.1 使用fixture实现前后置2.2 fixture的介绍2.2.1 fixture的源码2.2.2 fixture的参数化params2.2.3 fixture自动使用autouse2.2.4 fixture动态名称name2.3 fixture的跨文件使用三、conftest 统一管理fixture四、插件中的fixture五、pytest的运行过程六、Allure的企业级测试报告1、搭建Allure的环境配置2、生成Allure的测试报告3、Allure的常用命令4、Allure报告的企业级定制4.1 logo定制4.1.1 启用插件4.1.2 配置插件4.2 内容定制一、前言本文带你系统掌握Pytest的两大核心能力固件fixture与Allure报告。从unittest风格的前后置开始逐步深入到fixture的灵活用法、conftest统一管理、插件集成再到企业级Allure报告的搭建与定制。内容实用、节奏友好帮你轻松写出更规范的自动化测试框架。二、pytest固件1、什么是固件我们当初在学习jmeter接口测试的时候我们可以在取样器的执行之前和取样器的执行之后做一些事情。那么这个固件大概就是这样的一个意思我们更多的名字是叫他前后置在我们的pytest中我们测试用例的执行之前以及测试用例的执行之后自动执行的方法1.1 unittest风格的固件1.1.1 每一个测试用例(方法)加前后置现在我们有这样的一个需求需要在一个在每一个测试用例之前和每一个测试用例执行之后去自动执行一些方法代码classTest:# 第一个方法第一个测试用例deftest_a(self):assert11# 第二个方法第二个测试用例deftest_b(self):assert12那么现在我要写一个main文件里面调用pytest的main方法就可以启动pytest框架那么接下在我们项目的根目录下新建一个配置文件pytest.ini那么这样之后我们就可以在配置文件中输入我们的pytest执行参数这样我们就在启动main方法的时候启动pytest然后pytest就会读取这个配置文件然后将执行的时候就会带上里面的参数比如-v 那么就会打印出详细的信息# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# 配置命令行参数 -v 就是我们在执行的时候 实际是 pytest -v 他会打印出比较详细的信息addopts-vsOK此时我们去执行执行结果如我们所料目前没有前后置上述有两个测试用例OK现在我们会在每一个测试用例之前添加前后置所谓的前后置就是执行这个用例之前要自己做的事情以及执行完这个用例之后要做的事情unittest 方法级别前置处理器setup_methodunittest 方法级别后置处理器teardown_methodclassTest:# 方法级别的前置处理器defsetup_method(self):print(每一个测试用例执行之前自动执行)# 方法级别的后置处理器defteardown_method(self):print(每一个测试用例执行之后自动执行)# 第一个方法第一个测试用例deftest_a(self):assert11# 第二个方法第二个测试用例deftest_b(self):assert12ok那么此时你就看结果1.1.2 每一个测试类加前后置unittest 类级别前置处理器setup_classunittest 累级别后置处理器teardown_class代码classTest:# 类级别的前置处理器defsetup_class(self):print(本类所有测试用例执行之前自动执行)# 类级别的后置处理器defteardown_class(self):print(本类所有测试用例执行之后自动执行)# 第一个方法第一个测试用例deftest_a(self):assert11# 第二个方法第二个测试用例deftest_b(self):assert12ok但是我们自动化测试框架主要使用pytest所以接下来我们就介绍pytest中的前后置。2、pytest固件风格注意固件就是我们是前置处理器和后置处理器说白了就是前置方法和后置方法。我们的pytest中固件的类型会比我们的unittest多一些。2.1 使用fixture实现前后置首先来认识两个单词fixture译为固定装置yield译为产量那么我们在pytest中是使用装饰器来实现前后置的首先我们定义一个函数然后给这个函数加上pytest.fixture()此时就给这个函数赋予了新的功能于是我们就在这个函数体中写前置代码和后置代码前后置代码使用yield分开。importpytestpytest.fixture()deftest_tan():# yield之前写前置代码print(用例之前执行)yield# yield之后写后置代码print(用例之后执行)然后怎么使用呢我们直接将test_tan这个方法引用作为参数传递到你需要执行我们的测试用例的参数中就行importpytestpytest.fixture()deftest_tan():# yield之前写前置代码print(用例之前执行)yield# yield之后写后置代码print(用例之后执行)classTest:# 第一个方法第一个测试用例deftest_a(self,test_tan):assert11# 第二个方法第二个测试用例deftest_b(self):assert12此时的结果如下我们了解了上述的一个流程我们可以知道我们的pytest不仅能够完美的代替unittest而且代码更加简洁方便灵活具有Python语法特色。可以知道pytest的固件风格fixture他的创建方式是一个函数使用装饰器来创建的pytest.fixture()使用一个生成器的关键字yield2.2 fixture的介绍2.2.1 fixture的源码deffixture(fixture_function:FixtureFunction|NoneNone,*,scope:_ScopeName|Callable[[str,Config],_ScopeName]function,params:Iterable[object]|NoneNone,autouse:boolFalse,ids:Sequence[object|None]|Callable[[Any],object|None]|NoneNone,name:str|NoneNone,)-FixtureFunctionMarker|FixtureFunctionDefinition:fixture这个方法里面有以下几个主要参数他是一个装饰器装饰器就是函数。fixture_function被装饰的函数scope共享范围级别主要有以下几个属性默认情况下是function级别function函数范围内都可以共享前后置(最小的级别一个函数就是一个测试用例)class类级范围内都可以共享前后置module模块范围内都可以共享前后置package包范围内都可以共享前后置session 全局范围内都可以共享前后置params、idsfixture的参数化(2.2.2有介绍)autousefixture的自动使用(2.2.3有介绍)namefixture的动态名称(2.2.4有介绍)比如pytest.fixture(scopeclass)# 修改为类级别deftest_tan():# yield之前写前置代码print(用例之前执行)yield# yield之后写后置代码print(用例之后执行)classTest:# 第一个方法第一个测试用例deftest_a(self,test_tan):assert11# 第二个方法第二个测试用例deftest_b(self,test_tan):assert122.2.2 fixture的参数化params此处我们就了解即可后续我们也会很少使用的因为他会让用例也被动的进行了参数化那么具体的效果如下importpytestpytest.fixture(params[1,2,3])deftest_tan():print(前置)yieldprint(后置)deftest_abc(test_tan):print(123)结果2.2.3 fixture自动使用autouse什么意思呢你使用fixture那么你就得调用如下所示那么现在问题来了如果我有几千个函数此时你是不是得每一个方法都要写这个函数参数呢或者说我以后不用fixture修饰的test_tan方法的时候那么以后我是不是就要一个一个方法的将以前调用的test_tan取出呢这个不灵活。所以为了我们的开闭原则我们就引入了autouse如下importpytestpytest.fixture(autouseTrue)deftest_tan():print(前置)yieldprint(后置)deftest_abc():print(123)2.2.4 fixture动态名称name其实这个动态名称就是我们的重命名具体例子如下所示importpytestpytest.fixture(namelisi)# 使用name参数进行重命名deftest_tan():print(前置)# 注意如果只想要我们是前置那么就不需要有yield# yield# print(后置)deftest_abc(lisi):# 此处使用的是重命名之后的函数引用print(123)2.3 fixture的跨文件使用首先看以下这个例子我们在test_a.py中的fixture在test_b.py中不允许被使用其实这个原因是我们的Python文件之间天然是有隔离的他们a文件中的东西如果不做特殊处理是不允许被b文件使用的。那么此时怎么办呢怎么解决呢其实我们的思路很简单我们可以对fixture进行统一的管理这个就是我们接下来要引出的知识点三、conftest 统一管理fixture现在的问题是我在test_a文件中写的fixture在我们的test_b文件中使用不了此时我们的解决办法就是找一个全局文件文件的名字必须是conftest.py。importpytestpytest.fixture(scopesession,autouseTrue)deftest_tan():print(前置)yieldprint(后置)如此一来我们的test_a.py文件中的测试用例和我们的test_b.py文件中的测试用例都可以共享我们的fixture了。注意事项conftest.py文件名是固定的不能修改也不能写错conftest.py中的fixture会自动的被pytest加载会自动的被任意一个文件中的用例使用。conftest.py并不是全局唯一的他可以在每一个目录中创建他遵循就近原则什么意思呢就是如果你的conftest.py中有我们的fixture,此时我们如果在test_a.py中也写了fixture那么他就会遵循就近原则使用我们test_a.py文件中的fixture还有一个种情况就是如果子目录中有conftest.py那么他就会就近的找这个文件即当前文件、同目录conftest、上级目录conftest、上上级目录conftest例子如下用例在执行的时候就近执行的优先级更高可能会混乱所以为了简单起见我们就做一个小小的约定所有的fixture定义在根目录的conftest中如此一来就可以统一的实现管理了。四、插件中的fixture我们上述介绍的fixture是pytest自带的框架的fixture那么其实我们有些插件也是带了fixture的pytest-base-url这个插件提供了一个base_url的fixture这个fixture的内容可以进行灵活的设置fixture他的用法相对简单和固定。怎么使用首先如果你没有安装我们的pytest-base-url插件那么就使用pip install pytest-base-url进行安装。你安装完毕之后那么此时我们这个插件就自己带有一个fixture大概源码是如下所示的pytest.fixture(scopesession)defbase_url(config): Fixture which returns the base URL used for functional testing of a web application or service. try:returnconfig.option.base_urlexceptAttributeError:returnconfig.getoption(--base-url)那么你想使用这个fixture就只需要将这个base_url引用传递给你需要的测试用例即可。接下来看这个base_url的方法有返回值他的返回值是把配置文件中的base_url内容动态的传递到用例中。比如我们的配置文件如下# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# 配置命令行参数 -v 就是我们在执行的时候 实际是 pytest -v 他会打印出比较详细的信息addopts-vs# 注册标记按行一行一个标记markerssmoke:冒烟测试 usermanger:用户管理 api:接口用例 ut:单元测试用例 base_urlhttps://www.baidu.com然后我们就使用这个fixtureclassTest:deftest_a(self,base_url):# 打印我们的base_urlprint(base_url)从本质上看我们的pytest-base-url的插件实现了一种效果把配置文件中的内容动态的传递到用例中。五、pytest的运行过程我们pytest的运行过程启动框架:调用pytest中的main方法或者就是直接使用我们的命令行pytest 参数pytest去读取我们的配置文件pytest.ini里面有我们的参数、标记、配置。加载我们的conftest.py文件中的fixture和hook加载我们的test_*.py文件中的测试用例六、Allure的企业级测试报告我们上一期介绍了一个测试报告就是我们的pytest-html但是这个插件生成的测试报告不好看所以我们本期就介绍Allure企业级测试报告。Allure是一个测试报告框架他可以去生成精美的、企业级的、可扩展的html测试报告。同时Allure是一个Java程序所以意味着我们使用Allure的时候得有Java运行环境。我们Allure的学习目标搭建Allure的运行环境生成Allure的测试报告Allure的常用命令Allure报告的企业级定制1、搭建Allure的环境配置首先得有JDK他是Java的运行环境安装Allure下载https://github.com/allure-framework/allure2/releases选择压缩包下载然后解压配置环境变量将\bin所在的目录路径设置环境变量验证allureAllure详细的环境配置可参考博客看Allure环境配置部分即可2、生成Allure的测试报告生成Allure的测试报告的过程执行用例使用我们的pytest框架来执行用例生成Allure报告的执行数据这个功能使用allure-pytest插件完成生成Allure的测试报告这个功能由我们的Allure完成总结pytest----allure-pytest----allureOK那么知道执行过程之后我们怎么去实现呢第一点你要知道我们执行测试用例使用的是pytest框架那么启动这个框架有多种方式其中我们使用的是调用pytest中main方法的方式那么一旦启动这个main方法之后他就会去读取我们的配置文件此时我们会在配置文件中将我们pytest执行的参数配置上。# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# -vs: -v代表的是我们执行结果会输出比较详细的信息 -s代表的是允许我们的输入输出执行addopts-vs然后我们怎么去生成allure测试报告的执行数据呢就是说你pytest执行测试用例之后有结果数据我怎么将这个结果数据变为allure看得懂的数据呢首先你得有allure-pytest插件然后我们得在配置文件中为我们的pytest框架执行的时候配置一个命令行参数--alluredir./temps和--clean-alluredir代表的是我将测试用例执行之后的结果数据变为allure看得懂的执行数据之后我将这个allure报告的执行数据存在我们的temps目录下同时如果该目录下有我们的原来数据那么我们就得将数据删除从而得到我们的全新的干净的数据。# 节[pytest]使用pytest的时候会读取这个配置文件[pytest]# -vs: -v代表的是我们执行结果会输出比较详细的信息 -s代表的是允许我们的输入输出执行# --alluredir./temps : allure的执行数据的目录# --clean-alluredir: 将allure的执行数据的目录中旧数据删除addopts-vs--alluredir./temps--clean-alluredir最后我们生成allure报告怎么做呢你看我们说启动框架我们使用的是pytest中的main方法pytest.main()那么这一行代码经过我们上述的配置文件的配置之后他做了这些事加载插件执行用例得到allure报告的执行数据。现在我们已经有allure数据了那么现在我们唯一却的就是这么生成allure报告了怎么做呢我们导入 os 模块让他执行我们的系统命令os.system(allure generate ./temps -o ./reporst --clean)使用这个os好比就是你在cmd中直接操作一样的完成之前两步的代码importpytest# 导入我们的pytestpytest.main()# 启动我们的测试框架: 加载插件、执行测试用例、生成allure报告生成allure报告的代码importpytest# 导入我们的pytestimportos# 导入我们的os可以执行系统命令好比就在我们的cmd操作一样pytest.main()# 启动我们的测试框架: 加载插件、执行测试用例、生成allure报告os.system(allure generate ./temps -o ./reports --clean)# 根据数据生成报告allure调用allure 命令行工具作用生成 Allure 测试报告generate固定子命令意思生成报告./temps./当前目录temps存放 allure 临时 json 数据的文件夹这个要和什么上述配置文件中配置的allure的执行数据路径要一致。意思从./temps文件夹读取测试结果数据-o ./reports-ooutput 输出目录./reports 要把最终 HTML 报告生成到这个文件夹意思把报告输出到./reports文件夹–clean意思生成前清空旧的报告文件夹不加的话旧报告不会删可能冲突加了最安全最后我们就直接运行即可报告结果如何切换语言为中文3、Allure的常用命令allure generate生成报告allure serve展示报告allure open打开已存在的报告allure plugin展示插件注意serve generate open4、Allure报告的企业级定制4.1 logo定制4.1.1 启用插件你要定制自己的loge那么你的allure框架得有这个logo插件首先我们使用allure plugin看一下有哪些插件到底有没有我们想要的自定义logo的插件里面没有我们的自定义logo插件那么此时我们就怎么办呢我们就吧这个插件加上找到我们的allure安装目录中的\plugins目录复制我们的自定义插件名custom-logo-plugin接下来在我们的allure安装目录下有一个config目录下打开config.yml在最后添加插件plugins:-junit-xml-plugin-xunit-xml-plugin-trx-plugin-behaviors-plugin-packages-plugin-screen-diff-plugin-xctest-plugin-jira-plugin-xray-plugin-custom-logo-plugin# 新增自定义插件此时我们就重新运行我们的测试用例然后打开测试报告4.1.2 配置插件那么我们打开自定义插件的目录他里面就一个logo文件和一个css样式文件所以我们自定义的时候就做两件事情创建一个logo的文件修改CSS文件将css修改为如下所示.side-nav__brand{background:url(tan.jpg)no-repeat left center!important;margin-left:22px;height:90px;background-size:contain!important;}.side-nav__brand-text{display:none;}.node__parameters{display:none;}4.2 内容定制内容定制的本质是对执行结果惊喜标注和分组内容定制的方式通过装饰器来添加不同的标注内容标注的内容具体有以下几种epic史诗也就是项目名称feature特性也就是我们模块的名称story故事也就是我们场景、接口的名称title标题也就是我们用例的名称装饰器allure.上述的标注内容(描述)步骤with allure.step(步骤描述)例如importallure# 轻聊 - 用户管理模块 - 登录接口 成功用例allure.epic([项目名称]轻聊)allure.feature([模块名称]用户管理模块)allure.story([接口名称]登录接口)allure.title([用例名称]登录用例-成功)deftest_login_success():# 登录接口测试步骤withallure.step(1. 构造登录请求参数):pass# 写具体步骤的代码withallure.step(2. 发送登录接口请求):pass# 写具体步骤的代码withallure.step(3. 校验登录返回结果):pass# 写具体步骤的代码# 企悦抽 - 奖品管理模块 - 上传奖品 成功用例allure.epic([项目名称]企悦抽)allure.feature([模块名称]奖品管理模块)allure.story([接口名称]上传奖品接口)allure.title([用例名称]上传奖品用例-成功)deftest_upload_prize_success():withallure.step(1. 启动浏览器):pass# 写具体步骤的代码withallure.step(2. 登录账号):pass# 写具体步骤的代码withallure.step(3. 进入奖品管理界面):pass# 写具体步骤的代码withallure.step(4. 上传奖品数据):# 正常测试用例断言改为正确逻辑assertTrue此时执行测试用例之后打开我们的报告然后在我们的【功能】中打开首先我们的分组就很明确其次我们的用例执行的步骤也体现出来了OK那么老铁们我们本期就到这里就结束了笔记整理不易如果对你有帮助点赞加关注我们下期见~