从0到1精通自动化测试,pytest自动化测试框架,doctest测试框架(十四)

目录:导读

    • 一、前言
    • 二、案例
    • 三、失败案例
    • 四、cmd执行
    • 五、pytest运行
    • 六、doctest独立文件

一、前言

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

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

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

二、案例

先看第一个案例,将需要测试的片段,标准格式,需要运行的代码前面加>>> ,相当于进入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
从0到1精通自动化测试,pytest自动化测试框架,doctest测试框架(十四)_第1张图片

五、pytest运行

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

$ pytest -v —doctest-modules  xxx.py

从0到1精通自动化测试,pytest自动化测试框架,doctest测试框架(十四)_第2张图片
如下是函数下的文档

fuction: 两个数相乘

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

运行结果

D:\test1122\a>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.6\python.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:\test1122\a, 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:\test1122\a\xxx.py:8: DocTestFailure
========================== 1 failed in 0.16 seconds ===========================

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

六、doctest独立文件

doctest内容也可以和代码抽离开,单独用一个.txt文件保存
从0到1精通自动化测试,pytest自动化测试框架,doctest测试框架(十四)_第3张图片
在当前xxx.py同一目录新建一个xxx.txt文件,写入测试的文档,要先导入该功能,导入代码前面也要加 >>>

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

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

>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.

你可能感兴趣的:(测试,软件测试,自动化测试,自动化,python,pytest,软件测试,测试工程师)