unittest單元測試框架教程5-使用subTest進行循環測試


有時候我們需要對某個測試之間的差異很小的方法輸入不同參數進行循環測試,或者某個方法要用到其它方法的組合來運行,可以方便的使用subTest()方法進行測試。

 

先改寫方法使其接收參數

import unittest

import ddt

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

def jianfa(a,b):
if type(a) is str or type(b) is str:
return 0
return a-b

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


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

def tearDown(self):
pass

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

def test_jianfa(self,data):
'''測試減法程序'''
try:
self.assertEqual(jianfa(data['a'],data['b']),data['jianfa'])
print(str(data['a']) + '+' + str(data['b']) + '=' + str(data['jianfa']))
except Exception as e:
print(str(data['a']) + '+' + str(data['b']) + '=' + str(data['jianfa']) + ' X')
raise e

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()

可以加入方法調用其他方法

    def test_mix(self):
'''測試混合程序'''
testdata = [{'a': 1, 'b': 1, 'jiafa': 2, 'jianfa': 0, 'chengfa': 1},
{'a': 'a', 'b': 1, 'jiafa': 'a1', 'jianfa': 0, 'chengfa': 'a'},
{'a': 'a', 'b': 'b', 'jiafa': 'ab', 'jianfa': 0, 'chengfa': 'ab'}]

for t in testdata:
with self.subTest(t):
print(t)
self.test_jiafa(t)
self.test_jianfa(t)
self.test_chengfa(t)

runner.py

runner = unittest.TextTestRunner(verbosity=2)
suite = unittest.TestSuite()
suite.addTest(TestMath('test_mix'))
result = runner.run(suite)

運行后看到

test_mix (testmath.TestMath)
測試混合程序 ...
======================================================================
FAIL: test_mix (testmath.TestMath) [{'a': 'a', 'b': 1, 'jiafa': 'a1', 'jianfa': 0, 'chengfa': 'a'}]
測試混合程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\unitest\testmath.py", line 117, in test_mix
self.test_chengfa(t)
File "D:\PycharmProjects\unitest\testmath.py", line 104, in test_chengfa
raise e
File "D:\PycharmProjects\unitest\testmath.py", line 100, in test_chengfa
self.assertEqual(chengfa(data['a'], data['b']), data['chengfa'])
AssertionError: 0 != 'a'

======================================================================
FAIL: test_mix (testmath.TestMath) [{'a': 'a', 'b': 'b', 'jiafa': 'ab', 'jianfa': 0, 'chengfa': 'ab'}]
測試混合程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\unitest\testmath.py", line 117, in test_mix
self.test_chengfa(t)
File "D:\PycharmProjects\unitest\testmath.py", line 104, in test_chengfa
raise e
File "D:\PycharmProjects\unitest\testmath.py", line 100, in test_chengfa
self.assertEqual(chengfa(data['a'], data['b']), data['chengfa'])
AssertionError: 0 != 'ab'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=2)
{'a': 1, 'b': 1, 'jiafa': 2, 'jianfa': 0, 'chengfa': 1}
1+1=2
1+1=0
1*1=1
{'a': 'a', 'b': 1, 'jiafa': 'a1', 'jianfa': 0, 'chengfa': 'a'}
a+1=a1
a+1=0
a*1=a X
{'a': 'a', 'b': 'b', 'jiafa': 'ab', 'jianfa': 0, 'chengfa': 'ab'}
a+b=ab
a+b=0
a*b=ab X

可以發現測試報告中任然將其當做一個測試用例,但出現了兩個錯誤並會將其輸出到測試報告中

還可以將其擴展,比如希望自定義方法和參數的組合,可以修改方法

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

def tearDown(self):
pass

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

def test_jianfa(self,data):
'''測試減法程序'''
try:
self.assertEqual(jianfa(data['a'],data['b']),data['answer'])
print(str(data['a']) + '+' + str(data['b']) + '=' + str(data['answer']))
except Exception as e:
print(str(data['a']) + '+' + str(data['b']) + '=' + str(data['answer']) + ' X')
raise e

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

def test_mix(self):
'''測試混合程序'''
testdata = [{'testmethod':'test_jiafa','a': 1, 'b': 1, 'answer': 2},
{'testmethod':'test_jianfa','a': 'a', 'b': 1, 'answer': 0},
{'testmethod':'test_chengfa','a': 'a', 'b': 'b','answer': 'ab'}]

for t in testdata:
with self.subTest(t):
print(t)
testmethod = t['testmethod']
testfunc = getattr(self, testmethod)
testfunc(t)

發現任然將其當做一個測試用例,每個方法運行一次並輸入參數給它。

test_mix (testmath.TestMath)
測試混合程序 ...
======================================================================
FAIL: test_mix (testmath.TestMath) [{'testmethod': 'test_chengfa', 'a': 'a', 'b': 'b', 'answer': 'ab'}]
測試混合程序
----------------------------------------------------------------------
Traceback (most recent call last):
File "D:\PycharmProjects\unitest\testmath.py", line 117, in test_mix
testfunc(t)
File "D:\PycharmProjects\unitest\testmath.py", line 104, in test_chengfa
raise e
File "D:\PycharmProjects\unitest\testmath.py", line 100, in test_chengfa
self.assertEqual(chengfa(data['a'], data['b']), data['answer'])
AssertionError: 0 != 'ab'

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)
{'testmethod': 'test_jiafa', 'a': 1, 'b': 1, 'answer': 2}
1+1=2
{'testmethod': 'test_jianfa', 'a': 'a', 'b': 1, 'answer': 0}
a+1=0
{'testmethod': 'test_chengfa', 'a': 'a', 'b': 'b', 'answer': 'ab'}
a*b=ab X

Process finished with exit code 0

 

subTest()在進行流程性的測試時十分有用,但是其基礎是testcase對象,所以需要對testcase對象了解,所以接下來將對unittest.TestCase對象做深入的了解和掌握。


免責聲明!

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



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