自动化六:单元测试框架四
单元测试框架: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)
执行结果: