9、pytest -- 集成文档测试
1. 集成doctest
模块
doctest是python
内置的一个标准库,它可以查找代码中类似交互式会话形式的注释,并检查它们是否正确;
1.1. 通过指定文本文件的方式
默认情况下,pytest
会自动收集所有名称匹配test*.txt
规则的文件,并调用doctest
执行它们;
下面,我们来看一个简单的例子:
# src/chapter-9/test_example.txt
>>> x = 3
>>> x
3
直接使用pytest
命令就可以执行它:
λ pipenv run pytest src/chapter-9/test_example.txt
====================== test session starts =======================
platform win32 -- Python 3.7.3, pytest-5.1.3, py-1.8.0, pluggy-0.13.0
rootdir: D:\Personal Files\Projects\pytest-chinese-doc
collected 1 item
src\chapter-9\test_example.txt . [100%]
======================= 1 passed in 0.03s ========================
我们也可以使用命令行选项--doctest-glob
添加文件名称的匹配规则;
例如,匹配rst
格式的文件:
pytest --doctest-glob='*.rst'
注意:
--doctest-glob
可以多次指定,它们之间是或者的关系,并且依旧支持默认的test*.txt
规则;
1.1.1. 文本文件的编码
doctest
文件的默认编码是UTF-8,你可以在pytest.ini
中使用doctest_encoding
选项指定新的编码;例如,使用latin1
编码:
[pytest]
doctest_encoding = latin1
1.2. 通过编写文档字符串的方式
除了文本文件外,pytest
还支持检查文档字符串中的注释;例如:
# src/chapter-9/test_module.py
def something():
'''文档字符串示例
>>> something()
42
'''
return 42
def test_module():
assert something() == 42
执行时,需要添加--doctest-modules
命令行选项:
λ pipenv run pytest --doctest-modules src/chapter-9/test_module.py
====================== test session starts =======================
platform win32 -- Python 3.7.3, pytest-5.1.3, py-1.8.0, pluggy-0.13.0
rootdir: D:\Personal Files\Projects\pytest-chinese-doc
collected 2 items
src\chapter-9\test_module.py .. [100%]
======================= 2 passed in 0.03s ========================
--doctest-modules
会查找所有名称匹配*.py
的文件,收集文档字符串中类似交互式会话形式的注释,并把每一个文档字符串作为一个用例来执行,所以上面我们执行了两个测试,其中一个是文档测试;
如果想让pytest --doctest-modules
正确收集到相关注释,需满足以下条件:
- 文件名称符合
*.py
规则,但无需满足test_*.py
或者*_test.py
规则; - 文档字符串中的注释必须是类似
python
交互式会话形式的注释;
如果你不想每次执行都指定--doctest-modules
选项,可以考虑在pytest.ini
中添加如下配置:
[pytest]
addopts = --doctest-modules
文档字符串是一个多行字符串,使用
'''
或者"""
包裹;一般推荐形式为,第一行简述功能,第二行空行,第三行具体描述;并且,可以通过
__doc__
属性访问它;例如,上面例子的__doc__
属性为:>>> print(something.__doc__)
文档字符串示例 >>> something()
42
1.3. 指定额外的选项
1.3.1. doctest
标准库自带的选项
python
的doctest
标准库自带一些选项,用于定义文档测试的模式,我们同样可以在pytest.ini
中使用这些功能;例如,忽略尾随的空格:
# src/chapter-9/pytest.ini
doctest_optionflags = NORMALIZE_WHITESPACE
另外,你也可以在行注释中使能这些选项;
例如,使用# doctest: +NORMALIZE_WHITESPACE
同样能忽略尾随的空格:
def something():
'''文档字符串示例
>>> something() # doctest: +NORMALIZE_WHITESPACE
42
'''
return 42
更多细节可以参考:https://docs.python.org/3/library/doctest.html#option-flags
1.3.2. pytest
自有的选项
ALLOW_BYTES
:在输出时,剔除字符串的b
前缀;例如,以下文档测试是成功的:
# src/chapter-9/options.py
def str_bytes():
'''返回字节编码
>>> str_bytes() # doctest: +ALLOW_BYTES
'bytes'
'''
return b'bytes'
ALLOW_UNICODE
:相似的,在输出时,剔除字符串的u
前缀;
NUMBER
:为了避免出现以下导致测试失败的情况:
Expected:
3.14
Got:
3.141592653589793
我们可以通过配置NUMBER
选项,只比较列出的精度:
# src/chapter-9/options.py
def number():
'''浮点数的精度
>>> import math
>>> math.pi # doctest: +NUMBER
3.14
'''
return 1
注意:我们并不建议在全局使能
NUMBER
选项,因为它会修改输出中所有的浮点数的精度,甚至是在字符串或者列表中;例如,以下文档测试也是成功的:
# src/chapter-9/options.py def str_number():
'''浮点数字符串的精度 >>> str_number() # doctest: +NUMBER
'3.14'
'''
return '3.1415'
2. 失败时继续执行
默认情况下,对于一个给定的文档测试,pytest
在遇到第一个失败点时退出执行;但是,我们可以通过--doctest-continue-on-failure
命令行选项,让其继续执行;
例如,对于以下文档字符串,包含两个测试点,pytest --doctest-continue-on-failure
会报告两个错误(默认只会报告第一个错误):
def str_bytes():
'''返回字节编码
>>> str_bytes()
'bytes'
>>> import math
>>> math.pi
3.14
'''
return b'bytes'
3. 指定输出的格式
文档测试失败时,你可以通过以下方式更改测试输出的格式:
pytest --doctest-modules --doctest-report none
pytest --doctest-modules --doctest-report udiff
pytest --doctest-modules --doctest-report cdiff
pytest --doctest-modules --doctest-report ndiff
pytest --doctest-modules --doctest-report only_first_failure
更多细节可以参考:https://docs.python.org/3/library/doctest.html#doctest.REPORT_UDIFF
4. 文档测试中使用fixture
通过getfixture
可以让你在文档字符串中使用fixture
:
>>> tmp = getfixture('tmpdir')
>>> ...
>>>
5. 文档测试的命名空间
doctest_namespace fixture
可以用于向运行doctest
测试的命名空间中注入一些信息,它是一个标准的字典对象;
例如,我们在conftest.py
中定义一个方法,注入到doctest
的命名空间中:
# src/chapter-9/conftest.py
import pytest
def func():
return 42
@pytest.fixture(autouse=True)
def add_func(doctest_namespace):
doctest_namespace['function'] = func
可以在文档字符串中直接使用它:
# src/chapter-9/func.txt
>>> function()
42
6. 跳过文档测试
pytest 4.4
版本新增功能
我们可以通过pytest.skip
跳过文档测试;例如,跳过Windows
系统上的文档测试:
>>> import sys, pytest
>>> if sys.platform.startswith('win'):
... pytest.skip('this doctest does not work on Windows')
>>> function()
42
9、pytest -- 集成文档测试的更多相关文章
- 【JEECG技术文档】JEECG在线聊天插件功能集成文档
原文地址:http://jeecg.iteye.com/blog/2320670 JEECG在线聊天插件功能集成文档 前提: 采用jeecg_3.6.3版本以上(Maven工程) 插件项目: 在线聊天 ...
- CAT部署集成文档
1. 下载编译 1.1 下载源码 首先,到项目的git网页下载整个项目: https://github.com/dianping/cat 1.2 打包安装 接着就是进入这个项目的目录,运行打包安装命 ...
- 关于RequireJS与AngularJS的集成文档
为什么要整合RequireJS RequireJS是一个Javascript 文件和模块框架,通过模块的方式来配置js文件之间的依赖关系,遵守的是CommonJS的AMD标准. 在开发的时候则无需关注 ...
- pytest -- 中文文档
pytest-chinese-doc pytest官方文档(5.1.3版本)的中文翻译,但不仅仅是简单的翻译: 更多的例子,尽量做到每一知识点都有例子: 更多的拓展阅读,部分章节添加了作者学习时,所查 ...
- 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)
对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...
- API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等
最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...
- 使用doctest代码测试和Sphinx自动生成文档
python代码测试并自动生成文档 Tips:两大工具:doctest--单元测试.Sphinx--自动生成文档 1.doctest doctest是python自带的一个模块.doctest有两种使 ...
- ASP.NET Core 1.0 中使用 Swagger 生成文档
github:https://github.com/domaindrivendev/Ahoy 之前文章有介绍在ASP.NET WebAPI 中使用Swagger生成文档,ASP.NET Core 1. ...
- 使用Ldoc给Lua生成文档
Ldoc介绍 LDoc是一个Lua的文档生成工具,过去,比较常用的Lua生成文档的工具是LuaDoc,可惜作者自从2008年之后就再也没有发布过新的版本了,说明作者基本上已经放弃维护了.而LDoc则是 ...
随机推荐
- jedis指定数据库
正常情况下,我们通过get或者set方法是从db0中取数据. 1.redis提供了 select命令,可以通过select index 这个指令,将数据库切换到index所在的那个数据库上 2.jed ...
- JQuery入门学习笔记(全)
jQuery 语法 $(this).hide() - 隐藏当前元素 $("p").hide() - 隐藏所有 元素 $("p.test").hide() - 隐 ...
- .Net Core快速创建Windows服务
1.新建.Net Core控制台程序,添加新建项Windows服务: NuGet引用 System.ServiceProcess.ServiceController,然后修改Progran.cs: c ...
- chown、chgrp、chmod
1.权限对应的数值 一开始理解权限对应的数值总是要去用二进制去算例如r-x是多少rwx是多少,后来才知道r就 是4,w就是2,x就是1,不管权限怎么变,他们对应的数值就是对应位相加.. 权限对于文件来 ...
- JAVA TCP/IP网络通讯编程(一)
一个实例通过client端和server端通讯 客户端发送:“我是客户端,请多关照” 服务端回复:“收到来自于"+s.getInetAddress().getHostName()+" ...
- httpSession和Cookie
1.session在何时被创建一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true) ...
- Zeppelin 学习笔记之 Zeppelin安装和elasticsearch整合
Zeppelin安装: Apache Zeppelin提供了web版的类似ipython的notebook,用于做数据分析和可视化.背后可以接入不同的数据处理引擎,包括spark, hive, taj ...
- SpringBoot注入Mapper失败
SpringBoot注入Mapper失败,可能是因为没有加扫描Mapper层的注解 方式一:在所有mapper接口使用@Mapper注解 @Mapper public interface UserMa ...
- spring boot项目下的application.properties中的logging.level设置日志级别
日志级别 trace<debug<info<warn<error<fatal 默认级别为info,即默认打印info及其以上级别的日志,如下: logging.level ...
- MongoDB系列(一):初步理解
一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 1.易用性 1)MongoDB是一款面向文档的数据库,而不是关系型数据库,因此而有着更好的扩展性. 2)通过在文档中嵌入文档和数组, ...