unittest单元测试框架

一、unittest单元测试框架简介?
  1. 什么是单元测试?

  单元测试负责对最小的软件设计单元(模块)进行验证,对重要程序分支进行测试以发现模块中的错误,python语言下有很多单元测试框架,如:doctest、unitest、pytest等 单元测试本身就是用一段代码验证另一段代码,不用单元测试框架也是可以做单元测试的。(异常处理)
2. unittest简介

  Unittest 是python内部自带的单元测试的模块、测试用例继承自unittest.TestCase、所有的测试函数以test开头,test_XXX,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作

  1. unittest中的概念
  • 测试固件 , 一个测试固件包括两部分,执行测试代码之前的准备部分和测试结束之后的清扫代码。这两部分一般用函数setUp()和tearDown()表示。

  • 测试用例,unittest中管理的最小单元是测试用例,一个测试用例,包括测试固件,和具体测试业务的函数或者方法。一个测试用例中,测试固件可以不写,但是至少有一个已test开头的函数。unittest会自动化识别test开头的函数是测试代码,如果你写的函数不是test开头,unittest是不会执行这个函数里面的脚本的,这个千万要记住,所有的测试函数都要test开头

  • 测试套件,就是很多测试用例的集合,叫测试套件,一个测试套件可以随意管理多个测试用例

  • 测试执行器 ,test runner是一个用来执行加载测试用例,并执行用例,且提供测试输出的一个组建。test runner可以加载test case或者test suite进行执行测试任务,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

二、实例
# 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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值