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
當為true時,當出現第一個錯誤或者失敗時,停止運行測試。
如果為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
在回溯中顯示局部變量。
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)