学习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今天的分享就到此结束了,点赞关注不迷路~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++基础 -46- 类的静态函数成员

类的静态函数成员可以不创建类直接访问 #include "iostream"using namespace std;class base {public:static void show(){cout << "hello world" << endl;} };int main() {base::show(); }类的静态函数成员不能访问非静态成员 class base…

一维卡尔曼滤波(C++)

文章目录 头文件Cppexample 头文件 /*Copyright(C) 2019- White Noise TeamOne dimensional Kalman Filter implementation foruse with BNO055 IMU to filter noisy gyro andaccelerometer measurements.This software is distributed under the MIT LicenseThis file includ…

Elasticsearch:向量搜索的优势 — 以及 IT 领导者需要它来改善搜索体验的 5 个原因

作者&#xff1a;Evan Castle 与谷歌和亚马逊等高质量搜索引擎的频繁互动提高了客户对快速且相关搜索的期望。 向量搜索&#xff08;也称为语义向量搜索&#xff09;利用深度学习和机器学习来捕获数据的含义和上下文。 向量搜索的好处 向量搜索可以增强公司的搜索体验并带来广…

RobotFramework编写用例,在Jenkins上如何实现用例的并发运行?

我们了解RobotFramework编写自动化测试用例的方法&#xff0c;了解如何将用例在Jenkins上运行。 但是&#xff0c;随着用例的增多&#xff0c;传统的pybot/robot命令运行测试用例会耗费大量的时间&#xff0c;这就慢慢成为了一个苦恼的问题。 那么&#xff0c;在Jenkins上如何…

基于深度学习CRNN的水表读数识别系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着科技的不断发展&#xff0c;深度学习技术在各个领域都取得了显著的成果。其中&#xff0c;基于深度学习的图像识别技术在计算机视觉领域具有重要的应用价值。…

249:vue+openlayers 坐标转地址,点击后在弹窗显示

第249个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中点击某点,转化经纬度坐标为地址信息,弹窗显示。 通过点击地图,获取到经纬度坐标,然后通过调取mapbox的地址转换API,将经纬度坐标转化为地址信息,通过overlay的方式,在弹窗中展示出来。 直接复制下面的…

11.机器人系统仿真搭建gazebo环境、仿真深度相机、雷达、RGB相机

目录 1 gazebo仿真环境搭建 1.1 直接添加内置组件创建仿真环境 1.2 urdf、gazebo、rviz的综合应用 2 ROS_control 2.1 运动控制实现流程(Gazebo) 2.1.1 已经创建完毕的机器人模型&#xff0c;编写一个单独的 xacro 文件&#xff0c;为机器人模型添加传动装置以及控制器 …

阿里大佬讲解的接口自动化测试框架pytest系列——pluggy插件源码解读:hook钩子函数调用执行过程分析

经过pluggy源码解读系列1-4的分析&#xff0c;已经完成插件定义、spec定义&#xff0c;插件注册等环节&#xff0c;下面就到了调用插件执行了&#xff0c;即hook钩子函数是如何被调用执行的&#xff0c;下面还是先把pluggy使用的代码放下面&#xff1a; import pluggy# Hooksp…

Esxi6.0 安装web管理界面

安装6.0之后默认是vSphere Client进行远程连接&#xff0c;需要安装客户端&#xff0c;不是太方便。搜索发现还真可以实现web管理&#xff0c;步骤如下&#xff1a; 1、开启esxi的ssh&#xff0c;步骤如下图&#xff1a; 2、下载升级包esxui-signed-7119706.vib&#xff0c;上…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动&#xff1a; 从MySQL官网下载最新的MySQL Connector/J&#xff0c;并将其解压到某个目录&#xff0c;比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径&#xff1a; 将JDBC驱动添加到类路径&#xff0c;可以使用以下命令&#xff1a; export CLA…

gmid方法设计五管OTA二级远放

首先给出第一级是OTA&#xff0c;第二级是CS的二级运放电路图&#xff1a; gmid的设计方法可以根据GBW、Av、CL来进行电路设计&#xff0c;因此在设计电路之前需要以上的参数要求。 1、为了满足电路的相位裕度至少60&#xff0c;需要对GBW、主极点、零点进行分析。 首先给出其…

解决npm install时报:gyp ERR! configure error

报错内容&#xff1a; npm ERR! gyp ERR! cwd C:\Users\zccbbg\code\my\examvue\node_modules\node-sass npm ERR! gyp ERR! node -v v16.13.1 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok npm ERR! Build failed with error code: 1 解决办法&#xff1a;…

Jmeter接口测试 —— jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

一对一聊天

1.创建包 1.服务界面 package yiduiy;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.uti…

OkGo导入失败解决办法

jcenter()maven { url "https://jitpack.io" }再同步就可以了

LeetCode Hot100 207.课程表

题目&#xff1a; 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习…

docker:安装mysql以及最佳实践

文章目录 1、拉取镜像2、运行容器3、进入容器方式一方式二方式三容器进入后连接mysql和在宿主机连接mysql的区别 持久化数据持久化数据最佳实践 1、拉取镜像 docker pull mysql2、运行容器 docker run -d -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD123456 …

antdesign前端一直加载不出来

antdesign前端一直加载不出来 报错&#xff1a;Module “./querystring” does not exist in container. while loading “./querystring” from webpack/container/reference/mf at mf-va_remoteEntry.js:751:11 解决方案&#xff1a;Error: Module “xxx“ does not exist …

分布式锁常见实现方案

分布式锁常见实现方案 基于 Redis 实现分布式锁 如何基于 Redis 实现一个最简易的分布式锁&#xff1f; 不论是本地锁还是分布式锁&#xff0c;核心都在于“互斥”。 在 Redis 中&#xff0c; SETNX 命令是可以帮助我们实现互斥。SETNX 即 SET if Not eXists (对应 Java 中…

【开源】基于Vue+SpringBoot的用户画像活动推荐系统

项目编号&#xff1a; S 061 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S061&#xff0c;文末获取源码。} 项目编号&#xff1a;S061&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活…