zoukankan      html  css  js  c++  java
  • pytest文档19-doctest测试框架

    前言

    doctest从字面意思上看,那就是文档测试。doctest是python里面自带的一个模块,它实际上是单元测试的一种。
    官方解释:doctest 模块会搜索那些看起来像交互式会话的 Python 代码片段,然后尝试执行并验证结果

    doctest测试用例可以放在两个地方

    • 函数或者方法下的注释里面
    • 模块的开头

    案例

    先看第一个案例,将需要测试的片段,标准格式,需要运行的代码前面加>>> ,相当于进入cmd这种交互环境执行,期望的结果前面不需要加>>>

    >>> multiply(4, 3)
        12
    >>> multiply('a', 3)
        'aaa'
    

    放到multiply函数的注释里

    def multiply(a, b):
        """
        fuction: 两个数相乘
        >>> multiply(4, 3)
        12
        >>> multiply('a', 3)
        'aaa'
        """
        return a * b
    if __name__ == '__main__':
        import doctest
        doctest.testmod(verbose=True)
    

    运行结果

    Trying:
        multiply(4, 3)
    Expecting:
        12
    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.
    
    

    从运行的结果可以看出,虽然函数下方的注释里面有其它内容“fuction: 两个数相乘”,但不会去执行,只识别“>>>”这种符号。2个测试用例都是通过的,实际的结果与期望的结果一致。

    失败案例

    doctest的内容放到.py模块的开头也是可以识别到的

    # 保存为xxx.py
    '''
    fuction: 两个数相乘
    >>> multiply(4, 8)
    12
    >>> multiply('a', 5)
    'aaa'
    '''
    
    def multiply(a, b):
        """
        fuction: 两个数相乘
        """
        return a * b
    if __name__ == '__main__':
        import doctest
        doctest.testmod(verbose=True)
    

    运行结果2个都失败

    **********************************************************************
    1 items had failures:
       2 of   2 in __main__
    2 tests in 2 items.
    0 passed and 2 failed.
    ***Test Failed*** 2 failures.
    
    

    verbose参数,设置为True则在执行测试的时候会输出详细信息

    cmd执行

    以上案例是在编辑器直接运行的,如果在cmd里面,也可以用指令去执行

    $ python -m doctest -v xxx.py

    • m 参数指定运行方式doctest
    • -v参数是verbose,带上-v参数相当于verbose=True

    pytest运行

    pytest框架是可以兼容doctest用例,执行的时候加个参数 --doctest-modules ,这样它就能自动搜索到doctest的用例

    $ pytest -v --doctest-modules xxx.py

    如下是函数下的文档

    fuction: 两个数相乘
    >>> multiply(4, 3)
    12
    >>> multiply('a', 5)
    'aaa'
    

    运行结果

    D:	est1122a>pytest -v --doctest-modules  xxx.py
    ============================= test session starts =============================
    platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0 -- d:soft
    python3.6python.exe
    cachedir: .pytest_cache
    metadata: {'Python': '3.6.0', 'Platform': 'Windows-7-6.1.7601-SP1', 'Packages':
    {'pytest': '3.6.3', 'py': '1.5.4', 'pluggy': '0.6.0'}, 'Plugins': {'metadata': '
    1.7.0', 'html': '1.19.0', 'allure-adaptor': '1.7.10'}, 'JAVA_HOME': 'D:\soft\j
    dk18\jdk18v'}
    rootdir: D:	est1122a, inifile:
    plugins: metadata-1.7.0, html-1.19.0, allure-adaptor-1.7.10
    collected 1 item
    
    xxx.py::xxx.multiply FAILED                                              [100%]
    
    ================================== FAILURES ===================================
    ___________________________ [doctest] xxx.multiply ____________________________
    004
    005     fuction: 两个数相乘
    006     >>> multiply(4, 3)
    007     12
    008     >>> multiply('a', 5)
    Expected:
        'aaa'
    Got:
        'aaaaa'
    
    D:	est1122axxx.py:8: DocTestFailure
    ========================== 1 failed in 0.16 seconds ===========================
    

    结果可以看出,文档里面的每一行都被执行了,当遇到测试不通过的用例时,就不会继续往下执行了

    doctest独立文件

    doctest内容也可以和代码抽离开,单独用一个.txt文件保存

    在当前xxx.py同一目录新建一个xxx.txt文件,写入测试的文档,要先导入该功能,导入代码前面也要加>>>

    >>> from xxx import multiply
    >>> multiply(4, 3)
    12
    >>> multiply('a', 3)
    'aaa'
    

    cmd执行“python -m doctest -v xxx.txt”测试结果

    
    D:	est1122>python -m doctest -v  xxx.txt
    Trying:
        from xxx import multiply
    Expecting nothing
    ok
    Trying:
        multiply(4, 3)
    Expecting:
        12
    ok
    Trying:
        multiply('a', 3)
    Expecting:
        'aaa'
    ok
    1 items passed all tests:
       3 tests in xxx.txt
    3 tests in 1 items.
    3 passed and 0 failed.
    Test passed.
    

    ---------------------------------pytest结合selenium自动化完整版-------------------------

    全书购买地址 https://yuedu.baidu.com/ebook/902224ab27fff705cc1755270722192e4536582b

    作者:上海-悠悠 QQ交流群:874033608

    也可以关注下我的个人公众号:yoyoketang

  • 相关阅读:
    看别人的代码学习的css
    Font Awesome
    响应式网站设计
    css兼容性的问题
    英语
    我的bootstrap使用的历程
    jquery的常用的容易忘记的东西
    jquery基本方法
    js与jquery的区别
    134123
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/9561697.html
Copyright © 2011-2022 走看看