当前位置: 首页 > article >正文

单元测试-Unittest框架实践

文章目录

  • 1.Unittest简介
    • 1.1 自动化测试用例编写步骤
    • 1.2 相关概念
    • 1.3 用例编写规则
    • 1.4 断言方法
  • 2.示例
    • 2.1 业务代码
    • 2.2 编写测试用例
    • 2.3 生成报告
      • 2.3.1 方法1
      • 2.3.2 方法2

1.Unittest简介

Unittest是Python自带的单元测试框架,适用于:单元测试、Web自动化、App自动化、接口自动化等测试用例的开发与执行。

1.1 自动化测试用例编写步骤

1. 初始化	-	用例之前的动作
2. 执行		- 	具体用例逻辑
3. 断言		- 	校验用例执行结果
4. 清理		- 	用例执行后的动作

在unittest中,测试用例的执行顺序是依据ascill码来执行的

在Unittest框架下创建测试用例,步骤如下:
1) 创建test_开头单元测试用例模块。
2) 导入unittest模块。
3) 创建Test开头测试类。继承unittest.TestCase类。
4) 添加setUp()、tearDown()、setUpClass()、tearDownClass() 函数。
5) 创建test_测试方法。
6) 调用unittest.main()方法,该方法会搜索该模块下所有以test开头的测试用例方法并执行。

1.2 相关概念

概念:
1. test case:测试用例
  ——lass TestLogin(unittest.TestCase):  #继承unittest.TestCase类
2. test suite:测试套件/测试集
3. test loader:测试加载
4. test runner:运行器、执行器
5. fixture:夹具,前置准备和后置清理

1.3 用例编写规则

1. .py模块命名规则:test_
2. 用例类名命名规则:Test
3. 方法命名规则:def test_

1.4 断言方法

注意:
如果断言成功则该条测试用例通过;
断言失败则该条测试用例执行失败,且会抛出AssertionError错误;
以下断言方法中,都有一个msg参数,默认为None。如果msg参数有对应的值,则断言失败后该msg的值会作为失败信息返回,
如 assertEqual(a, b, msg="a与b不相等!")
断言方法含义
assertEqual(a, b)判断 a == b
assertNotEqual(a, b)判断 a != b
assertTrue(x)判断 bool(x) is True
assertFalse(x)判断 bool(x) is False
assertIs(a, b)判断 a is b
assertIsNot(a, b)判断 a is not b
assertIsNone(x)判断 x is None
assertIsNotNone(x)判断 x is not None
assertIn(a, b)判断 a in b
assertNotIn(a, b)判断 a not in b
assertIsInstance(a, b)判断 isinstance(a, b)
assertNotIsInstance(a, b)判断 not isinstance(a, b)

2.示例

2.1 业务代码

创建业务代码:calculator.py

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:05
Description:    

"""


class Math():
    def __init__(self, a, b):
        self.a = int(a)
        self.b = int(b)

    def sum(self):
        # 求和
        return self.a + self.b

    def sub(self):
        # 求差
        return self.a - self.b

2.2 编写测试用例

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:07
Description:    

"""

import unittest
from example_unittest.calculator import Math


class TestSum(unittest.TestCase):
    """测试Math类中的sum方法"""

    # 注意装饰器必须要有
    @classmethod
    def setUpClass(cls):
        # 作用于测试类
        print(f"开始执行测试用例类:{cls.__name__}...")

    @classmethod
    def tearDownClass(cls):
        # 作用于测试类
        print(f"测试用例{cls.__name__}类执行结束。")

    def setUp(self) -> None:
        # 作用于测试方法
        # 每个用例执行前,都会执行一次,用于初始化测试环境
        print(f"开始执行测试用例:{self._testMethodName}...")

    def tearDown(self) -> None:
        # 作用于测试方法
        # 每个用例执行后,都会执行一次,用于清理测试环境
        print(f"测试用例{self._testMethodName}执行结束。")

    def test_sum01(self):
        # 使用正数进行测试
        m = Math(3, 4)
        self.assertEqual(m.sum(), 7)

    def test_sum02(self):
        # 使用负数进行测试
        m = Math(-1, -2)
        self.assertEqual(m.sum(), -3)

    def test_sum03(self):
        # 使用正负数混合进行测试
        m = Math(3, -4)
        self.assertEqual(m.sum(), -1)

    def test_sum04(self):
        # 使用浮点数进行测试
        try:
            m = Math(3.5, 4.6)
        except AssertionError as e:
            print(f"执行用例失败:{e}")
        else:
            self.assertNotEquals(m.sum(), 8.1)

    def test_sum05(self):
        # 使用零进行测试
        m = Math(0, 0)
        self.assertEqual(m.sum(), 0)

    def test_sum06(self):
        # 使用整型和字符串进行测试
        with self.assertRaises(ValueError):
            Math("a", "b")

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

2.3 生成报告

2.3.1 方法1

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:36
Description:    

"""
import unittest
# 导入测试用例模块
from testcase.test_sum import TestSum

# 方法1:
# 第一步:创建TestSuite实例
# suite = unittest.TestSuite()

# 第二步:将测试用例添加至TestSuite
# 方式1,添加单条测试用例
# suite.addTest(TestSum('test_sum01'))  # addTest()里参数格式为:测试类('测试方法')
# suite.addTest(TestSum('test_sum02'))

# 方式2,添加多条测试用例
# suite.addTests([TestSum('test_sum01'), TestSum('test_sum02')])

# 方法2:
# 创建一个加载对象
# loader = unittest.TestLoader()
# suite.addTest(loader.loadTestsFromTestCase(TestSum))

# 方法3:不需要创建unittest.TestSuite()
test_dir = './testcase'
suite = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

# 第三步:创建TextTestRunner实例
# 创建TextTestRunner实例
# runner = unittest.TextTestRunner()
# 使用run()方法运行测试套件(即运行测试套件中的所有用例)
# runner.run(suite)


# 生成测试报告:HTMLTestRunner无法安装,不能使用
# import HTMLTestRunner
# with open('./report/report.html', 'wb') as f:
#     runner = HTMLTestRunner.HTMLTestRunner(stream=f, title="测试报告", description="测试描述")
#     runner.run(suite)

#导入BeautifulReport模块,这个模块也是生成报告的模块,但是比HTMLTestRunner模板好看
# pip3 install BeautifulReport
# from BeautifulReport import BeautifulReport as bf
#
# run = bf(suite) #实例化BeautifulReport模块
# run.report(filename='test',description='这个描述参数是必填的')


# 测试报告模板运行程序:unittestreport
# pip3 install unittestreport
import unittestreport
runner = unittestreport.TestRunner(suite, filename="report.html",
                 report_dir="./reports",
                 title='测试',
                 tester='张三',
                 desc="自测使用",
                 templates=4)
runner.run()

在这里插入图片描述

2.3.2 方法2

# -*- coding: utf-8 -*-
"""
Author: zhangsan
date:   2024/12/18 14:36
Description:    

"""
import unittest
# 导入测试用例模块
from testcase.test_sum import TestSum

# 方法1:
# 第一步:创建TestSuite实例
# suite = unittest.TestSuite()

# 第二步:将测试用例添加至TestSuite
# 方式1,添加单条测试用例
# suite.addTest(TestSum('test_sum01'))  # addTest()里参数格式为:测试类('测试方法')
# suite.addTest(TestSum('test_sum02'))

# 方式2,添加多条测试用例
# suite.addTests([TestSum('test_sum01'), TestSum('test_sum02')])

# 方法2:
# 创建一个加载对象
# loader = unittest.TestLoader()
# suite.addTest(loader.loadTestsFromTestCase(TestSum))

# 方法3:不需要创建unittest.TestSuite()
test_dir = './testcase'
suite = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')

# 第三步:创建TextTestRunner实例
# 创建TextTestRunner实例
# runner = unittest.TextTestRunner()
# 使用run()方法运行测试套件(即运行测试套件中的所有用例)
# runner.run(suite)


# 生成测试报告:HTMLTestRunner无法安装,不能使用
# import HTMLTestRunner
# with open('./report/report.html', 'wb') as f:
#     runner = HTMLTestRunner.HTMLTestRunner(stream=f, title="测试报告", description="测试描述")
#     runner.run(suite)

#导入BeautifulReport模块,这个模块也是生成报告的模块,但是比HTMLTestRunner模板好看
# pip3 install BeautifulReport
from BeautifulReport import BeautifulReport as bf

run = bf(suite) #实例化BeautifulReport模块
run.report(filename='test',description='这个描述参数是必填的')


# 测试报告模板运行程序:unittestreport
# pip3 install unittestreport
# import unittestreport
# runner = unittestreport.TestRunner(suite, filename="report.html",
#                  report_dir="./reports",
#                  title='测试',
#                  tester='张三',
#                  desc="自测使用",
#                  templates=4)
# runner.run()

在这里插入图片描述


http://www.kler.cn/a/443335.html

相关文章:

  • Spring项目创建流程及配置文件bean标签参数简介
  • nginx 日志规范化意义及实现!
  • 用户界面软件02
  • TensorRT-LLM中的MoE并行推理
  • 如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]
  • BloombergGPT: A Large Language Model for Finance——面向金融领域的大语言模型
  • android RadioButton + ViewPager+fragment
  • 【Web】PolarCTF2024秋季个人挑战赛wp
  • KMP算法基础
  • 【Lua热更新】下篇 -- 更新中
  • Webpack常见的Plugin有哪些?
  • Java 初学者的第一个 SpringBoot3.4.0 登录系统
  • 【安当产品应用案例100集】032-重塑企业SaaS平台的PostgreSQL凭据管理体系
  • Running CMake (运行 CMake)
  • C语言学习day24:DLL给程序打上窗口破解补丁
  • 借助腾讯云质检平台的新范式,做工业制造企业质检的“AI慧眼”
  • ofd转pdf ofd转图片 python脚本(非ai生成,实测可转换)
  • arduino继电器与电机水泵的使用
  • IDEA能够从mapper跳转到xml的插件
  • 微信小程序TTS解决方案
  • 告别数据查询瓶颈!PostgreSQL 多表连接与复杂条件解析
  • 大连理工大学经济管理学院冠名讲席教授捐赠与聘任仪式圆满举行,乐凡信息成为“冠名讲席教授项目”首捐企业!
  • simpleperf生成火焰图的步骤
  • Python如何正确解决reCaptcha验证码(9)
  • 揭开 Choerodon UI 拖拽功能的神秘面纱
  • 【容器】k8s学习笔记基础部分(三万字超详细)