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:PycharmProjectsunitest estmath.py", line 117, in test_mix
self.test_chengfa(t)
File "D:PycharmProjectsunitest estmath.py", line 104, in test_chengfa
raise e
File "D:PycharmProjectsunitest estmath.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:PycharmProjectsunitest estmath.py", line 117, in test_mix
self.test_chengfa(t)
File "D:PycharmProjectsunitest estmath.py", line 104, in test_chengfa
raise e
File "D:PycharmProjectsunitest estmath.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:PycharmProjectsunitest estmath.py", line 117, in test_mix
testfunc(t)
File "D:PycharmProjectsunitest estmath.py", line 104, in test_chengfa
raise e
File "D:PycharmProjectsunitest estmath.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对象做深入的了解和掌握。

原文地址:https://www.cnblogs.com/zerotest/p/13549028.html