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

news2024/12/26 12:36:53

一、什么是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

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1284058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Shell数组函数:数组(一)

一、数组简介: 变量:用一个固定的字符串,代替一个不固定字符串。数组:用一个固定的字符串,代替多个不固定字符串。 二、类型 普通数组:只能使用整数作为数组索引关联数组:可以使用字符串作为…

Web前端 ---- 【vue】vue 组件传值(props、全局事件总线、消息的订阅与发布)

目录 前言 父子组件 父传子 子传父 全局事件总线 什么叫全局事件总线 如何创建全局事件总线 如何在组件上获取到这个全局vc对象 最常用的创建全局事件总线 兄弟组件 消息订阅与发布 安装 使用 爷孙组件 前言 在上篇文章我们介绍了父子组件之间的传值通信&#xff…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础之发布者订阅者模式@Provide和@Consume(十三)

1、定义 在鸿蒙系统的官方语言ArkTS中,有一套类似于发布者和订阅的模式,使用Provide、Consume两个装饰器来实现。 Provide、Consume:Provide/Consume装饰的变量用于跨组件层级(多层组件)同步状态变量,可以…

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…

PHP项目启动记录

PHP项目启动记录 1. 项目整体目录2. bash_profile3. nginx的conf配置4. vim /etc/hosts5. php -v6.修改nginx后重新加载nginx7. npm run watch-app --moduleattendance --platformmobile8. vim ~/.zshrc 1. 项目整体目录 2. bash_profile ~/.bash_profile是Mac系统中的一个配置…

MySQL笔记-第06章_多表查询

视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第06章_多表查询1. 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积(或交叉连接)的理解1.3 案例分析与问题解决 2. …

B026-MySQL基础

目录 数据库概述数据库概念数据库的由来和发展常见的关系型数据库服务器(DBMS)SQL概述表的概念 数据库的安装与配置安装启动和连接MySQL启动MySQL服务连接MySQL MySQL图形化管理软件-Navicat数据库安装失败解决方案 MySQL数据库操作数据库操作和存储引擎…

4K-Resolution Photo Exposure Correction at 125 FPS with ~8K Parameters

MSLTNet开源 | 4K分辨率125FPS8K的参数量,怎养才可以拒绝这样的模型呢? 错误的曝光照片的校正已经被广泛使用深度卷积神经网络或Transformer进行广泛修正。尽管这些方法具有令人鼓舞的表现,但它们通常在高分辨率照片上具有大量的参数数量和沉…

Linux系统下Nginx的安装步骤

目录 Nginx简介Nginx的作用Nginx的安装方法方法一方法二方法三 本文主要介绍在Linux系统下,三种常见Nginx安装方法。 Nginx简介 Nginx是一个高性能的HTTP和反向代理服务器,也可以作为邮件代理服务器和通用的TCP/UDP代理服务器。它最初由Igor Sysoev创建…

JVM之垃圾回收与算法(四)

垃圾回收与算法 1.如何确定垃圾 1.1. 引用计数法 在 Java 中,引用和对象是有关联的。如果要操作对象则必须用引用进行。因此,很显然一个简单的办法是通过引用计数来判断一个对象是否可以回收。简单说,即一个对象如果没有任何与之关联的引用…

GPIO的使用--点亮外接小灯泡--开关控制

目录 一、确定引脚接线模式 接线时注意以下几点: 二、外接小灯泡引脚连接(以F12引脚为例) 1.正极接GPIOF3.3v电压引脚、负极接F12 2.正极接GPIOF3.3v电压引脚、负极接F12 三、问题检查 一、确定引脚接线模式 小灯泡有两级:正极、负极,…

春秋云镜:CVE-2022-28512

靶标介绍: Fantastic Blog (CMS)是一个绝对出色的博客/文章网络内容管理系统。它使您可以轻松地管理您的网站或博客,它为您提供了广泛的功能来定制您的博客以满足您的需求。它具有强大的功能,您无需接触任何代码即可启动并运行您的博客。 该…

决策树 算法原理

决策树 算法原理 决策树的原理 决策树: 从训练数据中学习得出一个树状结构的模型 决策树属于判别模型 决策树是一种树状结构,通过做出一系列决策 (选择) 来对数据进行划分,这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#…

JDK安装太麻烦?一篇文章搞定

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVMJava系统类库)和JAVA工具。 JDK包含的基本组件包括: javac – 编译器&#xf…

资深老鸟整理,高级测试工程师应具备的能力...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、业务熟悉 熟悉…

JVM:双亲委派(未完结)

类加载 定义 一个java文件从编写代码到最终运行,必须要经历编译和类加载的过程,如下图(图源自b站视频up主“跟着Mic学架构”)。 编译就是把.java文件变成.class文件。类加载就是把.class文件加载到JVM内存中,得到一…

Android Framework 电池提醒相关Dialog熄屏消失的问题

记录一下花了三四天干一天就能完成的需求的傻事。 说在前头,这篇文章记录了电池提醒dialog相关,弹出dialog且熄屏再亮屏dialog不会消失的代码,这篇废话比较多,看正常代码直接跳到代码3。 故事背景 需求要求添加非法电池的弹窗&a…

继承 多态 拆箱装箱 128陷阱 枚举类

继承 在java里一个类只能继承一个类,但可以被多个类继承;c里一个类可以继承多个类; 子类可以使用父类的方法; 在java中,Object是所有类的父类; equals方法比较的是对象是否指向同一个地方,这个方…

【VTKWidgetRepresentation】第二期 vtkHandleRepresentation

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文系统分享vtkHandleRepresentation及其子类,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步&am…

外包干了2个月,技术倒退2年。。。。。

先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…