一、unittest单元测试框架简介?
- 什么是单元测试?
??单元测试负责对最小的软件设计单元(模块)进行验证,对重要程序分支进行测试以发现模块中的错误,python语言下有很多单元测试框架,如:doctest、unitest、pytest等 单元测试本身就是用一段代码验证另一段代码,不用单元测试框架也是可以做单元测试的。(异常处理) 2. unittest简介
??Unittest 是python内部自带的单元测试的模块、测试用例继承自unittest.TestCase、所有的测试函数以test开头,test_XXX,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作
- unittest中的概念
二、实例
# coding=utf-8
import unittest
class Mytest(unittest.TestCase): #继承自unittest.TestCase
@classmethod
def setUpClass(cls):
print('所有测试前执行一次---111')
@classmethod
def tearDownClass(cls):
print('所有测试后执行一次---222')
def setUp(self):
print("每个测试用例执行前执行一次---aaa")
def tearDown(self):
print("每个测试用例执行后执行一次---bbb")
def test_a(self):
self.assertEqual(1,1)
print('1相等1')
def test_b(self):
self.assertEqual(2,2)
print('2相等2')
if __name__ == '__main__':
unittest.main()
# unittest的用法
# setUpClass 执行一次 方法:自动执行,在执行所以测试用例之前执行
# tearDownClass 执行一次 方法:自动执行,所有用例执行结束之后执行
# setUp 执行多次 (初始化环境) 方法:自动执行,每个用例执行前都要执行
# tearDown 执行多次 (清理环境) 方法:自动执行,每个用例结束后执行
# unittest.main() 执行所有的测试用例
Testsuit() 测试套件
# coding=utf-8
import unittest
class UCTestCase(unittest.TestCase):
def setUp(self):
pass
def tearDown(self):
pass
def test_1(self):
pass
def test_2(self):
print('hello')
if __name__ == "__main__":
suit = unittest.TestSuite() # 创建一个测试套件测试集
suit.addTest(UCTestCase("test_1")) # 把需要执行测测试用例放在测试套件中
suit.addTest(UCTestCase("test_2")) # 把需要执行测测试用例放在测试套件中
# suit.addTest([UCTestCase("test_1"), UCTestCase("test_2")]) # 添加多条测试用例
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suit)
verbosity是一个选项,表示测试结果的信息复杂度,有0、1、2三个值
0:静默模式,只能获取总的测试数和总的执行结果,比如成功3,失败4
1:默认模式,非常类似静默模式,只是在每个成功的测试用例前面会有".",在每个失败的测试用例前面有"F"
2:详细模式,测试结果会显示每个测试用例的所有相关的信息
Testloader() 此方法可同时测试多个
import unittest
class TestCase_1(unittest.TestCase):
def test_1(self):
print("111")
def test_2(self):
print("111_1")
class TestCase_2(unittest.TestCase):
def test_1(self):
print("222")
def test_2(self):
print("222_2")
if __name__ == '__main__':
suit_1 = unittest.TestLoader().loadTestsFromTestCase(TestCase_1)
suit_2 = unittest.TestLoader().loadTestsFromTestCase(TestCase_2)
suit = unittest.TestSuite([suit_1, suit_2])
unittest.TextTestRunner(verbosity=2).run(suit)
三、断言
import unittest
import math
import re
class demoTest(unittest.TestCase):
def test_1(self): # 基本断言
self.assertEqual(4+4, 8)
self.assertNotEqual(2, 3) # a == b
self.assertTrue(3+2 == 5, "true")
self.assertNotEqual(3+2 == 20 , "assertion fails") # bool(x) is true
self.assertIn( "百度", self.driver.title)
self.assertNotIn(3, [1,2]) # in \ not in 区间
def test_2(self): # 比较断言
self.assertAlmostEqual(22/7,3.142857143,places = 7) # 验证first约等于second。 palces: 指定精确到小数点后多少位,默认为7
self.assertNotAlmostEqual(10/3,3,places = 7)
self.assertGreater(math.pi,3) # 验证first > second,否则fail
self.assertGreaterEqual (first, second, msg = None) # 验证first ≥ second,否则fail
self.assertLess (first, second, msg = None) # 验证first < second,否则fail
self.assertLessEqual (first, second, msg = None)# 验证first ≤ second,否则fail
self.assertRegexpMatches (text, regexp, msg = None)# 验证正则表达式regexp搜索匹配的文本text。 regexp:通常使用re.search()
self.assertNotRegexpMatches (text, regexp, msg = None) # 验证正则表达式regexp搜索不匹配的文本text。 regexp:通常使用re.search()
def test_3(self): # 复杂断言
self.assertListEqual(list1,list2, msg = None) #验证list1 = list2 不等则fail报错
self.assertTupleEqual(toupe1,toupe2,msg=None) #验证tuple1 = toupe2 不等则fail报错
self.assertSetEqual(set1,set2,msg=None) #验证set1 = set2 不等则fail报错
self.assertDictEqual(zd1,zd2, msg=None) #验证字典1 = 字典2 不等则fail报错
if __name__ == '__main__':
unittest.main()
|