Unittest框架及原理

Unittest框架及原理

unittest 是python自带的一套测试框架,具备编写用例,收集用例,执行用例及输出报告的功能。

unittest框架

TestFixure():通过使用测试夹具,可以定义在单个或者多个测试执行之前的准备工作和测试执行后的清理工作。

Testcase():测试用例,unittest中提供了一个基本类TestCase,可以用来创建新的测试用例,一个TestCase的实例就是一个测试用例;unittest中测试用例方法都是以test开头的,且执行顺序会按照方法名的ASCII值排序。0~9<A~Z<a~z

TestSuite():测试套件,用来把需要一起执行的测试用例集中放到一块执行,相当于一个篮子。我们可以使用TestLoader来加载测试用例到测试套件中。

TestRunner():测试执行器负责测试执行调试并且生成测试结果给用户。测试执行器可以使用图形界面、文本界面或者特定的返回值来展示测试执行结果,例如HTMLTestRunner

安装方法:cmd命令窗口+pip install HTMLTestRunner

断言

​ 在python基础中,我们有讲过一个assert断言,使用方法比较简单,即assert 表达式, 提示信息,而unittest框架中也提供了一个自带的断言方式,主要有以下几种:

方法检查
assertEqual(a,b,msg=None)a == b
assertNotEqual(a,b,msg=None)a != b
assertTure(x,msg=None)Bool(x) is True
assertFalse(x,msg=None)Bool(x) is False
assertIs(a,b,,msg=None)a is b
assertIsNot(a,b,,msg=None)a is not b
assertIsNone(x,msg=None)x is None
assertIsNotNone(x,msg=None)x is not None
assertIn(a,b,msg=None)a in b
assertNotIn(a,b,msg=None)a not in b

 TestCase测试用例

1.导入unittest模块  

import unittest

2.创建测试类继承unittest

import unittest

class Test_xxx(unittest.TestCase)

3.定义测试方法,方法(函数)名必须以test_开头

通过unittest.main()运行测试用例,unittest.main()会搜索所有以test开头的测试用例方法并自动执行

import unittest
class Test_XXX(unittest.TestCase):
def test_xxx(self):
    pass

实战:注册功能

# register.py

users = [{'username': 'test', 'password': '123456'}]

def register(username, password1, password2):

    if not all([username, password1, password2]):

        return {"code": 0, "msg": "所有参数不能为空"}

    # 注册功能

    for user in users:

        if username == user['username']:

            return {"code": 0, "msg": "该用户名已存在!"}

    else:

        if password1 != password2:

            return {"code": 0, "msg": "两次密码输入不一致!"}

        else:

            if 6 <= len(username) >= 6 and 6 <= len(password1) <= 18:

                users.append({'username': username, 'password': password2})

                return {"code": 1, "msg": "注册成功"}

            else:

                return {"code": 0, "msg": "用户名和密码必须在6-18位之间"}

编写测试用例

# test_register.py

import unittest

from register import register   # 导入被测试的代码


class TestRegister(unittest.TestCase):

    """注册接口测试用例类"""


    def test_register_success(self):

        """注册成功"""

        data = ("mikitest", "miki123", "miki123")   # 测试数据

        expected = {"code": 1, "msg": "注册成功"}   # 预期结果

        result = register(*data)    # 把测试数据传到被测的代码,接收实际结果

        self.assertEqual(expected, result)  # 断言,预期和实际是否一致,一致即用例通过


    def test_username_isnull(self):

        """注册失败-用户名为空"""

        data = ("", "miki123", "miki123")

        expected = {"code": 0, "msg": "所有参数不能为空"}

        result = register(*data)

        self.assertEqual(expected, result)


    def test_username_lt6(self):

        """注册失败-用户名大于18位"""

        data = ("mikitestmikitestmikitest", "miki123", "miki123")

        expected = {"code": 0, "msg": "用户名和密码必须在6-18位之间!"}

        result = register(*data)

        self.assertEqual(expected, result)	# 这条用例应该是不通过的,注册代码bug


    def test_pwd1_not_pwd2(self):

        """注册失败-两次密码不一致"""

        data = ("miki123", "test123", "test321")

        expected = {"code": 0, "msg": "两次密码输入不一致!"}

        result = register(*data)

        self.assertEqual(expected, result)


# 如果直接运行这个文件,需要使用unittest中的main函数来执行测试用例

if __name__ == '__main__':

    unittest.main()

​TestFixure():测试夹具 

unittest的测试夹具有两种使用方式,一种是以测试方法为维度的setUp()tearDown(),一种是以测试类为维度的setUpClass()tearDownClass()

# test_register.py

import unittest

from register import register   # 导入被测试的代码

class TestRegister(unittest.TestCase):

    """注册接口测试用例类"""

    def setUp(self):

        # 每条用例执行之前都会执行

        print("用例{}开始执行--".format(self))

    def tearDown(self):

        # 每条用例执行之后都会执行

        print("用例{}执行结束--".format(self))

    @classmethod	# 指明这是个类方法以类为维度去执行的
    def setUpClass(cls):

        # 整个测试用例类中的用例执行之前,会先执行此方法

        print("-----setup---class-----")
    @classmethod
    def tearDownClass(cls):

        # 整个测试用例类中的用例执行完之后,会执行此方法

        print("-----teardown---class-----")

    def test_register_success(self):

        """注册成功"""
        data = ("mikitest", "miki123", "miki123")   # 测试数据
        expected = {"code": 1, "msg": "注册成功!"}   # 预期结果
        result = register(*data)    # 把测试数据传到被测的代码,接收实际结果
        self.assertEqual(expected, result)  # 断言,预期和实际是否一致,一致即用例通过

    def test_username_isnull(self):

        """注册失败-用户名为空"""
        data = ("", "miki123", "miki123")
        expected = {"code": 0, "msg": "所有参数不能为空!"}
        result = register(*data)
        self.assertEqual(expected, result)


# 如果直接运行这个文件,需要使用unittest中的main函数来执行测试用例

if __name__ == '__main__':

    unittest.main()

TestSuite():测试套件

  • 🍊unittest.TestSuite()
    • addTest():添加单个测试用例方法
    • addTest([..]):添加多个测试用例方法,方法名存在一个列表
  • 🍊 unittest.TestLoader()
    • loadTestsFromTestCase(测试类名):添加一个测试类
    • loadTestsFromModule(模块名):添加一个模块
    • discover(测试用例的所在目录):指定目录去加载,会自动寻找这个目录下所有符合命名规则的测试用例
# run_test.py,与test_register.py、register.py同一目录下

import unittest

import test_register


# 第一步,创建一个测试套件

suite = unittest.TestSuite()


# 第二步:将测试用例,加载到测试套件中

# 方式1,添加单条测试用例

# case = test_register.TestRegister("test_register_success")	# 创建一个用例对象,注意:通过用例类去创建测试用例对象的时候,需要传入用例的方法名(字符串类型)

# suite.addTest(case)	# 添加用例到测试套件中


# 方式2,添加多条测试用例

# case1 = test_register.TestRegister("test_register_success")

# case2 = test_register.TestRegister("test_username_isnull")

# suite.addTest([case1, case2])	# 添加用例到测试套件中


# 方式3,添加一个测试用例类

# loader = unittest.TestLoader()	# 创建一个加载对象

# suite.addTest(loader.loadTestsFromTestCase(test_register.TestRegister))

# 方式4,添加一个模块

loader = unittest.TestLoader()	# 创建一个加载对象

suite.addTest(loader.loadTestsFromModule(test_register))


# 方式5,指定测试用例的所在的目录路径,进行加载

# loader = unittest.TestLoader()

# suite.addTest(loader.discover(r"d:\learn\python"))

# 方式6 自定义匹配规则加载用例,匹配所有以test开头的文件

# loader = unittest.TestLoader()
# suite.addTest(loader.discover(r"d:\learn\python",pattern="test_case*.py"))

TestRunner()执行用例

执行用例并生成测试报告,报告可以试text文本或者html格式

#HTMLTestRunner

#文本报告
#from HTMLTestRunnerNew import HTMLTestRunner
# runner = unittest.TextTestRunner()
# runner.run(suite)#传套件对象
#Html报告
# runner = HTMLTestRunner(open("report.html","wb"), tester="花花", title="测试结果")
# runner.run(suite)#传套件对象

#unittestReport

https://gitee.com/lemon-test-official
from unittestreport import TestRunner
# 创建测试运行程序
runner = TestRunner(suite, filename="report.html", report_dir=".", templates=1)
# 运行用例,生成测试报告
runner.run()

#BeautifulReport

https://github.com/TesterlifeRaymond/BeautifulReport
# from BeautifulReport.BeautifulReport import BeautifulReport
# runner = BeautifulReport(suite) # 传套件对象
# runner.report("单元测试", filename="report.html")

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值