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:\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文件保存

在當前xxx.py同一目錄新建一個xxx.txt文件,寫入測試的文檔,要先導入該功能,導入代碼前面也要加>>>

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

cmd執行“python -m doctest -v xxx.txt”測試結果


D:\test1122>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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM