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


    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则只输出测试结果不符合的信息
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    执行结果为:

    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.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    如果__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'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    打开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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在命令行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 或 回车默认英文
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在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',
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

  • 相关阅读:
    uni-app实现图片预览
    《论文阅读》具有人格自适应注意的个性化对话生成 AAAI 2023
    LeetCode【2251. 花期内花的数目】
    带你掌握Redis中的数据类型
    Elasticsearch7 入门 & 进阶
    SpringMVC常用注解、参数传递、返回值
    【Spring Boot】# 使用AOP实现接口鉴权访问、白名单限制、记录接口访问日志、限制接口请求次数
    第二章Maven的使用
    高通WLAN框架学习(33)-- WLAN/P2P get IOCTLs(iwpriv)命令大全
    小白跟做江科大32单片机之按键控制LED
  • 原文地址:https://blog.csdn.net/Louise_Trender/article/details/126587171