zoukankan      html  css  js  c++  java
  • 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对象做深入的了解和掌握。

  • 相关阅读:
    C++中获取高精度时间差
    有关宏的一个问题
    HDU 2504 又见GCD
    .NET中统一的存储过程调用方法(收藏)
    如何让你的SQL运行得更快
    最赚钱的5种成功创业可行方式
    SQL语句优化技术分析
    js document.getElementByID("aa")的位置
    写SQL时尽量不要对字段进行运算操作
    连接池的问题
  • 原文地址:https://www.cnblogs.com/zerotest/p/13549028.html
Copyright © 2011-2022 走看看