一、单元测试

单元测试的定义
1: 什么是单元测试?
按照定义:单元测试就是对单个模块或者是单个类或者是单个函数进行测试,一般是开发做的,按照阶段来分,一般就是单元测试,集成测试,系统测试,验收测试。
2: 为什么要做单元测试?
1)单元测试之后,才是集成测试,单个单个的功能模块测试通过之后,才能把单个功能模块集成起来做集成测试为了从底层发现bug,减少合成后出现的问题。
2)越早发现bug越好,这样可以早点发现问题,不然问题累计到后面,如果做错了就要推倒重来-对于时间和经费来说,是非常浪费的!
对于我们测试来说: 我们就单元测试是为了执行测试用例!
输入测试数据---->输出测试结果

二、unittest框架以及原理介绍

1、unittest框架最核心的四个概念:
TestCase:一个testcase的实例就是一个测试用例。
TestSuite: 多个测试用例集合在一起。TestLoader: 是用来加载TestCase到TestSuite中的。
TextTestRunner: 用来执行测试用例的。
fixture: 测试用例环境的搭建和销毁。测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。
2、单元测试案例
关于登录的一个测试需求:

"""
=======================
author:185のYOGA
time:2023-1-28
======================
"""
def login_check(username,password):
    """
    :param username:
    :param password:
    :return:
    """
    if 6 <= len(password) <= 18:
        if username == 'username' and password == 'password':
            return {"code":0,"msg":"登录成功"}
        else:
            return {"code":1,"msg":"账号或密码错误"}
    else:
        return {"code":1,"msg":"密码长度在6-18位之间"}

设计用例测试上面的登录校验功能
1、账号、密码正确
2、账号正确,密码在6-18之间(错误的密码)
3、账号正确、密码长度大于18
4、账号正确、密码长度少于6
5、错误的账号,密码正确
三、编写测试用例
1、TestCase类编写测试用例
继承unittest里面的TestCase类,继承这个类,写能写的测试用例。每个用例我们都要记得引入fixture,做一些准备以及结束的工作。
编写用例步骤如下:

  • 导入unittest模块、检测文件或者其中的类
  • 创建一个测试类,并继承unittest.TestCase
  • 重写setUp和tearDown方法(如果有初始化条件和结束条件)
  • 定义测试函数,函数名以test开头,测试用例。
  • 调用unittest.main()方法运行测试用例。
"""
=======================
author:185のYOGA
time:2023-1-28
=======================
"""
from common.login import login_check
import unittest
class LoginTestCase(unittest.TestCase):
    def setUp(self):
        print('执行每条用例之前都会执行这个方法,可以使用这个方法做测试之前的环境准备')
    def tearDown(self):
        print('每条用例执行完成之后都会执行这个方法,用来恢复环境')

#一个测试用例就是该类中的一个方法
#测试用例的方法名必须是以test开头
    def test_login(self):
        # 账号密码结果都正确
        # 预期结果
        excepted = {"code":0,"msg":"登录成功"}
        #参数:data
        data = ('username' , 'password')
        #调用被测试的功能函数,传入参数,获取实际结果
        res = login_check(*data)
        #进行一个异常捕获
        try:
            self.assertEqual(excepted,res)
        except AssertionError as e:
            print('该测试用例未通过')
            res = '未通过'
        #用raise语句来引发一个异常,为什么用raise可以自行百度
            raise e
        else:
            print('该测试用例通过')
            res = '通过'

四:测试用例的集合
1、TestSuite&TestLoader的使用
TestSuite:测试集,把所有的用例都存进来。常用的方法如下:
unittestTestSuite()
方法一: addTest() 添加一个测试用例
方法二: addTests(L.]) 添加多个测试用例 添加用例的方式是一样的unittest.TestLoader()
方法三: unittestTestLoader.loadTestsFromModule(模块名)不需要加引号 (注意要导入模块)
方法四: unittest.TestLoader.loadTestsFromTestCase(测试类名)不需要加引号

"""
=======================
author:185のYOGA
time:2023-1-28
=======================
"""
import unittest
from common.Test_login import LoginTestCase
from common import  Test_login
#创建一个测试集合
suite = unittest.TestSuite()
#方法一:单个用例添加
# suite.addTest(LoginTestCase('test_login'))
# suite.addTest(LoginTestCase('test_username_error'))
# suite.addTest(LoginTestCase('test_password'))
#方法二:一次添加多条测试用例
# suite.addTests([LoginTestCase('test_login'),LoginTestCase('test_username_error'),LoginTestCase('test_password')])
#方法三:一次添加一个测试用例类
loader = unittest.TestLoader()
# suite.addTest(loader.loadTestsFromTestCase(LoginTestCase))
# 方法四:通过模块去添加测试用例
suite.addTest(loader.loadTestsFromModule(Test_login))
#创建一个runner对象,测试用例集合完毕之后需要用到TextTestRunner里面run进行执行
runner = unittest.TextTestRunner()
#这里传入测试集合执行
runner.run(suite)