第二篇 第一节 unittest框架的基本应用

unittest是Python自带的单元测试框架,在unittest库中,它自己封装  一些校验返回的结果方法和一些用例执行前的初始化操作

接下来,我们需要了解下unittest的几个概念:  

1.  TestCase 也就是测试用例

2.  TestSuite 多个测试用例集合在一起,就是TestSuite

3.  TestLoader是用来加载TestCase到TestSuite中的

4.   TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息

接下来,我们以一个简单例子来说明,用户注册:

1. 用户注册函数的逻辑代码在:register.py模块中

"""
用户注册要求如下:
1. 不允许注册相同用户名的账号,即:用户名唯一
2. 用户名长度在[6,15]之间,包含6和15
3. 密码长度不能小于6,且不能超过20;
"""
userinfo = {'Lujier': '123456', 'Lujier02': '234567'}

def register(username, password):
    if len(username) < 6 or len(username) > 15:
        return {'code': 2, 'msg': '用户名长度须在6-15内'}
    elif len(password) < 6 or len(password) > 20:
        return {'code': 3, 'msg': '密码长度须在6-20内'}
    elif username in userinfo.keys():
        return {'code': 1, 'msg': '该用户名已被使用'}
    else:
        userinfo[username] = password
        return {'code': 0, 'msg': '注册成功'}

2.  那我们开始设计测试用例:

1. 用户名长度小于6:
   测试数据:username = 'Luji'  password='1234567'
   预期结果: {'code': 2, 'msg': '用户名长度须在6-15内'}
2. 用户名长度大于15:
   测试数据:username = '1234567890123456'  password='1234567'
   预期结果: {'code': 2, 'msg': '用户名长度须在6-15内'}
3. 用户名已被注册:
   测试数据:username = 'Lujier'  password='1234567'
   预期结果: {'code': 1, 'msg': '该用户名已被使用'}
4. 密码长度小于6:
   测试数据: username = 'Lujier001'  password='12345'
   预期结果: {'code': 3, 'msg': '密码长度须在6-20内'}
5. 密码长度大于20:
   测试数据: username = 'Lujier001'  password='123456789012345678901'
   预期结果: {'code': 3, 'msg': '密码长度须在6-20内'} 
6. 成功注册:
   测试数据: username = 'Lujier001'  password='1234567'
   预期结果: {'code': 3, 'msg': '密码长度须在6-20内'}

3. 接下来,我们开始定义一个测试类:TestRegister  

import unittest
from register import *


class TestRegister(unittest.TestCase):

    def setUp(self):
        # 每一条用例执行前都会进行该操作,一般用于做初始化处理
        pass

    def tearDown(self):
        # 跟setUp()对应,每一条用例执行完成后都会进行该操作
        pass

    def test_register_001(self):
        # 用户名长度小于6
        data = ['Luji', '1234567']  # 测试数据
        expect_result = {'code': 2, 'msg': '用户名长度须在6-15内'}  # 预期结果
        actual_result = register(*data)  # 测试结果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_001测试失败,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_001用例执行成功")

    def test_register_002(self):
        # 用户名长度大于15
        data = ['1234567890123456', '1234567']  # 测试数据
        expect_result = {'code': 2, 'msg': '用户名长度须在6-15内'}  # 预期结果
        actual_result = register(*data)  # 测试结果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_002测试失败,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_002用例执行成功")

    def test_register_003(self):
        # 用户名已被注册
        data = ['Lujier', '1234567']  # 测试数据
        expect_result = {'code': 1, 'msg': '该用户名已被使用'}  # 预期结果
        actual_result = register(*data)  # 测试结果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_003测试失败,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_003用例执行成功")

    def test_register_004(self):
        # 密码长度小于6
        data = ['Lujier001', '12345']  # 测试数据
        expect_result = {'code': 3, 'msg': '密码长度须在6-20内'}  # 预期结果
        actual_result = register(*data)  # 测试结果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_004测试失败,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_004用例执行成功")

    def test_register_005(self):
        # 密码长度大于20
        data = ['Lujier001', '123456789012345678901']  # 测试数据
        expect_result = {'code': 3, 'msg': '密码长度须在6-20内'}  # 预期结果
        actual_result = register(*data)  # 测试结果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:           
            print("test_register_005测试失败,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_005用例执行成功")

    def test_register_006(self):
        # 成功注册
        data = ['Lujier001', '1234567']  # 测试数据
        expect_result = {'code': 0, 'msg': '注册成功'}  # 预期结果
        actual_result = register(*data)  # 测试结果
        try:
            self.assertEqual(actual_result, expect_result)
        except Exception as msg:
            print("test_register_006测试失败,原因:{}!".format(msg))
            raise msg
        else:
            print("test_register_006用例执行成功")

4  .  用例写好了,那么就到该如何运行用例了

第一种:可以直接在测试用例文件中运行


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

结果如下:

 

第二种:

将多个用例集合在一起,然后再进行运行

1) 新建一个py文件,用来做运行用例文件:run_suite.py

2) # 创建一个测试套件

       suite = unittest.TestSuite()

    # 加载测试用例,  共有4种方法

    

# 第一种,单个添加:接受的参数是测试用例对象
suite.addTest(TestRegister("test_register_001"))
suite.addTest(TestRegister("test_register_002"))
suite.addTest(TestRegister("test_register_003"))
suite.addTest(TestRegister("test_register_004"))
suite.addTest(TestRegister("test_register_005"))
suite.addTest(TestRegister("test_register_006"))


# 第二种,一次添加多条用例
suite.addTests([TestRegister("test_register_001"), TestRegister("test_register_002"),
                TestRegister("test_register_003"), TestRegister("test_register_004"),
                TestRegister("test_register_005"), TestRegister("test_register_006")])

# 第三种:一次添加一个测试类(类名不需要加引号)

# 创建一个加载测试测试用例对象
loader = unittest.TestLoader()
# 加载整个测试用例类
suite.addTest(loader.loadTestsFromTestCase(TestRegister))

# 第四种,模块添加

# 加载测试用例所在模块
suite.addTest(loader.loadTestsFromModule(test_register))

   3) 用例加载完成之后,就是执行用例了:

       先创建一个runner对象:        runnerr =unittest.TextTestRunner()

       运行:  runner.run(suite)

# 运行测试集合
runner = unittest.TextTestRunner()   # 创建一个runner对象
runner.run(suite)

运行结果如下:

以上,就是最基本的单元测试的过程,后续还会继续优化单元测试相关信息

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章