pytest文档55-plugins插件开发
前言
前面一篇已经学会了使用hook函数改变pytest运行的结果,代码写在conftest.py文件,实际上就是本地的插件了。
当有一天你公司的小伙伴觉得你写的还不错,或者更多的小伙伴想要你这个功能,于是你就想着放到github上,写成一个插件,方便小伙伴使用pip去安装。
插件开发
先新建一个工程,工程名称就是插件名称,一般以pytest-开头命名,目录结构如下

setup.py 在安装python的相关模块和库时,我们一般使用
pip install 模块名或者python setup.py install,前者是在线安装,会安装该包的相关依赖包;
后者是下载源码包然后在本地安装,不会安装该包的相关依赖包README.rst README 文档,告诉用户如何使用你的插件,具体能实现什么功能
pytest_change_report.py 也就是之前conftest.py里面写的hook函数实现的功能
tests 用于测试本插件的相关功能,属于自测的内容
tests/conftest.py 开启需要的插件pytester
tests/test_change_report.py 测试插件的代码
setup.py
在安装python的相关模块和库时,我们一般使用pip install 模块名或者python setup.py install,前者是在线安装,会安装该包的相关依赖包;
后者是下载源码包然后在本地安装,不会安装该包的相关依赖包.
setup.py 描述安装包相关的信息
from setuptools import setup
"""The setup script.
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
"""
setup(
name='pytest-change-report',
url='https://github.com/yoyoketang/pytest-change-report',
version='1.0',
author="yoyo",
author_email='283340479@qq.com',
description='turn . into √,turn F into x',
long_description='print result on terminal turn . into √,turn F into x using hook',
classifiers=[
'Framework :: Pytest',
'Programming Language :: Python',
'Topic :: Software Development :: Testing',
'Programming Language :: Python :: 3.6',
],
license='proprietary',
py_modules=['pytest_change_report'],
keywords=[
'pytest', 'py.test', 'pytest-change-report',
],
install_requires=[
'pytest'
],
entry_points={
'pytest11': [
'change-report = pytest_change_report',
]
}
)
pytest_change_report.py
插件的核心功能,也就是之前在conftest.py用hook函数实现的功能。
我们现在实现的功能:
1.把测试的结果.改成√,F改成x
2.命令行加个--change参数开关,默认不开启,当加上参数`--change on·的时候才生效
import pytest
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
def pytest_addoption(parser):
parser.addoption(
"--change",
action="store",
default="off",
help="'Default 'off' for change, option: on or off"
)
def pytest_report_teststatus(report, config):
'''turn . into √,turn F into x, turn E into 0'''
if config.getoption("--change") == "on":
if report.when == 'call' and report.failed:
return (report.outcome, 'x', 'failed')
if report.when == 'call' and report.passed:
return (report.outcome, '√', 'passed')
测试插件
当插件功能实现完成后,需要在tests目录测试自己写的插件
tests/conftest.py 文件开启pytester,专门用于测试插件的
'''pytester is needed for testing plgugins.'''
pytest_plugins = ['pytester']
tests/test_change_report.py 文件写测试用例
import pytest
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
def test_raw_report(testdir):
"""Make sure that our plugin works."""
# create a temporary pytest test file
testdir.makepyfile(
"""
def test_01():
a = "hello"
b = "hello"
assert a == b
def test_02():
a = "hello"
b = "hello world"
assert a == b
"""
)
# run all tests with pytest
result = testdir.runpytest()
# check that 1 test passed, 1 test failed.
result.assert_outcomes(passed=1, failed=1)
result.stdout.fnmatch_lines(["*.F*", ])
def test_change_on_report(testdir):
"""Make sure that our plugin works."""
# create a temporary pytest test file
testdir.makepyfile(
"""
def test_01():
a = "hello"
b = "hello"
assert a == b
def test_02():
a = "hello"
b = "hello world"
assert a == b
"""
)
# run all tests with pytest
result = testdir.runpytest("--change", "on")
# check that 1 test passed, 1 test failed.
result.stdout.fnmatch_lines(['*√x*', ])
def test_change_off_report(testdir):
"""Make sure that our plugin works."""
# create a temporary pytest test file
testdir.makepyfile(
"""
def test_01():
a = "hello"
b = "hello"
assert a == b
def test_02():
a = "hello"
b = "hello world"
assert a == b
"""
)
# run all tests with pytest
result = testdir.runpytest("--change", "off")
# check that 1 test passed, 1 test failed.
result.stdout.fnmatch_lines(['*.F*', ])
def test_change_default_report(testdir):
"""Make sure that our plugin works."""
# create a temporary pytest test file
testdir.makepyfile(
"""
def test_01():
a = "hello"
b = "hello"
assert a == b
def test_02():
a = "hello"
b = "hello world"
assert a == b
"""
)
# run all tests with pytest
result = testdir.runpytest("--change")
# check stderr pytest: error: argument --change: expected one argument
result.stderr.fnmatch_lines(['*argument --change: expected one argument*', ])
def test_verbose_report(testdir):
"""Make sure that our plugin works."""
# create a temporary pytest test file
testdir.makepyfile(
"""
def test_01():
a = "hello"
b = "hello"
assert a == b
def test_02():
a = "hello"
b = "hello world"
assert a == b
"""
)
# run all tests with pytest
result = testdir.runpytest("-v")
# check that 1 test passed, 1 test failed.
result.stdout.fnmatch_lines(['*::test_01 PASSED*', '*::test_02 FAILED*'])
def test_change_verbose_report(testdir):
"""Make sure that our plugin works."""
# create a temporary pytest test file
testdir.makepyfile(
"""
def test_01():
a = "hello"
b = "hello"
assert a == b
def test_02():
a = "hello"
b = "hello world"
assert a == b
"""
)
# run all tests with pytest
result = testdir.runpytest("--change", "on", "-v")
# check that 1 test passed, 1 test failed.
result.stdout.fnmatch_lines(['*::test_01 passed*', '*::test_02 failed*'])
def test_help(testdir):
"""Make sure that our plugin works."""
# create a temporary pytest test file
testdir.makepyfile(
"""
def test_01():
a = "hello"
b = "hello"
assert a == b
"""
)
# run all tests with pytest
result = testdir.runpytest("--help")
# check --help
result.stdout.fnmatch_lines(["*--change=*", ])
本地安装插件
cd到插件的项目目录,使用pip安装
pip install .
>pip install .
Processing d:\soft\pytest-change-report
Using legacy setup.py install for pytest-change-report, since package 'wheel' is not installed.
Installing collected packages: pytest-change-report
Attempting uninstall: pytest-change-report
Found existing installation: pytest-change-report 1.0
Uninstalling pytest-change-report-1.0:
Successfully uninstalled pytest-change-report-1.0
Running setup.py install for pytest-change-report ... done
Successfully installed pytest-change-report-1.0
安装完成后,在cmd输入 pip show pytest-change-report就可以看到前面setup.py里面的描述内容
>pip show pytest-change-report
Name: pytest-change-report
Version: 1.0
Summary: turn . into √,turn F into x
Home-page: https://github.com/yoyoketang/pytest-change-report
Author: yoyo
Author-email: 283340479@qq.com
License: proprietary
Location: e:\python36\lib\site-packages\pytest_change_report-1.0-py3.6.egg
Requires: pytest
Required-by:
安装完成后,输入pytest测试tests/test_change_report.py
>pytest
============================= test session starts =============================
collected 7 items
tests\test_change_report.py ....... [100%]
========================== 7 passed in 0.89 seconds ===========================
测试文件里面的用例全部通过
README.rst
最后需要写个 README.rst 使用教程文档,这样你写的插件就能被其它小伙伴学习和使用了。
==============
pytest-change-report: pytest plugin
==============
**This pytest plugin turn . into √,turn F into x**
Usage
=====
从github源码安装
pip install git+https://github.com/yoyoketang/pytest-change-report.git
命令行运行示例
pytest --change on
demo
====
先写pytest用例test_demo.py
def test_01():
a = "hello"
b = "hello"
assert a == b
def test_02(login):
a = "hello"
b = "hello world"
assert a == b
命令行执行pytest, 默认不会改变之前的报告内容
>pytest test_demo.py
============================= test session starts =============================
collected 2 items
test_demo.py .F [100%]
================================== FAILURES ===================================
___________________________________ test_02 ___________________________________
def test_02():
a = "hello"
b = "hello world"
> assert a == b
E AssertionError: assert 'hello' == 'hello world'
E - hello
E + hello world
test_demo.py:10: AssertionError
===================== 1 failed, 1 passed in 0.11 seconds ======================
加上 --change on 参数后运行
>pytest test_demo.py --change on
============================= test session starts =============================
collected 2 items
test_demo.py √x [100%]
================================== FAILURES ===================================
___________________________________ test_02 ___________________________________
def test_02():
a = "hello"
b = "hello world"
> assert a == b
E AssertionError: assert 'hello' == 'hello world'
E - hello
E + hello world
test_demo.py:10: AssertionError
===================== 1 failed, 1 passed in 0.08 seconds ======================
pytest.ini
==========
可以添加到pytest.ini配置文件,这样默认就会带上--change参数
[pytest]
--change = on
# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
提交github
最后把插件代码提交到github仓库,方便下载https://github.com/yoyoketang/pytest-change-report

pytest文档55-plugins插件开发的更多相关文章
- pytest文档7-pytest-html生成html报告
前言 pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告.兼容Python 2.7,3.6 pytest-html 1.github上源码地址[https://github. ...
- pytest文档3-pycharm运行pytest
前言 上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常运行,如果每次跑去cmd执行,太麻 ...
- pytest文档19-doctest测试框架
前言 doctest从字面意思上看,那就是文档测试.doctest是python里面自带的一个模块,它实际上是单元测试的一种. 官方解释:doctest 模块会搜索那些看起来像交互式会话的 Pytho ...
- pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)
前言 使用 pytest 执行 https 请求用例的时候,控制台会出现警告:InsecureRequestWarning: Unverified HTTPS request is being mad ...
- pytest文档43-元数据使用(pytest-metadata)
前言 什么是元数据?元数据是关于数据的描述,存储着关于数据的信息,为人们更方便地检索信息提供了帮助. pytest 框架里面的元数据可以使用 pytest-metadata 插件实现.文档地址http ...
- pytest文档1-环境准备与入门
前言 首先说下为什么要学pytest,在此之前相信大家已经掌握了python里面的unittest单元测试框架,那再学一个框架肯定是需要学习时间成本的. 刚开始我的内心是拒绝的,我想我用unittes ...
- pytest文档56-插件打包上传到 pypi 库
前言 pytest 的插件完成之后,可以上传到 github,方便其他小伙伴通过 pip 源码安装.如果我们想通过 pip install packages 这种方式安装的话,需上传到 pypi 仓库 ...
- pytest文档51-内置fixture之cache使用
前言 pytest 运行完用例之后会生成一个 .pytest_cache 的缓存文件夹,用于记录用例的ids和上一次失败的用例. 方便我们在运行用例的时候加上--lf 和 --ff 参数,快速运行上一 ...
- pytest文档21-pytest-html报告优化(nodeid中文显示[\u6350\u52a9\u6211\u4eec]问题解决)
前言 pytest-html报告中当用到参数化时候,获取用例的nodeid里面有中文时候,会显示[\u6350\u52a9\u6211\u4eec]这种编码(再次声明,这个不叫乱码,这是unicode ...
随机推荐
- leetcode刷题-69x的平方根
题目 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4输出: 2 思 ...
- SSM框架中添加写日志功能
前提:要导入log4j的jar包 在web.xml中输入: <!--日志加载--> <context-param> <param-name>log4jConfigL ...
- 记一次奇怪的cookie丢失
.net给Image控件设置一个空图片路径的时候出现丢失cookie 比如说, img_path.ImageUrl ="../"+ ds.Tables[0].Rows[0][&q ...
- jzoj1497. 景点中心
Description 话说宁波市的中小学生在镇海中学参加计算机程序设计比赛,比赛之余,他们在镇海中学的各个景点参观.镇海中学共有n个景点,每个景点均有若干学生正在参观.这n个景点以自然数1至n编号, ...
- Docker 学习笔记一
Docker 学习笔记一 1.Docker是什么? Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源.让开发者打包他们的应用以及依赖包到一 ...
- 分布式处理框架Hadoop的安装与使用
Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构.用户可以在不了解分布式底层细节的情况下,开发分布式程序. 充分利用集群的威力进行高速运算和存储.Hadoop实现了一 ...
- 一文带你了解Sql优化
我们后台开发人员每天都难免与数据库打交道,那么你在写sql语句的时候有注重到自己sql的效率吗?当你sql查询速度很慢的时候你有想过是你的sql语句造成的吗?看完这篇文章,我相信你会对sql优化有了一 ...
- 顶 最新简捷实用的JSP动态网站环境搭建详细步骤
阿里西西小编给您推荐这个最新简捷实用的JSP动态网站环境搭建详细步骤讲解,这里还有关于JSP 动态网站 环境 搭建 的教程,希望您能够喜欢并学到东西提升自己的知识与技能,下面是内容详细阅读: 最新简捷 ...
- JS -- JavaScript简介
JavaScript是一种属于网络的高级脚本语言(解释性脚本语言),已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果. 一.如何插入JS代码? 使用&l ...
- PowerJob 从 0 到 1.9k star 的经历
本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri 本文就是<讲解 PowerJob>系列的最后一篇文章了,纯粹是写点经历写点心路历程啥的,和大家道个别. ...