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

学习UnitTest框架,轻松打造无懈可击的代码!

一、什么是UnitTest?

1、介绍

unittest是Python自带的一个单元测试框架,它可以做单元测试,也能用于编写和运行重复的测试工作。

它给自动化测试用例开发和执行提供了丰富的断言方法,判断测试用例是否通过,并最终生成测试结果。

2、核心要素

  1. TestCase
  2. TestSuite
  3. TestLoader
  4. Fixture
  5. TestRunner

二、简单使用UnitTest

1、简单分层

测试一般由三或四部分构成:被测的对象+测试用的方法+测试报告(+数据),一般有几个构成便需要几个文件

2、被测的对象

文件名:xxx.py

被测的对象可能是一段普普通通的函数

def A(put): # 一个普普通通的函数
    if put == 1:
        return "成功"
    else:
        return "失败"

3、测试用的方法

文件名:test.py

  1. 先导包:unittest包和被测对象所在的包
  2. 定义测试类:建一个测试类,继承unittest.TestCase
  3. 定义测试方法:命名为test开头
# 导包
import unittest

from xxx import A


# 定义测试类
class TestA(unittest.TestCase):
    # 定义测试方法
    def test_A_1(self):
        self.assertEqual("成功", A(1)) # 引用被测对象

    def test_A_2(self):
        self.assertEqual("失败", A(2))

4、测试报告

文件名:suite.py

一般和testsuite结合,至于testsuite是什么?就是明确测试的范围,将需要被测试的用例组织起来。当然,得先用testsuite才知道报告所需要报告的用例范围

import unittest

from htmltestreport import HTMLTestReport

from test import TestA

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestA))

runner = HTMLTestReport('./report.html','测试报告','描述')
runner.run(suite)
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036【暗号:csdn999】

三、进阶用法

1、fixture

对一个测试用例环境的初始化和销毁

  1. 方法级别的 setUp(self) tearDown(self) 每个普通方法执行 之前/之后 自动运行。(运行次数和“def”的数量相关)
  2. 类级别的 setUpClass(cls) tearDownClass(cls) 在类内所有方法直 之前/之后 运行一次。(运行次数和“class”的数量相关)

简单来说,在测试集的首尾运行或者在每个测试用例前后执行

import unittest

from xxx import A


class TestA(unittest.TestCase):
    def setUp(self) -> None:
        print("\n前SetUp")

    def tearDown(self) -> None:
        print("后TearDown")

    @classmethod
    def setUpClass(cls) -> None:
        print("首setUpClass")

    @classmethod
    def tearDownClass(cls) -> None:
        print("尾tearDownClass")

    def test_A_1(self):
        print("测试_A_1")
        self.assertEqual("成功", A(1))

    def test_A_2(self):
        print("测试_A_2")
        self.assertEqual("失败", A(2))

测试结果:

============================= test session starts =============================
collecting ... collected 2 items

test.py::TestA::test_A_1 首setUpClass
PASSED                                          [ 50%]
前SetUp
测试_A_1
后TearDown

test.py::TestA::test_A_2 PASSED                                          [100%]
前SetUp
测试_A_2
后TearDown
尾tearDownClass


======================== 2 passed, 1 warning in 0.01s =========================

2、参数化

使用parameterized库

import unittest

from parameterized import parameterized  # 1、引入包

from xxx import A

data = [1]  # 2、设置一个参数


class TestA(unittest.TestCase):

    @parameterized.expand(data)  # 3、在这里注明
    def test_A_1(self, data_in):  # 4、加入对应形参
        print("测试_A_1")
        self.assertEqual("成功", A(data_in))  # 5、别忘记更改断点里的内容

因为parameterized库读取的数据固定为元组,格式为 [(参数), (参数), (参数)] ,其他格式的数据需要进行转化,可以添加以下方法用于读取json格式的数据

import json


# 方法一:用于打开内容为[[参数], [参数], [参数]]的文件
def add_1(file):
    with open(file) as f:
        data = json.load(f)

    return data


# 方法二:用于打开内容为[{参数}, {参数}, {参数}]的文件,用的较多
def add_2(file):
    with open(file, "r", encoding="utf-8") as f:
        data_list = json.load(f)

        new_list = []
        for data in data_list:
            new_list.append(tuple(data.values()))

        return new_list

如果不是读取文件,直接读取数据并转化为元组的话,可以使用以下方法

import json


# 方法一:用于转化[[参数], [参数], [参数]]
def add_1(test_data):
    data = json.load(test_data)
    return data


# 方法二:用于转化[{参数}, {参数}, {参数}],用的较多
def add_2(test_data):
    new_list = []
    for data in test_data:
        new_list.append(tuple(data.values()))

    return new_list

END今天的分享就到此结束了,点赞关注不迷路~


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

相关文章:

  • 标准C++ 字符串
  • C++初阶:类和对象(上)
  • 除了 Postman,还有什么好用的 API 调试工具吗
  • 阿里巴巴通义灵码推出Lingma SWE-GPT:开源模型的性能新标杆
  • Elasticsearch可视化工具Elasticvue插件用法
  • 【日志】392.判断子序列
  • 外包干了2个月,技术倒退2年。。。
  • MySQL四 | 约束
  • C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)
  • ZPLPrinter Emulator SDK for .NET 6.0.23.1123​ Crack
  • 数据科学:Scipy、Scikit-Learn笔记
  • 汽车内饰灯不亮问题修复
  • Redis滚动分页的使用
  • MySQL Binlog Digger 4.31
  • ubuntu上创建服务启动python脚本
  • visual Studio MFC 平台实现拉普拉斯和拉普拉斯与直方图均衡化与中值滤波相结合实现比较
  • Codeforces Round 913 (Div. 3) A~E
  • 通过docker安装人大金仓数据库并挂在数据卷
  • LeetCode860. Lemonade Change
  • crui_lvgl 一个LVGL的DSL辅助工具的设想
  • Gluster ubuntu安装
  • TCP报文解析
  • C# 图片下载工具类
  • 查收查引(通过文献检索开具论文收录或引用的检索证明)
  • pycharm上传代码至gitLab
  • 逻辑漏洞之越权漏洞