在上一篇的 hooks 函数分享中,开发了一个本地插件示例,其实已经算是在编写插件了。今天继续跟着官方文档学习更多知识点。

一个插件包含一个或多个钩子函数,pytest 正是通过调用各种钩子组成的插件,实现了配置、搜集、运行和报告的所有方面的功能。

通常 pytes t中的插件有如下 3 类:

  • 内置插件 : 从 pytest 内部的_pytest目录加载
  • 外部插件 : 通过setuptools入口发现的模块
  • conftest.py: 在测试目录中自动发现的模块

第一个内置插件的路径在/Lib/site-packages/_pytest这里,有兴趣的可以看下。

第三个conftest.py我们也很熟悉了,像之前写fixture函数以及本地hooks函数插件,都是在conftest.py中。

第二个外部插件中提到的setuptools是什么呢?

其实这是 pytest 的一个特性库,通过这个setuptools,我们的插件代码可以通过pip安装并上传到PyPI。

本章就来开发一个可以 pip 安装的第三方插件

一、cookiecutter-pytest-plugin

但是在开发之前,先来了解下cookiecutter-pytest-plugin这个项目。这是官方文档中强烈推荐的,可以帮助我们快速生成一个规范标准的插件项目。

项目地址:https://github.com/pytest-dev/cookiecutter-pytest-plugin

跟着项目介绍的文档一步步来就行。

先安装该项目:

$ pip install cookiecutter

然后可以使用这个工具开始创建我们自己的插件项目了。

$ cookiecutter https://github.com/pytest-dev/cookiecutter-pytest-plugin

一步步跟着出现的指令提示,输入对应的项目信息即可。

最后的输入的一个测试插件项目是这样的。

二、开发第三方插件

重新写一个插件,可以通过命令行,来输出搜集到的测试用例的相关信息并保存到csv文件中去。

可以直接在上面生成好的插件项目模板里写我们自己的代码。

  • 红色文件,就是我们插件代码的主体部分
  • 绿色部分,是我们自测插件代码的地方

最后还有个重要文件setup.py,因为插件模板项目自动生成了,里面就是插件项目的相关信息,以及依赖。

1. 插件主体代码

import pytest
import csv
import re pytest_plugins = 'pytester' def pytest_addoption(parser):
group = parser.getgroup("testplan")
group.addoption("--testplan",
action="store",
default=None,
help="生成包含测试元数据的CSV并退出,而不运行测试"
) def pytest_collection_modifyitems(session, config, items):
path = config.getoption('testplan')
if path:
with open(path, mode='w') as fd:
writer = csv.writer(fd, delimiter=',', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
writer.writerow(["title", "description", "markers"]) for item in items:
title = item.nodeid
description = re.sub('\n\s+', '\n', item.obj.__doc__.strip())
markers = ','.join([m.name for m in item.iter_markers()])
writer.writerow([title, description, markers]) pytest.exit(f"测试计划已生成: {path}")
  • pytest_addoption: 添加命令行参数
  • pytest_collection_modifyitems: 重写搜集用例的这个钩子函数

主要就是把搜集到的case的标题,描述和markers这3样写到 csv 文件中。

2. 测试插件代码

插件主体代码写好了,我们需要自测一下。

按之前的话,可以直接把插件代码写到本地conftest文件里作为本地代码直接调用测试即可。

不过 Pytest 附带一个名为pytester的插件,它可以帮助我们为插件代码编写测试。这个插件在默认情况下是禁用的,所以在使用之前要先开启。

在 test 目录下的 conftest 文件中声明即可。

接下来上插件测试代码,然后讲解一下相关用法:

import pytest

def test_pingguo(pytester):
"""Make sure that our plugin works."""
pytester.makeini(
"""
[pytest]
markers =
nightly
performance
integration
high
medium
low
"""
) pytester.makepyfile(
"""
import pytest @pytest.mark.performance
def test_one():
\"""test_one\"""
assert False @pytest.mark.high
def test_two():
\"""test_two\"""
assert True def test_three():
\"""test_three\"""
assert True class TestPingGuo():
@pytest.mark.high
@pytest.mark.performance
def test_a(self):
\"""
TestPingGuo.test_a,测试
\"""
assert False def test_b(self):
\"""
TestPingGuo.test_b
测试
\"""
assert True
"""
) # run all tests with pytest
result = pytester.runpytest("--testplan=testplan.csv")

这里最重要的就是pytester提供的方法,比如上面用到的:

  • pytester.makeini:因为我的测试case上加了不同的 marker,这些是需要注册在 ini 文件里的
  • pytester.makepyfile: 这里就是写的测试用例代码了

其实就是在对应的方法里,写上我们的原生代码,只是需要被""" """包起来,当做字符串,然后 pytest 会自行解析我们的代码,在临时目录里创建对应的文件然后运行。

不仅如此,还可以创建其他的文件,比如conftest。这是源码,有兴趣的可以进去一探究竟。

pytester.runpytest("--testplan=testplan.csv")这里可以添加要执行的命令行参数。

运行测试

直接运行测试代码,看下结果。

注意我这里的文件也是被生成在了临时目录里,打开控制台输出的路径就可以找到。

打开 csv 文件验证一下结果,输出正确。

3. 打包

回到项目根目录,命令行输入:

python setup.py sdist build

完成后会生成dist目录,下面就有对应的包。

4. 上传 pypi

没有账号的要先注册登录一下,记得要去对应填写的邮箱里点击激活认证才可以。

接着安装twine,我能使用这个工具来上传。

pip install twine

安装完成后就可以执行了上传:

twine upload dist/*

提示需要输入注册的账号和密码,最后完成上传。

上传完成后就可以在pypi中打开自己的插件主页了,现在其他小伙伴也可以安装插件了。

【pytest官方文档】解读- 开发可pip安装的第三方插件的更多相关文章

  1. 【pytest官方文档】解读fixtures - 1.什么是fixtures

    在深入了解fixture之前,让我们先看看什么是测试. 一.测试的构成 其实说白了,测试就是在特定的环境.特定的场景下.执行特定的行为,然后确认结果与期望的是否一致. 就拿最常见的登录来说,完成一次正 ...

  2. 【pytest官方文档】解读fixtures - 2. fixtures的调用方式

    既然fixtures是给执行测试做准备工作的,那么pytest如何知道哪些测试函数 或者 fixtures要用到哪一个fixtures呢? 说白了,就是fixtures的调用. 一.测试函数声明传参请 ...

  3. 【pytest官方文档】解读fixtures - 3. fixtures调用别的fixtures、以及fixture的复用性

    pytest最大的优点之一就是它非常灵活. 它可以将复杂的测试需求简化为更简单和有组织的函数,然后这些函数可以根据自身的需求去依赖别的函数. fixtures可以调用别的fixtures正是灵活性的体 ...

  4. Cuda 9.2 CuDnn7.0 官方文档解读

    目录 Cuda 9.2 CuDnn7.0 官方文档解读 准备工作(下载) 显卡驱动重装 CUDA安装 系统要求 处理之前安装的cuda文件 下载的deb安装过程 下载的runfile的安装过程 安装完 ...

  5. 【pytest官方文档】解读- 插件开发之hooks 函数(钩子)

    上一节讲到如何安装和使用第三方插件,用法很简单.接下来解读下如何自己开发pytest插件. 但是,由于一个插件包含一个或多个钩子函数开发而来,所以在具体开发插件之前还需要先学习hooks函数. 一.什 ...

  6. 【pytest官方文档】解读fixtures - 8. yield和addfinalizer的区别(填坑)

    在上一章中,文末留下了一个坑待填补,疑问是这样的: 目前从官方文档中看到的是 We have to be careful though, because pytest will run that fi ...

  7. 【pytest官方文档】解读fixtures - 7. Teardown处理,yield和addfinalizer

    当我们运行测试函数时,我们希望确保测试函数在运行结束后,可以自己清理掉对环境的影响. 这样的话,它们就不会干扰任何其他的测试函数,更不会日积月累的留下越来越多的测试数据. 用过unittest的朋友相 ...

  8. 【pytest官方文档】解读fixtures - 10. fixture有效性、跨文件共享fixtures

    一.fixture有效性 fixture有效性,说白了就是fixture函数只有在它定义的使用范围内,才可以被请求到.比如,在类里面定义了一个fixture, 那么就只能是这个类中的测试函数才可以请求 ...

  9. FluentValidation:C#后端输入验证框架的官方文档解读

    参照 FluentValidation 的官方文档写的例子,方便日后查看和使用. 原文:https://github.com/JeremySkinner/FluentValidation/wiki H ...

随机推荐

  1. Linux 05 口令字文件

    参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 由于 /e ...

  2. ATOM使用的一点心得与技巧——在一个窗口打开多个项目

    atom作为一个后起之秀,我个人是觉得越用越好用.虽然sublimet也很棒,但是在ubuntu里不能使用中文很是恼火.网上关于修复这个bug的办法实在太多了.果断选择省事的atom.虽然比起subl ...

  3. kubernetes之Endpoint引入外部资源实践;

    1. 什么是Endpoint? 我们创建Service的时候会自动给我们创建一个同名的Endpoint资源,每一个同名的 Servie都有一个Endpoints资源,因为Service自己并不直接匹配 ...

  4. CSS 选择器(二):子代选择器(>)

    后代选择器 后代选择器选择的范围广,范围是当前节点的所有子节点,包括其直接子节点. <div id="app"> <div>items-1 <div& ...

  5. a 标签 rel 属性值 opener 的作用

    <a> 元素,原英文单词为 anchor 的缩写,所以又称之为锚点元素.锚点元素的 href 属性用来创建通向其他网页.文件.同一页面内的位置.电子邮件地址或任何其他 URL 的超链接. ...

  6. PowerPoint 常识备忘录

    一句科普 插入超链接时所链接的目标不能是幻灯片中的某个对象.可以给文本.图形等对象添加超链接,链接的对象可以是文件或网页,不能是幻灯片中的某个对象. 名词解释 视图 视图指的是显示幻灯片的方式.视图的 ...

  7. vue2和vue3的区别?

    vue2和vue3的主要区别在于以下几点: 1.生命周期函数钩子不同 2.数据双向绑定原理不同 3.定义变量和方法不同 4.指令和插槽的使用不同 5.API类型不同 6.是否支持碎片 7.父子组件之间 ...

  8. C语言小游戏: 推箱子 支线(一)--1

    好家伙,考完试了 回顾一下2021 回顾一下某次的作业 妙啊 所以, 做一个推箱子小游戏 1.先去4399找一下关卡灵感 就它了 2.在百度上搜几篇推箱子, 参考其中的"■ ☆"图 ...

  9. 第三十七篇:JS基础(this)

    好家伙, 解析器(浏览器)在调用函数是每次都会响函数内部传递进一个隐含的参数, 这个隐含参数就是this,this指向的是一个对象,由浏览器传过来 这个对象我们成为函数执行的上下文对象 根据函数的调用 ...

  10. 基于anaconda3的Pytorch环境搭建

    安装anaconda3,版本选择新的就行 打开anaconda prompt创建虚拟环境conda create -n pytorch_gpu python=3.9,pytorch_gpu是环境名称, ...