自动化六:单元测试框架四

单元测试框架:unittest

在单元测试框架中,如何实现用例的执行或者不执行呢?

  -解决方案一:使用框架自带的装饰器来实现对用例的管理

  1)@unittest.skip("skipping")   无条件忽略该测试方法,括号里面的内容表示忽略测试方法后的备注

  2)@unittest.skipIf(a > 5, "condition is not satisfied!")   如果变量>5,则忽略该测试方法,括号里面的内容表示忽略测试方法后的备注

  3)@unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")   除非执行测试用例的平台是Linux,否则忽略该测试方法,括号里面的内容表示忽略测试方法后的备注

# coding=utf-8
import random
import unittest    
import sys


class TestSequenceFunctions(unittest.TestCase):
    a = 6

    def setUp(self):
        self.seq = list(range(10))

    @unittest.skip("skipping")  # 无条件忽略该测试方法
    def test_shuffle(self):
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, list(range(10)))
        self.assertRaises(TypeError, random.shuffle, (1, 2, 3))

    # 如果变量>5,则忽略该测试方法
    @unittest.skipIf(a > 5, "condition is not satisfied!")
    def test_choice(self):
        element = random.choice(self.seq)
        self.assertTrue(element in self.seq)

    # 除非执行测试用例的平台是Linux,否则忽略该测试方法
    @unittest.skipUnless(sys.platform.startswith("linux"), "requires Linux")
    def test_sample(self):
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)


if __name__ == '__main__':
    # unittest.main()  下面这三句和这一句是一个意思
    suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)  # 加载测试类
    suite = unittest.TestSuite(suite)
    unittest.TextTestRunner(verbosity=2).run(suite)

执行结果:

 

  -解决方案二:在调用case方法处做加载选择,只加载我们需要执行的用例来执行即可。

  1)unittest.main() 方法是启动单元测试,是执行的所有用例

  2)

  # 加载给定的测试类(把我们需要执行的用例放到类中),获取其中的所有以“test”开头的测试方法,并返回一个测试套件
  suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
  suite2 = unittest.TestLoader().loadTestsFromTestCase(TestDictValueFormatFunctions)
  suite3 = unittest.TestLoader().loadTestsFromTestCase(TestCalcFunctions)
  # 将多个测试类加载到测试套件中
  suite = unittest.TestSuite([suite2, suite1, suite3]) # 通过调整suit2和suite1的顺序,可以设定执行顺序
  # 设置verbosity = 2,可以打印出更详细的执行信息
  unittest.TextTestRunner(verbosity=2).run(suite)

# Calc.py
# coding=utf-8
class Calc(object):

    def add(self, x, y, *d):
        # 加法计算
        result = x + y
        for i in d:
            result += i
        return result

    def sub(self, x, y, *d):
        # 减法计算
        result = x - y
        for i in d:
            result -= i
        return result

    @classmethod
    def mul(cls, x, y, *d):
        # 乘法计算
        result = x * y
        for i in d:
            result *= i
        return result

    @staticmethod
    def div(x, y, *d):
        # 除法计算
        if y != 0:
            result = x / y
        else:
            raise ZeroDivisionError

        for i in d:
            if i != 0:
                result /= i
            else:
                raise ZeroDivisionError

        return result


if __name__ == "__main__":
    c=Calc()
    print(c.add(1, 2, 3, 4))
    print(c.sub(1, 2, 3, 4))
    print(c.mul(2, 3, 4))
    print(c.div(10, 5, 1))
    print(c.div(1, 0, 0))
    print(c.div(1, 1, 0))
    print(Calc.mul(1, 2, 3, 4))
    print(Calc.div(100, 10, 5, 1))
#TestCalc.py
# encoding=utf-8
import unittest
from Calc import Calc


class TestCalcFunctions(unittest.TestCase):
    def setUp(self):
        self.c = Calc()
        print("setup completed!")

    def test_sum(self):
        self.assertTrue(self.c.add(1, 2, 3, 4) == 10)

    def test_sub(self):
        self.assertTrue(self.c.sub(100,20,30,40) == 10)

    def test_mul(self):
        self.assertTrue(self.c.mul(1,2,3,40) == 240)

    def test_div(self):
        self.assertTrue(self.c.div(100,10,2) == 5)

    def tearDown(self):
        
        print ("test completed!")


if __name__ == '__main__':
    unittest.main()
test.py
# encoding=utf-8
import random
import unittest
from TestCalc import TestCalcFunctions


class TestSequenceFunctions(unittest.TestCase):
    def setUp(self):
        self.seq = list(range(10))

    def tearDown(self):
        pass

    def test_choice(self):
        # 从序列seq中随机选取一个元素
        element = random.choice(self.seq)
        # 验证随机元素确实属于列表中
        self.assertTrue(element in self.seq)

    def test_sample(self):
        # 验证执行的语句是否抛出了异常
        with self.assertRaises(ValueError):
            random.sample(self.seq, 20)
        for element in random.sample(self.seq, 5):
            self.assertTrue(element in self.seq)


class TestDictValueFormatFunctions(unittest.TestCase):
    def setUp(self):
        self.seq = list(range(10))

    def tearDown(self):
        pass

    def test_shuffle(self):
        # 随机打乱原seq的顺序
        random.shuffle(self.seq)
        self.seq.sort()
        self.assertEqual(self.seq, list(range(10)))
        # 验证执行函数时抛出了TypeError异常
        self.assertRaises(TypeError, random.shuffle, (1, 2, 3))


if __name__ == '__main__':
    # 根据给定的测试类,获取其中的所有以“test”开头的测试方法,并返回一个测试套件
    suite1 = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions)
    suite2 = unittest.TestLoader().loadTestsFromTestCase(TestDictValueFormatFunctions)
    suite3 = unittest.TestLoader().loadTestsFromTestCase(TestCalcFunctions)
    # 将多个测试类加载到测试套件中
    suite = unittest.TestSuite([suite2, suite1, suite3])  # 通过调整suit2和suite1的顺序,可以设定执行顺序
    # 设置verbosity = 2,可以打印出更详细的执行信息
    unittest.TextTestRunner(verbosity=2).run(suite)

执行结果:

 

posted @ 2020-04-17 10:39  海澜时见鲸  阅读(162)  评论(0)    收藏  举报