1. 集成doctest模块

doctestpython内置的一个标准库,它可以查找代码中类似交互式会话形式的注释,并检查它们是否正确;

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标准库自带的选项

pythondoctest标准库自带一些选项,用于定义文档测试的模式,我们同样可以在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

GitHub仓库地址:https://github.com/luizyao/pytest-chinese-doc

9、pytest -- 集成文档测试的更多相关文章

  1. 【JEECG技术文档】JEECG在线聊天插件功能集成文档

    原文地址:http://jeecg.iteye.com/blog/2320670 JEECG在线聊天插件功能集成文档 前提: 采用jeecg_3.6.3版本以上(Maven工程) 插件项目: 在线聊天 ...

  2. CAT部署集成文档

    1. 下载编译 1.1 下载源码 首先,到项目的git网页下载整个项目: https://github.com/dianping/cat 1.2  打包安装 接着就是进入这个项目的目录,运行打包安装命 ...

  3. 关于RequireJS与AngularJS的集成文档

    为什么要整合RequireJS RequireJS是一个Javascript 文件和模块框架,通过模块的方式来配置js文件之间的依赖关系,遵守的是CommonJS的AMD标准. 在开发的时候则无需关注 ...

  4. pytest -- 中文文档

    pytest-chinese-doc pytest官方文档(5.1.3版本)的中文翻译,但不仅仅是简单的翻译: 更多的例子,尽量做到每一知识点都有例子: 更多的拓展阅读,部分章节添加了作者学习时,所查 ...

  5. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  6. API Studio 5.1.2 版本更新:加入全局搜索、支持批量测试API测试用例、读取代码注解生成文档支持Github与码云等

    最近在EOLINKER的开发任务繁重,许久在博客园没有更新产品动态了,经过这些日子,EOLINKER又有了长足的进步,增加了更多易用的功能,比如加入全局搜索.支持批量测试API测试用例.读取代码注解生 ...

  7. 使用doctest代码测试和Sphinx自动生成文档

    python代码测试并自动生成文档 Tips:两大工具:doctest--单元测试.Sphinx--自动生成文档 1.doctest doctest是python自带的一个模块.doctest有两种使 ...

  8. ASP.NET Core 1.0 中使用 Swagger 生成文档

    github:https://github.com/domaindrivendev/Ahoy 之前文章有介绍在ASP.NET WebAPI 中使用Swagger生成文档,ASP.NET Core 1. ...

  9. 使用Ldoc给Lua生成文档

    Ldoc介绍 LDoc是一个Lua的文档生成工具,过去,比较常用的Lua生成文档的工具是LuaDoc,可惜作者自从2008年之后就再也没有发布过新的版本了,说明作者基本上已经放弃维护了.而LDoc则是 ...

随机推荐

  1. pikachu-数字型注入(post)#手工注入

    1, 因为是post型,所以需要抓取数据包 2, 测试结果为数字型注入 提交恒等的语句可以查询到所有的数据信息 3, 使用UNION联合查询法 判断字段数,测试为2个字段时没有报错,所以可以判断字段数 ...

  2. mysql数据库设计规则总结

    MySQL数据库设计总结   规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的 ...

  3. 四 mysql之单表查询

    目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 1. 什么是分组?为什么要分组? 2. ONLY_FULL_GROUP_BY ...

  4. NAT网络下tcp_tw_recycle参数引起的故障

    记录一次阿里云服务器故障排查思路 公司网络是nat 环境 问题: 同一个服务有两台服务器 172.19.19.252 172.19.19.187 两台服务器 要连node5 发现172.19.19.2 ...

  5. e课表项目第二次冲刺周期第七天

    昨天干了什么? 昨天我查找相关的资料实现对之前的信息连接数据库进行显示,完成修改的功能,并且返回到数据库当中.然后下午,我和我们小组的成员,讨论了第二个界面的具体功能和布局,我们一致同意,引用之前的第 ...

  6. python urllib2实现http GET PUT DELETE POST的方法

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/3/11 下午8:33 # @Author : liubing # @File ...

  7. net core WebApi——使用NPOI导入导出操作

    目录 前言 NPOI 测试 小结 @ 前言 时间过得好快,在之前升级到3.0之后,就感觉好久没再动过啥东西了,之前有问到Swagger的中文汉化,虽说我觉得这种操作的意义不是太大,也是多少鼓捣了下,其 ...

  8. msf各种弱口令爆破

    Msf: 写的很乱 记录下msf各个爆破弱口令的模块 run post/windows/gather/arp_scanner RHOSTS=10.10.10.0/24 使用arp_scanner模块 ...

  9. IDA快捷键整理

    空格键 反汇编窗口切换文本跟图形 ESC退到上一个操作地址 G搜索地址或者符号 N重命名 分号键 注释 ALT+M 添加标签 CTRL+M 列出所有标签 CTRL +S 二进制段的开始地址结束地址 C ...

  10. Python开发【第九篇】字典

    字典 字典是一种可变的容器,可以存储任意类型的数据 字典中的每个数据都是用键进行索引,而不像序列容器(str,list,tuole)可以用整数进行索引 字典中的数据没有先后顺序,字典的存储是无序的 字 ...