【Python】Python单元测试

news2024/11/26 14:46:50

文章目录

    • 01-单元测试基础
      • 什么是单元测试
      • 常用的文件结构
      • 运行单元测试
    • 02. 断言函数
    • 03. Test Fixtures
      • 什么是Test Fixtures
      • 模块级别的Fixtures
      • 类级别的Fixtures
      • 方法级别的Fixtures
    • 04.Mock

01-单元测试基础

  1. 什么是单元测试
  2. 常用的文件结构
  3. 编写第一个单元测试
  4. 运行单元测试

什么是单元测试

单元测试是指一个自动化的测试:

  1. 用来验证一小段代码(单元)的正确性,例如只测试某个函数写的是否正确
  2. 可以快速执行
  3. 在独立的环境中执行

常用的文件结构

在这里插入图片描述

  1. myprj是项目代码目录 tests是单元测试代码目录,一般来说测试代码与项目代码文件目录结构一样
  2. tests/basictest_calculator.py必须以test_开头,因为测试的工具会寻找所有以test开头的文件,把他们当作单元测试文件运行,这算是一个规范

运行单元测试

myprj.basic中calculator.py代码:

class Calculator:
    def add(self, *args):
        res = 0

        for n in args:
            res += n

        return res

tests.basic中test_calculator.py代码:

import unittest
from myprj.basic.calculator import Calculator
"""
    文件要用"test_"开头
    测试类名要用"Test"开头
"""
class TestCalculator(unittest.TestCase):
    def test_add(self):
        """测试类方法必须用"test_"开头
            通常分为三部分:
                setup
                action
                assert
        """
        # setup
        cal = Calculator()
        excepted_result = 10  # 期望输出为10

        # action
        actual_result = cal.add(2,3,5)

        # assert 判断执行结果与期望结果是否相等,如果不相等,则测试失败
        # 说明代码有问题
        self.assertEqual(excepted_result, actual_result)

为了方便的运行测试:

pip install nose
pip install coverage

# 运行一个测试文件
python -m unittest -v tests.basic.test_calculator
# 运行所有测试文件
nosetests --with-doctest -v tests/basic/
# 统计测试覆盖率
nosetests --with-coverage --cover-erase -v tests/

也可以使用pytest:

pytest --doctest-modules tests/

02. 断言函数

常用断言函数:
在这里插入图片描述

03. Test Fixtures

  1. 什么是Test Fixtures
  2. 模块级别的Fixtures
  3. 类级别的Fixtures
  4. 方法级别的Fixtures

什么是Test Fixtures

在测试之前或者之后执行的函数或者方法被称之为Test Fixtures
比如:在测试前需要先连接数据库,在测试后需要断开与数据建库的连接

模块级别的Fixtures

setUpModule() 在整个模块执行之前需要执行的函数
tearDownModule() 在整个模块执行结束之后需要执行的函数

import unittest
from myprj.fixtures.bank_account import BankAccount

def setUpModule():
    print("calling setUpModule")

def tearDownModule():
    print("calling tearDownModule")

class TestBankAccount(unittest.TestCase):
    def test_deposit_success(self):
        bank_account = BankAccount(0)
        bank_account.deposit(10)

        self.assertEqual(10, bank_account.balance)
        
    def test_withdraw_success(self):
        bank_account = BankAccount(10)
        bank_account.withdraw(10)
        self.assertEqual(0, bank_account.balance)

上述代码中,当单独执行test_deposit_successtest_withdraw_success时候,代码会自动执行setUpModuletearDownModule.
当执行TestBankAccount进行测试时,虽然有两个测试用例,但是setUpModuletearDownModule只会执行一次

类级别的Fixtures

setUpClass() 在整类执行之前需要执行的函数
tearDownClass() 在整个类执行结束之后需要执行的函数

import unittest
from myprj.fixtures.bank_account import BankAccount

def setUpModule():
    print("calling setUpModule")

def tearDownModule():
    print("calling tearDownModule")


class TestBankAccount(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        print("calling setUpClass")

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

    def test_deposit_success(self):
        bank_account = BankAccount(0)
        bank_account.deposit(10)

        self.assertEqual(10, bank_account.balance)

    def test_withdraw_success(self):
        bank_account = BankAccount(10)
        bank_account.withdraw(10)
        self.assertEqual(0, bank_account.balance)

方法级别的Fixtures

setUp() 在任何一个方法执行之前都会被执行
tearDown()

import unittest
from myprj.fixtures.bank_account import BankAccount

class TestBankAccount(unittest.TestCase):

    def setUp(self) -> None:
        '''每一个类方法都要新建一个对象
            在任何一个方法执行之前都会执行
        '''
        print("calling setUp")
        self.bank_account = BankAccount(10)

    def tearDown(self) -> None:
        print("calling tearDown")
        self.bank_account = None

    def test_deposit_success(self):
        self.bank_account.deposit(10)
        self.assertEqual(20, self.bank_account.balance)

    def test_withdraw_success(self):
        
        self.bank_account.withdraw(10)
        self.assertEqual(0, self.bank_account.balance)

04.Mock

  1. 什么是Mock
  2. Mock和MagicMock
  3. Mock实例

本文参考:
https://www.bilibili.com/video/BV1SP4y1D7Wd/?spm_id_from=333.999.0.0

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

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

相关文章

在CentOS 7 上安装和配置 uwsgi 详细教程

本章教程,主要记录在CentOS7中成功安装uwsgi的详细步骤。 1. 更新系统包 首先,更新系统的包管理器以确保你有最新的软件包信息: sudo yum update -y2. 安装Python和pip CentOS 7 默认提供 Python 2.7,但你可能需要安装 Python 3 及其对应的 pip。以下是安装 Python 3 和…

OpenCV—二值化Threshold()、adaptiveThreshold()

cv2.threshold() c:double cv::threshold ( InputArray src, OutputArray dst, double thresh, double maxval, int type ) (注:源图片, 目标图, 阈值, 填充色, 阈值类型) python:cv.threshold(src,thresh, maxval, type[, dst]) src:源图片…

顶顶通呼叫中心中间件-通话之前录音配置方法(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-通话之前录音配置方法(mod_cti基于FreeSWITCH) 1、修改配置文件 点击配置文件 -> 点击vars -> 根据图中配置 -> 点击提交XML ->重新启动freeswitch 修改成true就是电话接通开始录音&#xff0c;修改成false就是通话之前开始录音。 <!--应…

ES环境搭建、ES安装

文章目录 简介与环境搭建全文检索倒排索引ElasticSearchWindows安装ES下载配置JDK环境启动ES服务 centos7安装ES下载ElasticSearch创建es用户配置JDK环境配置ElasticSearch配置JVM参数启动ElasticSearch服务常见启动报错 客户端Kibana安装下载修改Kibana.yml运行Kibana访问 ES安…

IntelliJ IDEA全新版的0个新特性【送源码】

jetBrains刚刚发布了最新IntelliJ IDEA 2024.2版本&#xff0c;做了不少优化性能方面的优化&#xff0c;同时新的ui也默认为启动ui。感兴趣的小伙伴可以下载体验&#xff0c;以下为官方本次介绍&#xff1a; 借助 IntelliJ IDEA 2024.2 Ultimate&#xff0c;您可以直接在 IDE …

宝塔面板实现定时任务删除 logs文件 加条件删除 只删除一个月前的日志

我们在开发中难免用到了日志功能&#xff0c;随着日志越来越多导致占用我们的内存 下面是一个简单的 使用宝塔面板里面的定时任务来实现删除日志案例 第一步 首先我的日志文件目录 都在log文件夹里面&#xff0c; 每个月生成一个日志文件夹 文件夹命名是年月来命名的 第二…

JVM(一) 类加载器、类加载过程、JVM参数设置

JVM Java编译器 Java源文件在通过编译器之后被编译成相应的.Class文件&#xff08;字节码文件&#xff09; JVM解释器 .Class文件又被JVM中的解释器编译成机器码在不同的操作 系统&#xff08;Windows、Linux、Mac&#xff09;上运行。每种操作系统的解释器都是不同的&#xf…

SpringBoot起步依赖和配置

目录 起步依赖 目的 1 继承父工程&#xff0c;确定版本信息 2 添加 starter-web 坐标信息 配置 配置文件的分类 ​编辑实操 1 后缀名是.properties文件修改端口号&#xff0c;把原本的默认端口号8080改为8082 2 创建后缀名是.yaml文件&#xff0c;尝试修改端口号&…

ARM——体系结构

计算机体系结构&#xff1a;冯诺伊曼 哈佛 冯诺依曼结构 冯诺依曼结构&#xff0c;也称冯诺依曼模型或普林斯顿结构&#xff0c;是根据冯诺依曼提出的存储程序概念设计的计算机体系结构。其主要特点包括&#xff1a; 存储程序&#xff1a;指令与数据都…

【Qt】信号与槽(下)

目录 自定义信号 带参数的信号和槽 信号和槽存在的意义 信号与槽的连接方式 一对一 一对多 多对一 意义 信号和槽的其他说明 信号和槽的断开 使用Lambda表达式定义槽函数 信号与槽的优缺点 优点: 松散耦合 缺点: 效率较低 自定义信号 自定义槽函数是非常关键的&a…

VMware 安装 centos7.9教程

目录 VMware17安包装 1.创建新的虚拟机 2.稍后安装一个系统 3.选择Centos7 4.选择安装位置 5.指定磁盘内存大小 6.自定义硬件 7.编辑内存 8.编辑处理器 9.选择安装镜像位置 10.选择网络适配器 11.播放虚拟机 12.选择语言简体中文 13.选择时区时间 14.最小化安装 …

电机学习-基础知识

文章目录 1 基本物理概念1.1 左手定则1.2 安培定则1.3 感应电动势 2 电机简单分类2.1 直流有刷电机2.2 步进电机2.2.1 步进电机的驱动原理1.相与线2.极性3.步进电机的驱动 2.3 无刷电机2.3.1 充磁方式2.3.2正弦波电动势与梯型电动势 3 编码器3.1 霍尔编码器3.2 光电编码器3.3 增…

TexWorks配置使用latexmk实现增量编译

TexWorks配置使用latexmk实现增量编译 TexWorks默认使用pdfLaTeXMakeIndexBibTeX&#xff0c;修改后&#xff0c;重新编译等待时间较长。本文旨在说明配置TexWorks使用latexmk实现增量式编译&#xff0c;加速编译。 前置条件说明 (1) 通过miktex自动安装了TexWorks及自带pdf…

Docker相关配置记录

Docker相关配置记录 换源 {"registry-mirrors": ["https://dockerhub.icu","https://docker.chenby.cn","https://docker.1panel.live","https://docker.awsl9527.cn","https://docker.anyhub.us.kg","htt…

VisionPro二次开发学习笔记12-使用CogToolGroup控件进行图像检测

本示例演示了如何通过图像数据库使用 CogImageFileTool&#xff0c;并将其放入 CogToolGroup 中&#xff0c;对于数据库中的每个图像运行一次检测. 当用户按下 运行 按钮时&#xff0c;程序执行以下操作&#xff1a; 如果工具组中没有 CogImageFileTools&#xff0c;它将显示一…

Codeforces Pinely Round 4 (Div. 1 + Div. 2) A~G

A.Maximize the Last Element&#xff08;枚举&#xff09; 题意&#xff1a; 给你一个由 n n n个整数组成的数组 a a a&#xff0c;其中 n n n是奇数。 在一次操作中&#xff0c;你将从数组 a a a中删除两个相邻的元素&#xff0c;然后将数组的剩余部分连接起来。例如&…

轻松构建Electron应用:TypeScript与esbuild的完美搭档

简介 使用 TypeScript (TS) 编写 Electron 应用程序带来了许多好处&#xff0c;以下是一些主要优势&#xff1a; 类型安全&#xff1a;TypeScript 是一种静态类型语言&#xff0c;它在编译时检查类型错误&#xff0c;这有助于在开发过程中及早发现潜在的错误。更好的工具支持…

RK3568平台(背光篇)背光调试常见问题

一.屏幕背光概述 背光就是屏幕的从里往照射的光。 LCD 主要由液晶面板、背光、驱动电路等组成&#xff0c;液晶面板不会主动发光&#xff0c;需要背光源才能显示&#xff0c;液晶面板的作用就是通过电压改变某像素光的透过率来显示的&#xff0c;当然此光要求是偏振光&#x…

数据结构(5.5_3)——并查集的进一步优化

Find操作的优化(压缩路径) 压缩路径——Find操作&#xff0c;先找到根节点&#xff0c;再将查找路径上所有结点都挂到根结点下 代码&#xff1a; //Find "查"操作优化&#xff0c;先找到根节点&#xff0c;再进行"路径压缩" int Find(int S[], int x) {…

Shell、C/C++、Python操作环境变量

环境变量 环境变量是一种在操作系统中用于存储信息的机制&#xff0c;这些信息可以被系统进程、应用程序和脚本访问和使用。环境变量在操作系统中的作用类似于一个全局配置参数&#xff0c;它们定义了操作系统的运行环境&#xff0c;包括系统行为、应用程序路径、用户信息等。…