python代码测试并自动生成文档

Tips:两大工具:doctest--单元测试、Sphinx--自动生成文档

1.doctest

doctest是python自带的一个模块。doctest有两种使用方式:一种是嵌入到python源码中,另外一种是放到一个独立文件。

1.1 嵌入源码

新建test.py

import doctest
'''
'>>>' 开头的行就是doctest测试用例。
不带 '>>>' 的行就是测试用例的输出。
如果实际运行的结果与期望的结果不一致,就标记为测试失败。
'''
def multiply(a, b):
"""
>>> multiply(3, 2)
6
>>> multiply('a', 3)
'aaa'
"""
return a * b
if __name__=='__main__':
doctest.testmod(verbose=True)
# verbose=True即强制使用详细模式:不管执行如何均输出详细信息,
# 若verbose=False则只输出测试结果不符合的信息

执行结果为:

Trying:
multiply(3, 2)
Expecting:
6
ok
Trying:
multiply('a', 3)
Expecting:
'aaa'
ok
1 items had no tests:
__main__
1 items passed all tests:
2 tests in __main__.multiply
2 tests in 2 items.
2 passed and 0 failed.
Test passed.

如果__main__函数有其他用途,不方便调用doctest.testmod()方法,那么可以用另外一种执行测试的方法,在cmd中输入:python -m doctest test.py或者python -m doctest -v test.py。

其中-m表示引用一个模块,-v等价于verbose=True。运行输出与上面基本一样。

1.2 独立使用

新建一个save.txt文件来保存测试用例。

将test.py中的doctest内容拷贝出来放到save.txt文件里,注意save.txt要放在与test.py相同的目录中

下面是save.txt的内容:

>>> from test import multiply
>>> multiply(3, 2)
6
>>> multiply('a', 3)
'aaa'

打开cmd,切换到py文件路径,输入python -m doctest save.txt或者python -m doctest -v save.txt

可以得到和1.1节中相同的输出结果。

Tips:个人建议使用1.2节中的方法。

2.Sphinx

首先,python不自带Sphinx,需要用pip install sphinx安装(anaconda已经预装)

新建项目sphinx_demo,sphinx_demo/src放项目代码test.py,sphinx_demo/doc放sphinx最终自动生成的文档

2.1 reStructuredText风格

reStructuredText风格是pycharm默认注释风格

# -*- coding: utf-8 -*-
class divide_class:
'''reStructuredText风格:用冒号分隔,PyCharm默认风格 :arg dividend: 被除数 :type dividend: int ''' def __init__(self, dividend, name='ReStructuredTextStyle'):
self.dividend = dividend
self.name = name def divide(self, divisor):
'''除法 reStructuredText风格的函数,类型主要有param、type、return、rtype、exception :param divisor: 除数 :type divisor: int :returns: 除法结果 :rtype: :obj:`int` or :obj:`str` :exception TypeError: the type of divisor isn't int >>> reStructredText = ReStructuredTextStyle(dividend=10)
>>> reStructredText.divide(5)
2 '''
try:
if isinstance(divisor, int):
return self.dividend / divisor
else:
raise TypeError("Error!The type of divisor isn't int!")
except TypeError as e:
return e

2.2 Google

Google注释风格是影响力最大的一个,而且十分简洁。

# -*- coding: utf-8 -*-

class divide_class:
'''Google注释风格:用 ``缩进`` 分隔,适用于倾向水平,短而简单的文档 Attributes:
dividend (int or float): 被除数 ''' def __init__(self, dividend):
self.dividend = dividend def divide(self, divisor):
'''除法
Google注释风格的函数,类型主要有Args、Returns、Raises、Examples Args:
divisor (int):除数 Returns:
除法结果 Raises:
ZeroDivisionError: division by zero Examples:
>>> google = GoogleStyle(divisor=10)
>>> google.divide(5)
2 References:
除法_百度百科 https://baike.baidu.com/item/%E9%99%A4%E6%B3%95/6280598 '''
try:
return self.dividend / divisor
except ZeroDivisionError as e:
return e

在命令行cd到sphinx_demo/doc,执行命令sphinx-quickstart,设置结构分离、项目名、作者名、版本号、语言

> Separate source and build directories (y/n) [n]: y
> Project name: sphinx_demo
> Author name(s): XerCis
> Project release []: 1.0
> Project language [en]: zh_CN 或 回车默认英文

在doc/source/conf.py指定项目代码路径sphinx_demo/src,并修改扩展extensions

import os
import sys
sys.path.insert(0, os.path.abspath('../../src')) extensions = [
'sphinx.ext.autodoc',
'sphinx.ext.napoleon',
'sphinx.ext.doctest',
'sphinx.ext.intersphinx',
'sphinx.ext.todo',
'sphinx.ext.coverage',
'sphinx.ext.mathjax',
]

执行生成API文档命令sphinx-apidoc -o source ../src/,再用make html(linux)或者.\make html(windows)生成网页文件,打开doc/build/html/index.html即可看到文档

使用doctest代码测试和Sphinx自动生成文档的更多相关文章

  1. eoLinker 新功能发布,增加了识别代码注释自动生成文档功能

    产品地址:https://www.eolinker.com开源代码:https://www.eolinker.com/#/os/download在线生成代码注释工具:http://tool.eolin ...

  2. 【Sphinx】 为Python自动生成文档

    sphinx 前言 Sphinx是一个可以用于Python的自动文档生成工具,可以自动的把docstring转换为文档,并支持多种输出格式包括html,latex,pdf等 开始 建一个存放文档的do ...

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

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

  4. 使用swagger在netcorewebapi项目中自动生成文档

    一.背景 随着前后端分离模式大行其道,我们需要将后端接口撰写成文档提供给前端,前端可以查看我们的接口,并测试,提高我们的开发效率,减少无效的沟通.在此情况下,通过代码自动生成文档,这种需求应运而生,s ...

  5. MVC WEB api 自动生成文档

    最近在一直在用webapi做接口给移动端用.但是让我纠结的时候每次新加接口或者改动接口的时候,就需要重新修改文档这让我很是苦恼.无意中发现.webapi居然有自动生成文档的功能....真是看见了救星啊 ...

  6. SpringBoot 集成Swagger2自动生成文档和导出成静态文件

    目录 1. 简介 2. 集成Swagger2 2.1 导入Swagger库 2.2 配置Swagger基本信息 2.3 使用Swagger注解 2.4 文档效果图 3. 常用注解介绍 4. Swagg ...

  7. 使用Sphinx为你的python模块自动生成文档

    Sphinx是一个可以用于Python的自动文档生成工具,可以自动的把docstring转换为文档,并支持多种输出格式包括html,latex,pdf等. 安装 创建一个sphinx项目 下面的命令会 ...

  8. linux c/c++ 代码使用 doxygen 自动生成文档

    www.doxygen.org 的使用非常方便,下面分成2步介绍一下 1. 注释风格,需要在c/c++代码中按照下面的风格添加注释,基本上还是很顺手的 C++的注释风格 主要使用下面这种样式:即在注释 ...

  9. 用doxygen自动生成文档

    1. 添加符合doxygen解析规则的注释 (比如函数说明,函数参数/返回值说明) 用qt-creator可以在函数上方一行键入“/**”,然后直接回车,就可以自动生成默认的格式. 2. 安装doxy ...

随机推荐

  1. 构建数据湖上低延迟数据 Pipeline 的实践

    T 摘要 · 云原生与数据湖是当今大数据领域最热的 2 个话题,本文着重从为什么传统数仓 无法满足业务需求? 为何需要建设数据湖?数据湖整体技术架构.Apache Hudi 存储模式与视图.如何解决冷 ...

  2. iommu分析之---intel iommu初始化

    intel 的iommu 是iommu框架的一个实现案例. 由于intel 的iommu 实现得比arm smmv3复杂得多,里面概念也多,所以针对intel 实现的iommu 案例的初始化部分进行一 ...

  3. Python代码用在这些地方,其实1行就够了!

    摘要:都说 Python 简单快捷,那本篇博客就为大家带来一些实用的 Python 技巧,而且仅需要 1 行代码,就可以解决一些小问题. 本文分享自华为云社区<你猜 1 行Python代码能干什 ...

  4. const修饰符总结

    1.什么是const? const就是constant的缩写,意思是"恒定不变的",它是定义只读变量的关键字,或者说const是定义常变量的关键字,常类型的变量或对象的值是不能被更 ...

  5. KingbaseES OOM 可能原因汇总

    背景 不久前,遇到过一个问题.KingbaseES数据库主机系统触发OOM现象是数据库进程被KILL, 数据库进入crash然后restart(when restart_after_crash=on) ...

  6. 思维导图学《On Java》基础卷 + 进阶卷

    说明 目录 思维导图 导读 第 1 章 什么是对象 第 3 章 一切都是对象 第 6 章 初始化和清理 第 7 章 实现隐藏 第 8 章 复用 第 9 章 多态 第 10 章 接口 第 11 章 内部 ...

  7. TDengine概述以及架构模型

    TDengine TDengine是一个高效的存储.查询.分析时序大数据的平台,专为物联网.车联网.工业互联网.运维监测等优化而设计. 您可以像使用关系型数据库MySQL一样来使用它. TDengin ...

  8. Jenkins+Gitlab实现持续集成持续部署

    一.GITLAB安装与使用 官网:https://about.gitlab.com/ 1.GITLAB安装要求 (1)中文文档地址 ​ https://docs.gitlab.cn/jh/instal ...

  9. Windows 2012 R2 iSCSI server

     Windows 2012 R2可以充当一台简单的SAN,提供iSCSI方式的连接,供客户端使用.不确定是否有人会这么使用,但至少在做实验的时候我觉得挺方便的.不用再像以前专门安装windows ...

  10. jmeter性能测试之正则提取响应头或者响应体

    准备工作做好,先发送请求 然后察看结果树中的响应消息 比如我们要提取这个cookie,先调试一下,看能不能提取到 看蓝色的线条,我们提取到了,然后我们把这句话写入到后置处理器中的正则表达式提取里 再次 ...