单元测试框架之unittest(三)

一、摘要

前边的文章我们看到执行测试用例的是通过调用unittest.mian()函数,它会将模块的测试用例收集起来并执行,然而当我们的测试用例增多了以后,这样的执行非常不灵活而且没有效率,我们更愿意看到自由组合的一组用例,只执行这组用例的方式,unittest.TestSuite能够满足我们这个需求,笔者将一random类作为被测试类来详细展示unittest.TestSuite

二、代码示例

  • 以前的执行方式
# encoding = utf-8
import random
import unittest


class TestRandomFunction(unittest.TestCase):
    def setUp(self):
        self.str = "abcdef!@#$%"

    def tearDown(self):
        pass

    def test_randomchoice(self):
        var = random.choice(self.str)
        self.assertTrue(var in self.str)
        print(var)

    def test_randomsample(self):
        with self.assertRaises(ValueError):
            random.sample(self.str, 100)
        for var in random.sample(self.str, 6):
            self.assertTrue(var in self.str)
            print(var)


class TestRandomShuffleFunction(unittest.TestCase):

    def setUp(self):
        self.list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13]

    def tearDown(self):
        pass

    def test_randomshuffle(self):
        random.shuffle(self.list)
        print(self.list)
        self.list.sort()
        self.assertEqual(self.list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13])


if __name__ == '__main__':
    unittest.main()
  • 方式一  使用unittest.TestLoader,它可以通过传给他的参数获取测试用例的测试方法,然后再组合成TestSuite,最后在将TestSuite传递给TestRunner  完成我们所期望的执行组合
# encoding = utf-8
import random
import unittest


class TestRandomFunction(unittest.TestCase):
    def setUp(self):
        self.str = "abcdef!@#$%"

    def tearDown(self):
        pass

    def test_randomchoice(self):
        var = random.choice(self.str)
        self.assertTrue(var in self.str)
        print(var)

    def test_randomsample(self):
        with self.assertRaises(ValueError):
            random.sample(self.str, 100)
        for var in random.sample(self.str, 6):
            self.assertTrue(var in self.str)
            print(var)


class TestRandomShuffleFunction(unittest.TestCase):

    def setUp(self):
        self.list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13]

    def tearDown(self):
        pass

    def test_randomshuffle(self):
        random.shuffle(self.list)
        print(self.list)
        self.list.sort()
        self.assertEqual(self.list, [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13])


if __name__ == '__main__':
    # unittest.main()
    testcase1 = unittest.TestLoader().loadTestsFromTestCase(TestRandomFunction)
    testcase2 = unittest.TestLoader().loadTestsFromTestCase(TestRandomShuffleFunction)
    suite = unittest.TestSuite([testcase1, testcase2])
    unittest.TextTestRunner(verbosity=2).run(suite)
  •  方式二 另创建一个.py文件,定义suite方法,使用unittest.TestSuite().addTest(测试类(测试方法))
# encoding = utf-8
import unittest
from unittest3.TestSuiteDemo2 import *


def suite():
    suite = unittest.TestSuite()
    suite.addTest(TestRandomFunction("test_randomchoice"))
    suite.addTest(TestRandomShuffleFunction("test_randomshuffle"))
    return suite


if __name__ == '__main__':
    runner = unittest.TextTestRunner()
    runner.run(suite())
  •  方式三 另创建一个.py文件,使用unittest.TestLoader().discover(“路径”,“匹配文件名”)
# encoding = utf-8
import unittest

if __name__ == '__main__':
    suite = unittest.TestLoader().discover('.', pattern='TestSuiteDemo1.py')
    unittest.TextTestRunner(verbosity=2).run(suite)

 三、random实例

import random
import string

#随机获取0到10之间随机整数N,0 <= N <= 10, 语法randint(a, b),a <= N <= b
random.randint(0,10)
#等同于
random.randrange(0,11) 

#随机获取0到10之间的偶数M, 语法:randrange(start,stop,[step])  
random.randrange(0,11,2)

#随机获取浮点数
random.random() 

#随机后去0到10之间的浮点数O,语法:uniform(a, b)[a <= N <= b for a <= b and b <= N <= a for b < a]
random.uniform(0,10)

#获取字符串随机字符
random.choice('string')

#获取特定数量的随机字符,返回list
random.sample('string',3)

#多个字符中选取特定数量的字符组成新字符串
list1 = ['a','b','c','d','e','f','g','h','i','j', 1, 2, 3]
list2 = [str(i) for i in list1]
str1 = ''.join(random.sample(list2, 5))

#获取随机字符串
random.choice(['apple', 'pear', 'peach', 'orange', 'lemon'])
random.choice('abcdefghijklmn')

#洗牌
string1 = 'a b c d e f g'
string2 = string1.split()
random.shuffle(string2)
print(string2)

 四、类说明

TestLoader类:它用于加载测试用例,然后返回一个测试用例集和

LoadTestsFromTestCase类:根据传给它的测试类获取其中以test开头的测试方法,然后返回一个测试集合

TestSuite类:用于组装测试用例的实例,然后传递给TestRunner进行测试执行

TextTestRunner类:用于执行测试用例,Text表示是以文本形式输出测试结果,它会返回一个TestResult实例对象,用于存储测试用例执行过程中的详细信息,可以使用Python的dir()进行查看

五、参数verbosity说明

verbosity =< 0时,输出结果中不提示执行成功的用例数

verbosity = 1 时,输出结果中仅仅以(.)的形式表示执行成功的用例数,成功几个就是几个点

verbosity >= 2 时,可以输出每个用例执行的详细信息,特别是在用例较多的情况下,此设置会比较有用

你可能感兴趣的:(单元测试框架之unittest(三))