unittest單元測試框架教程1-運行測試腳本


unittest模塊提供了一系列創建和運行測試的工具。這一段落演示了這些工具的一小部分,但也足以滿足大部分用戶的需求。

首先我們為了學習寫一個簡單的邏輯,代碼如下:

def add(a,b):
if type(a) is str or type(b) is str:
return str(a) + str(b)
return a+b

def chengfa(a,b):
if type(a) is str or type(b) is str:
return 0
return a*b

 

為了測試3個函數是否正確,我們利用unittest進行測試。

import unittest
import ddt

testdata = [{'a':1,'b':1,'jiafa':2,'chengfa':1},
{'a':'a','b':1,'jiafa':'a1','chengfa':'a'},
{'a':'a','b':'b','jiafa':'ab','chengfa':'ab'}]

@ddt.ddt
class TestMath(unittest.TestCase):
def setUp(self):
pass

def tearDown(self):
pass

@ddt.data(*testdata)
def test_jiafa(self,data):
'''測試加法程序'''
try:
self.assertEqual(jiafa(data['a'],data['b']),data['jiafa'])
print(str(data['a']) + '+' + str(data['b']) + '=' + str(data['jiafa']))
except Exception as e:
print(str(data['a']) + '+' + str(data['b']) + '=' + str(data['jiafa'] + ' X'))
raise e

@ddt.data(*testdata)
def test_chengfa(self,data):
'''測試乘法程序'''
try:
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
print(str(data['a']) + '*' + str(data['b']) + '=' + str(data['chengfa']))
except Exception as e:
print(str(data['a']) + '*' + str(data['b']) + '=' + str(data['chengfa'] + ' X'))
raise e

if __name__ == '__main__':
unittest.main()

一個簡單的測試腳本完成了,使用pycharm的話點擊右上角的綠色運行按鈕即可運行。直接運行看下結果:

1*1=1
a*1=a X
a*b=ab X
1+1=2
a+1=a1
a+b=ab
.FF...
======================================================================
FAIL: test_chengfa_2 (__main__.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:/PycharmProjects/seleniumtest/testmath.py", line 46, in test_chengfa
raise e
File "D:/PycharmProjects/seleniumtest/testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'a'

======================================================================
FAIL: test_chengfa_3 (__main__.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:/PycharmProjects/seleniumtest/testmath.py", line 46, in test_chengfa
raise e
File "D:/PycharmProjects/seleniumtest/testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'ab'

----------------------------------------------------------------------
Ran 6 tests in 0.002s

FAILED (failures=2)

我們發現第2個方法先運行,這是因為使用main或命令行運行時,加載器按照方法名進行排序。

 unittest.main() 提供了一個測試腳本的命令行接口。unittest 模塊可以通過命令行運行模塊、類和獨立測試方法的測試:

python -m unittest test_module1 test_module2 #
python -m unittest test_module.TestClass
python -m unittest test_module.TestClass.test_method
python -m unittest tests/test_something.py

用於獲取命令行選項列表:

python -m unittest -h

 

 

因為是對測試框架學習所以我們看下運行腳本時可以用到的參數。

 

運行參數

-k

只運行匹配模式或子串的測試方法和類。可以多次使用這個選項,以便包含匹配子串的所有測試用例。可以使用通配符(*)的模式對測試名稱進行匹配。另外,該匹配是大小寫敏感的。

python -m unittest newtest.py -k jiafa

 

-f--failfast

當為true時,當出現第一個錯誤或者失敗時,停止運行測試。

 

-b--buffer

如果為True,在測試運行時,標准輸出流與標准錯誤流會被放入緩沖區。成功的測試的運行時輸出會被丟棄;測試不通過時,測試運行中的輸出會正常顯示,錯誤會被加入到測試失敗信息。

加入參數-b運行

(venv) D:\PycharmProjects\seleniumtest>python -m unittest testmath.py -b
.F
Stdout:
a*1=a X
F
Stdout:
a*b=ab X
...
======================================================================
FAIL: test_chengfa_2 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'a'

Stdout:
a*1=a X

======================================================================
FAIL: test_chengfa_3 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'ab'

Stdout:
a*b=ab X

----------------------------------------------------------------------
Ran 6 tests in 0.002s

FAILED (failures=2)

只在錯誤時進行打印

 

'verbose'

0 不打印描述及任何成功失敗標志,相當於命令行的-q

1 不打印描述只打印失敗標志,默認

2 打印描述內容並打印成功及失敗標志,相當於命令行的-v

 

加參數-v 相當於unittest.main(verbosity = 1)運行

(venv) D:\PycharmProjects\seleniumtest>python -m unittest testmath.py -v
test_chengfa_1 (testmath.TestMath)
測試乘法程序 ... 1*1=1
ok
test_chengfa_2 (testmath.TestMath)
測試乘法程序 ... a*1=a X
FAIL
test_chengfa_3 (testmath.TestMath)
測試乘法程序 ... a*b=ab X
FAIL
test_jiafa_1 (testmath.TestMath)
測試加法程序 ... 1+1=2
ok
test_jiafa_2 (testmath.TestMath)
測試加法程序 ... a+1=a1
ok
test_jiafa_3 (testmath.TestMath)
測試加法程序 ... a+b=ab
ok

======================================================================
FAIL: test_chengfa_2 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'a'

======================================================================
FAIL: test_chengfa_3 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'ab'

----------------------------------------------------------------------
Ran 6 tests in 0.005s

FAILED (failures=2)

 

 加參數-q 相當於unittest.main(verbosity = 0)運行

(venv) D:\PycharmProjects\seleniumtest>python -m unittest testmath.py -q
1*1=1
a*1=a X
a*b=ab X
1+1=2
a+1=a1
a+b=ab
======================================================================
FAIL: test_chengfa_2 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'a'

======================================================================
FAIL: test_chengfa_3 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
AssertionError: 0 != 'ab'

----------------------------------------------------------------------
Ran 6 tests in 0.003s

FAILED (failures=2)

 

-W --warnings

  “error” | 將警告轉換為異常

  “ignore” | 不會打印匹配的警告

  “always” | 總是打印匹配的警告

  “default” | 打印發出警告的每個位置的首次出現的匹配警告

  “module” | 將為發出警告的每個模塊打印首次發生的匹配警告

  “once” | 僅打印第一次匹配的警告,不管位置如何

默認為default

 

--locals

在回溯中顯示局部變量。

python -m unittest newtest.py --locals

(venv) D:\PycharmProjects\seleniumtest>python -m unittest testmath.py --locals
1*1=1
.a*1=a X
Fa*b=ab X
F1+1=2
.a+1=a1
.a+b=ab
.
======================================================================
FAIL: test_chengfa_2 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
args = ({'a': 'a', 'b': 1, 'jiafa': 'a1', 'chengfa': 'a'},)
func = <function TestMath.test_chengfa at 0x035C9A08>
kwargs = {}
self = <testmath.TestMath testMethod=test_chengfa_2>
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
data = {'a': 'a', 'b': 1, 'jiafa': 'a1', 'chengfa': 'a'}
self = <testmath.TestMath testMethod=test_chengfa_2>
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
data = {'a': 'a', 'b': 1, 'jiafa': 'a1', 'chengfa': 'a'}
self = <testmath.TestMath testMethod=test_chengfa_2>
AssertionError: 0 != 'a'

======================================================================
FAIL: test_chengfa_3 (testmath.TestMath)
測試乘法程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\seleniumtest\venv\lib\site-packages\ddt.py", line 182, in wrapper
return func(self, *args, **kwargs)
args = ({'a': 'a', 'b': 'b', 'jiafa': 'ab', 'chengfa': 'ab'},)
func = <function TestMath.test_chengfa at 0x035C9A08>
kwargs = {}
self = <testmath.TestMath testMethod=test_chengfa_3>
File "D:\PycharmProjects\seleniumtest\testmath.py", line 46, in test_chengfa
raise e
data = {'a': 'a', 'b': 'b', 'jiafa': 'ab', 'chengfa': 'ab'}
self = <testmath.TestMath testMethod=test_chengfa_3>
File "D:\PycharmProjects\seleniumtest\testmath.py", line 42, in test_chengfa
self.assertEqual(chengfa(data['a'],data['b']),data['chengfa'])
data = {'a': 'a', 'b': 'b', 'jiafa': 'ab', 'chengfa': 'ab'}
self = <testmath.TestMath testMethod=test_chengfa_3>
AssertionError: 0 != 'ab'

----------------------------------------------------------------------
Ran 6 tests in 0.004s

FAILED (failures=2)


免責聲明!

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



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