一.简介

pytest的自带功能很强大,通过添加插件可以扩展功能,pytest的代码结构适合定制和扩展插件,

可以借助hook函数来实现。

把fixture函数或者hook函数添加到conftest文件里,就已经创建了一个本地的conftest插件!

二.pytest plugin加载的几种方式:

1.内置plugins:从代码内部的_pytest目录加载;

2.外部插件(第三方插件):通过setuptools entry points机制发现的第三方插件模块;

推荐的第三方的pytest的插件:https://docs.pytest.org/en/latest/plugins.html

3.conftest.py形式的本地插件:测试目录下的自动模块发现机制

通过pytest --trace-config命令可以查看当前pytest中所有的plugin。

在pytest中,所谓plugin其实就是能被pytest发现的一些带有pytest hook方法的文件或对象。

三.What is a hook

要理解pytest hook,首先要知道什么是hook方法(钩子函数)。

这里举一个简单的例子,比如说你写了一个框架类的程序,然后你希望这个框架可以“被代码注入”,即别人可以加入代码对你这个框架进行定制化,该如何做比较好?一种很常见的方式就是约定一个规则,框架初始化时会收集满足这个规则的所有代码(文件),然后把这些代码加入到框架中来,在执行时一并执行即可。所有这一规则下可以被框架收集到的方法就是hook方法。

四.编写自己的插件

插件可以改变pytest行为,可用的hook函数很多,详细的定义:

http://doc.pytest.org/en/latest/_modules/_pytest/hookspec.html

1.pytest_addoption为例,基本每个pytest plugin都会有这个hook方法,它的作用是为pytest命令行添加自定义的参数。

parser:用户命令行参数与ini文件值的解析器

def pytest_addoption(parser):parser.addoption("--env",    ##注册一个命令行选项default="test",dest="env",help="set test run env")

pytest_addoption: Hook function, 这里创建了一个argparser的group,通过addoption方法添加option,使得显示help信息时相关option显示在一个group下面,更加友好。

命令行输入:

pytest --help 就可以看到

2.修改pytest_collection_modifyitems

能解决什么实际问题?

测试case中 case名字为中文时,显示的时乱码!

完成所有测试项的收集后,pytest调用的钩子

def pytest_collection_modifyitems(items):"""测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上
所有的测试用例收集完毕后调用, 可以再次过滤或者对它们重新排序items (收集的测试项目列表)"""for item in items:item.name = item.name.encode("utf-8").decode("unicode_escape")item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape") 

3.可以实现自己的自定义动态参数化方案或扩展

def pytest_generate_tests(metafunc):#""" generate (multiple) parametrized calls to a test function."""if "param" in metafunc.fixturenames:metafunc.parametrize("param",metafunc.module.par_to_test,ids=metafunc.module.case, scope="function")

然后测试用例的编写如下:

import pytest
import requestsfrom utils.get_data import get_data_path
from utils.get_data import get_test_data
import logging
case,par_to_test = get_test_data(get_data_path(__file__))class TestFixture3(object):""""""def test_fixture_3(self,param,env):url= env["host"]["local"]+env["APIS"]["add_message"]response = requests.request("POST", url, data=param[3], headers=param[1])res = response.json()print(res)

测试数据:

{"test": [{"case": "这是第一个测试用例","headers": {"Content-Type": "application/x-www-form-urlencoded"},"querystring": {},"payload": {"mid" :"115","name" :"android9","content" : "8" ,"status": "1","author" :"xixi"},"expected":{
}},{"case": "这是第2个测试用例","headers": {"Content-Type": "application/x-www-form-urlencoded"},"querystring": {},"payload": {"mid" :"115","name" :"android9","content" : "8" ,"status": "1","author" :"xixi"},"expected":{
}},{"case": "这是第3个测试用例","headers": {"Content-Type": "application/x-www-form-urlencoded"},"querystring": {},"payload": {"mid" :"115","name" :"android9","content" : "8" ,"status": "1","author" :"xixi"},"expected":{
}}]
}

获取测试数据的代码:

def get_data_path(case_path):file_name = os.path.dirname(case_path).split(os.sep + 'tests' + os.sep, 1)test_data = os.sep.join([file_name[0], 'data', file_name[1], os.path.basename(case_path).replace('.py', '.json')])return test_datadef get_test_data(test_data_path):case = []headers = []querystring = []payload = []expected = []with open(test_data_path,encoding='utf-8') as f:dat = json.loads(f.read())test = dat['test']for td in test:case.append(td['case'])headers.append(td.get('headers', {}))querystring.append(td.get('querystring', {}))payload.append(td.get('payload', {}))expected.append(td.get('expected', {}))list_parameters = list(zip(case, headers, querystring, payload, expected))return case,list_parameters

五.Conclusion

pytest通过这种plugin的方式,大大增强了这个测试框架的实用性,可以看到pytest本身的许多组件也是通过plugin的方式加载的,可以说pytest就是由许许多多个plugin组成的。另外,通过定义好一些hook spec,可以有效地控制plugin的“权限”,再通过类似pytest.hookimpl这样的装饰器又可以增强了各种plugin的“权限”。这种design对于pytest这样复杂的框架而言无疑是非常重要的,这可能也是pytest相比于其他测试框架中越来越?的原因吧。

pytest测试框架4-插件与hook函数相关推荐

  1. Pytest 测试框架——数据驱动

    引言 前面已经和大家介绍过 Unittest 测试框架的数据驱动框架 DDT,以及其实现原理.今天和大家分享的是 Pytest 测试框架的数据驱动,Pytest 测试框架的数据驱动是由 pytest ...

  2. Pytest测试框架(二):pytest 的setup/teardown方法

    系列文章目录 Pytest测试框架(一):pytest安装及用例执行 Pytest测试框架(二):pytest 的setup/teardown方法 Pytest测试框架(三):pytest fixtu ...

  3. Python编程必不可少的pytest测试框架

    进行编程测试重要的是为了更高效的完成功能的实现. pytest是基于unittest实现的第三方测试框架,比 unittest 更加的简洁.高效,并且可以完美兼容 unittest 的测试代码,无需对 ...

  4. Pytest测试框架(五):pytest + allure生成测试报告

    系列文章目录 Pytest测试框架(一):pytest安装及用例执行 Pytest测试框架(二):pytest 的setup/teardown方法 Pytest测试框架(三):pytest fixtu ...

  5. Pytest测试框架中,setup和teardown函数的作用及使用方法

    作为一名Python开发人员,您一定知道Pytest是一个广泛使用的Python测试框架. 它具有易用性和灵活性,可以帮助您快速编写测试用例,并且能够支持包括单元测试.集成测试.功能测试等多种测试类型 ...

  6. pytest测试框架_带你深入理解自动化测试框架Pytest的配置文件!

    都有哪些种类的配置文件 pytest.ini:pytest的主配置文件,可以改变pytest的默认行为 conftest.py:是本地插件库,其中的hook函数和fixture将作用于该文件所在的目录 ...

  7. Pytest系列——allure(原理)之allure工具与Pytest测试框架集成

    官方介绍 1.Allure Framework是一种灵活的轻量级多语言测试报告工具,不仅可以以简洁的Web报告形式非常简洁地显示已测试的内容,也允许参与开发过程的每个人从日常测试中提取最大程度的有用信 ...

  8. pytest测试框架_聊聊 Python 的单元测试框架(三):最火的 pytest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 一.介绍 本篇文章是<聊聊 Python 的单元测试框架>的第三篇,前两篇分别介绍了标准库 unittes ...

  9. Pytest测试框架的基本使用和allure测试报告

    一.测试用例的识别与运行 目录识别 通过pytest.ini配置文件配置 如果未指定任何参数,则收集从testpaths(如已配置)或当前目录开始.另外,命令行参数可以在目录.文件名或节点ID的任何组 ...

最新文章

  1. 深圳速度!这所筹建中的大学,迎来首任“掌门人”!
  2. SpringBoot中使用@Mapper注解需要哪个包
  3. 替代CATIA查看stp/step格式模型免费软件推荐
  4. mindoc mysql_MinDoc 配置文件详解
  5. 第一个成功复制小米粉丝营销的屌丝案例
  6. flink如何设置以每天零点到第二天零点为区间的window进行计算
  7. Rk3288 android USB双摄像头录制视频
  8. 二分法(Bisection)求解单根(python,数值积分)
  9. Python爬虫技巧--selenium解除webdriver特征值
  10. IntelliJ IDEA 必知技巧(持续更新)
  11. 内嵌汇编(ARM64)
  12. android 聊天气泡背景图片,关于实现微信聊天气泡里显示图片
  13. vscode编译Window c++程序缺少vc运行库解决方法
  14. 在houdini中旋转某条曲线上多个点的法线方法(vop方法)
  15. Got permission denied while trying to connect to the Docker报错排障
  16. mysql组合索引没效果的原因
  17. 【计算机组成原理】=【考研复试面试题】- 整合全家桶
  18. 对话 H3C CloudCell 云业务单元一体机-张栋(CloudCell)
  19. glob通配及IO重定向 笔记
  20. 在学uiautomation(以微信进入大学习为例)

热门文章

  1. PostgreSQL在Linux上的RPM和源码安装
  2. pg数据库有雷锋?用户已有权限为何无故消失?
  3. 大数据集群被窃取数据怎么办?透明加密可以一试
  4. 用IoT放羊养牛,不出门也能知道它们的动向
  5. 鸿蒙轻内核源码分析:掌握信号量使用差异
  6. CloudIDE插件在手,按时下班不愁
  7. 【华为云技术分享】云图说丨初识标签管理服务:给你的云资源贴个条
  8. 用生动的案例一步步带你学会python多线程模块
  9. 【华为云技术分享】《跟唐老师学习云网络》 - Tcpdump大杀器抓包
  10. 聊城市计算机专业,聊城市关于2018年下半年计算机技术与软件专业技术资格(水平)考试考务工作有关问题的通知...