(3)py接口自动化之unittest框架详解(概念、前后置、执行顺序、断言)

目录

一、框架概念

1、什么是unittest?

2、unittest的4个核心组件

3、测试流程

4、如何写测试用例?(TestCase)

二、前后置概述

1、类级别的前后置

 2、函数级别的前后置

三、用例的执行顺序概述

四、断言概述


一、框架概念

1、什么是unittest?

        unittest是python自带的单元测试框架。pytest也是在它的基础上去实现的。

2、unittest的4个核心组件

        TestCase:测试用例类,用来定义测试用例函数的

        TestSuite:测试套件,用来收集测试用例的

        TestRunner:测试用例运行类,用来执行测试用例的,以测试套件的维度去执行

        TestFixture:测试脚手架,用来做前置条件和后置处理的

3、测试流程

        1)先定义测试用例类,在测试用例类中写测试方法。使用TestCase

        2)收集要执行的测试用例类或者文件里边的测试方法,放在测试套件中。使用TestSuite

        3)将收集好的测试套件放在测试用例运行器中去执行,并收集测试结果。使用TestRunner

        4)做好前置条件和后置处理。使用TestFixture

注:这里涉及一个面试题,你用unittest是怎么去做自动化测试的?

4、如何写测试用例?(TestCase)

        1)导入模块 import unittest

        2)定义一个测试用例类:类名必须Test开头(别的名称会被python认为不是测试用例,就不会收集)

        3)定义测试方法:测试方法也必须是Test开头,必须写在测试用例类里头

        4)框架执行入口:unittest.main()会自动收集当前py文件中的测试用例,然后执行(但是再后续的实践中,我们不会使用该方法,该方法可以用来调试当前用例类)

 例如:

import unittest


class TestDemo(unittest.TestCase):
    # test命名的默认为测试用例
    def test_01(self):
        print("测试用例01")

    def test_02(self):
        print("测试用例02")


if __name__ == '__main__':
    unittest.main()

 执行结果解读:

 5、测试用例包含哪些东西?

        1)前置条件(如果没有可以不写):sql语句的执行,创建各种连接,工具类的实例化

        2)测试步骤(业务逻辑):数据替换、数据驱动等

        3)测试结果断言:响应结果断言、数据库断言

        4)后置条件(如果没有可以不写):数据清理、数据库连接关闭

注:下边我们按照从易到难的顺序进行概述讲解。

二、前后置概述

1、类级别的前后置

        1)前置:当前测试用例类中的测试用例执行之前执行一次

                @classmethod

                def setUpClass(cls):

                         print("类级别的前置(类方法)")

         2)后置:当前测试用例类中的测试用例执行之后执行一次

                @classmethod

                def tearDownClass(cls):

                         print("类级别的后置(类方法)")

例如:

import unittest


class TestDemo(unittest.TestCase):
    # 定义类级别的前置
    # 因为是继承TestCase类中的方法,源码中此方法为类方法,所以继承过来也是类方法
    @classmethod
    def setUpClass(cls):
        print("类级别的前置(类方法)")

    # 同前置,写后置
    @classmethod
    def tearDownClass(cls):
        print("类级别的后置(类方法)")

    # test命名的默认为测试用例
    def test_01(self):
        print("测试用例01")

    def test_02(self):
        print("测试用例02")


if __name__ == '__main__':
    unittest.main()

结果解析:(我这里打印的顺序是不对的,代码的执行顺序是先前置再用例最后是后置)

 2、函数级别的前后置

        1)前置:每个测试用例执行之前执行一次

                def setUp(self):

                         print("函数级别的前置")

         2)后置:每个测试用例执行之后执行一次

                def tearDown(self):

                         print("函数级别的后置")

例如:

import unittest


class TestDemo(unittest.TestCase):
    # 函数级别的前置
    def setUp(self):
        print("函数级别的前置")

    # 函数级别的后置
    def tearDown(self):
        print("函数级别的后置")

    # test命名的默认为测试用例
    def test_01(self):
        print("测试用例01")

    def test_02(self):
        print("测试用例02")


if __name__ == '__main__':
    unittest.main()

结果解读:

3、类级别的前后置可以和函数级别的前后置同时存在

        那么运行的时候,就是类前置->函数前置->测试用例->函数后置->....->类后置

        感兴趣的小伙伴可以自己写写试一下,在这里我就不赘述了

三、用例的执行顺序概述

1、根据ascii码一位一位去对比,小的先执行

        查看ascii码的方法:

        # 打印ascii码

        print(ord("a"))

        # 将ascii码转换为对对应的值

        print(chr(97))

        常用顺序:0-9  <  A-Z   <   a-z

2、测试用例类中的话,先执行测试函数、再执行测试文件

四、断言概述

1、概念

        1)继承TestCase类的断言方法

        2)自动化基本只能用到这个,判断是否相等:self.assertEqual(1,2)

2、断言的特点

        1)unittest以程序运行过程中是否抛出异常来判断用例执行是否成功

        2)如果断言失败,程序会抛出异常,框架会把这个用例标记为失败

        3)只要程序执行过程中出现其他异常,框架也会去捕获并将用例标记为失败

3、异常的捕获与抛出

        1)手动去捕获异常的话,框架会默认这条用例是通过的,因为异常被捕获没有抛给框架

import unittest


class TestDemo(unittest.TestCase):
    # test命名的默认为测试用例
    def test_01(self):
        print("测试用例01")
        # 1==2吗?
        try:
            # 断言判断1==2?
            self.assertEqual(1, 2)
        except Exception as e:
            # 打印捕获到的异常
            print("失败", e)

    def test_02(self):
        print("测试用例02")


if __name__ == '__main__':
    unittest.main()

 执行结果:两条用例都通过,把捕获到的异常打印了出来

        2)将捕获到的异常抛给框架,让框架把用例标记为失败

import unittest


class TestDemo(unittest.TestCase):
    # test命名的默认为测试用例
    def test_01(self):
        print("测试用例01")
        # 1==2吗?
        try:
            self.assertEqual(1, 2)
        except Exception as e:
            print("失败", e)
            # 将捕获到的异常抛给框架
            raise AssertionError(e)

    def test_02(self):
        print("测试用例02")


if __name__ == '__main__':
    unittest.main()

执行结果: 一条通过、一条失败。异常抛给框架去标记失败用例

4、补充断言

方法检查点
self.assertEqual(a,b)a==b
self.assertNotEqual(a,b)a!=b
self.assertTrue(a,b)bool(x) is True
self.assertFalse(a,b)bool(x) is False
self.assertIn(a,b)a in b
self.assertNotIn(a,b)a not in b
self.assertIs(a,b)a is b
self.assertIsNot(a,b)a is not  b

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值