unittest框架学习及实践

前言

该篇主要介绍unittest框架并使用unittest框架对学员管理系统进行测试


一、unittest框架学习

1、定义

unittest是python单元测试框架,官方库。
unittest中有4个重要的概念:test fixture(前置和后置,特殊函数), test case(测试用例), test suite(套
件), test runner(执行器)

test fixture

Fixture是一个概述,对一个测试用例环境的初始化(前置条件)和销毁(后置条件)就是一个Fixture。
Fixture控制级别分为:方法级别和类级别
1、方法级别:运行一次测试方法(测试用例)就会运行一次setUp和tearDown

    def setUp(self) -> None:
        # 这里是为每条测试用例做的前置动作
        stu = Student('7', '哈哈', 78326262)
        res = StuOperate.add_stu(stu)
        print('方法级别的前置动作')
    def tearDown(self) -> None:
        # 这里是为每条测试用例做的后置动作
        StuOperate.delete_stu('7')
        print('方法级别的后置动作')

2、类级别:每个测试类只会运行一次setUpClass和tearDownClass,在写类级别的前后置动作是必须加上@classmethod装饰器。

# 测试用例前置动作,数据准备
    @classmethod
    def setUpClass(cls) -> None:
        # 这里为当前测试类下的用例准备测试数据
        stu = Student('7', '哈哈', 78326262)
        res = StuOperate.add_stu(stu)
        print('类级别的前置动作')
    @classmethod
    def tearDownClass(cls) -> None:
        # 这里是在当前类下所有测试用例执行完成之后,要做的后置动作
        # 执行完成后将测试数据清掉
        StuOperate.delete_stu('7')
        print('类级别的后置动作')

testcase(测试用例)

1、测试类必须继承unittest.TestCase
2、一个测试方法就是一个测试用例,测试方法必须以test开头。
在这里插入图片描述

testsuite(测试套件)

testsuite测试套件是把多条测试用例集合到一起,通过一系列代码去控制要执行哪些测试方法、测试类或测试用例。
第一种方法:创建suite对象,把测试用例依次加入suite套件

  1. 实例化: suite = unittest.TestSuite() (suite:为TestSuite实例化的名称)
  2. 添加用例:suite.addTest(ClassName(“MethodName”)) (ClassName:为类名;MethodName:为方法名)
# 在这里完成测试用例的组织
    suite = unittest.TestSuite()
    # 只执行TestStudent的test_add_stu测试用例
    suite.addTest(TestStudent('test_add_stu'))

第二种方法:从文件中加载测试用例,然后形成测试套件

# 通常我们测试脚本会有很多个,存放在某个目录下,那么我们可以批量加载
    suite = unittest.defaultTestLoader.discover('guanlixitong','test*.py')

第三种方法:从测试类中加载用例,形成suite套件

suite = unittest.defaultTestLoader.loadTestsFromTestCase(Add)

执行器runner

1、普通文本执行器

# 加一个执行,右键执行才会出现
    runner = unittest.TextTestRunner()
    runner.run(suite)

2、能生成测试报告的执行器

from guanlixitong.HTMLTestRunner import HTMLTestRunner
	suite = unittest.defaultTestLoader.discover('guanlixitong','test*.py')
	with open('testreport.html',mode='wb') as f:
        HTMLTestRunner(f,title='测试报告',description='这是个测试报告').run(suite)

生成测试报告

生成测试报告需借助第三方工具HTMLTestRunner
在这里插入图片描述

二、使用unittest框架对学员管理系统进行测试

1.数据驱动

数据驱动是将数据存在一个对象中,只写一条测试用例根据数据的多少去执行,需要安装第三方库ddt。
1)将数据存储在test_data列表中

test_data = [
        ['7', {'name': '张三', 'phone': '1773663', 'qq': '364646'}, '修改成功'],
        ['67', {}, '学员id:67不存在']
         ]

2)如何将测试用例传给测试数据呢?
a:在用ddt的类上方加上ddt装饰器 @ddt.ddt()
b:在方法上方增加相关数据读取@ddt.data(*test_data)
c:在方法中用data接收数据

@ddt.ddt()
class TestChangeStudentDDT(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        stu = Student('7', '哈哈', 78326262)
        res = StuOperate.add_stu(stu)
        #清楚id为67的学员
        StuOperate.delete_stu('67')
        print("这是类前置动作")
    @classmethod
    def tearDownClass(cls) -> None:
        StuOperate.delete_stu('7')
        print("这是类后置动作")
    test_data = [
        ['7', {'name': '张三', 'phone': '1773663', 'qq': '364646'}, '修改成功'],
        ['67', {}, '学员id:67不存在']
         ]
    @ddt.data(*test_data)
    def test_change(self,data):
        print(data)
        #data是个列表
        id=data[0]
        kwargs=data[1]
        expect_value=data[2]
        #将数据使用到用例中
        #**kwarg表示把name=张三, phone=1773663, qq=364646
        res = StuOperate.change_stu(id,**kwargs)
        assert res == expect_value

2.执行用例

测试用例编写完成后,执行测试用例。(数据驱动方法只编写了两条用例)

import unittest
from guanlixitong.HTMLTestRunner import HTMLTestRunner
if __name__ == '__main__':
    # 在这里完成测试用例的组织
    # suite = unittest.TestSuite()
    # # 只执行TestStudent的test_add_stu测试用例
    # suite.addTest(TestStudent('test_add_stu'))
    # 通常我们测试脚本会有很多个,存放在某个目录下,那么我们可以批量加载
    suite = unittest.defaultTestLoader.discover('guanlixitong','test*.py')
    # 加一个执行,右键执行才会出现
    # runner = unittest.TextTestRunner()
    # runner.run(suite)
    # 对于测试来说,最终我们需要一个比较直观的测试报告
    # 借助一个第三方的工具,来实现执行器,并生成测试报告
    # 重新创建一个执行器
    with open('testreport.html',mode='wb') as f:
        HTMLTestRunner(f,title='测试报告',description='这是个测试报告').run(suite)