Python 单元测试设置

news2024/11/16 0:03:17

单元测试检查特定代码单元或模块是否按照开发人员的预期执行。 大多数时候,我们测试的代码单元是一个函数。

同样,我们可以测试所有功能。 作为最佳实践,至少在开发过程中,我们应该进行单元测试。

因此,在开发过程的早期阶段,它会检测到错误,我们可以在不花费太多时间的情况下修复它们。 如果我们跳过这些测试,那么在继续项目时将很难修复错误。


Python 单元测试设置

Python 提供了一个不同的单元测试框架,称为unittest。 unittest 框架提供了一些特性。

我们使用此方法执行的测试是相互独立的。 换句话说,测试的成功或失败不取决于其他测试结果。

它还提供 setup()teardown() 函数以及测试自动化。 setup() 函数允许我们设置在每个测试方法之前执行的指令。

teardown() 函数将描述在每个测试方法之后运行的指令。

unittest 为我们提供了一些用于单元测试的基本概念,例如测试夹具、测试用例、测试套件和测试运行器。 本文讨论使用 unittest 框架构建用于单元测试的 setup() 函数。

创建要测试的函数

首先,我们需要构建一些函数来测试。 让我们创建四个函数来对两个数字进行加、减、乘、除和求余数。

def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

def multiply(a, b):
    return a * b

def divide(a, b):
    return a / b

def remainder(a, b):
    return a % b

我们可以使用 print() 函数来测试上述函数,但对于成百上千的代码来说,它不太实用。 那么,让我们创建一个模块来测试功能。

创建测试模块

我们应该根据命名约定来命名我们的测试模块。 我们使用 test_ 作为名称的第一部分,然后是模块的名称。

让我们为本教程创建测试模块 test_calc.py。

命名约定:

test_<name>

然后我们必须将 unittest 框架和 numCal 模块导入到我们的测试模块中。 unittest 包含在标准库中,所以我们可以直接导入它。 numCal 是我们需要测试的模块。

import unittest
import numCal

下一步,我们可以创建一个继承自 unittest.TestCase 的类,这样我们就可以访问该类中的更多测试功能。

class TestNumCal(unittest.TestCase):

在类内部,我们为每个函数创建方法。 我们在命名方法的时候需要按照命名约定来命名。

当我们运行测试模块时,它会知道哪个方法代表测试,因为名称的第一部分是测试。 否则,它不会识别测试方法并跳过它们。

首先,我们为 add() 函数创建一个测试方法。

def test_add(self):
	self.assertEqual(numCal.add(10, 5), 15)

与每个方法一样,self 是 test_add() 方法的第一个参数。 我们在第二行中使用了 assertEqual() 方法。

由于我们的 TestNumCal 类继承自 unittest.TestCase,因此我们可以访问所有可用的断言方法。 诸如 assertEqual()assertNotEqual()assertTrue()assertFalse()assertIn() 等方法可用于单元测试,还有更多。

assertEqual() 方法检查函数返回的值与我们期望的值之间的相等性。

然后我们需要将测试模块设置为直接从编辑器运行。 否则,当我们尝试执行测试模块时,它将不会运行。

因此,为此,我们可以使用下面的代码。

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

现在我们的代码应该如下所示。

import unittest
import numCal

class TestNumCal(unittest.TestCase):

    def test_add(self):
        self.assertEqual(numCal.add(10, 5), 15)

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

现在我们可以通过运行 test_calc.py 模块来测试 add() 函数。

输出:

test_add 函数

在这里,点表示测试通过。 如果测试失败,就会出现F,如果有错误,就会出现错误信息。

下面,圆点显示测试了多少个单元。

现在让我们再创建四个测试方法来测试其余的功能。

import unittest
import numCal

class TestNumCal(unittest.TestCase):

    def test_add(self):
        self.assertEqual(numCal.add(10, 5), 15)

    def test_subtract(self):
        self.assertEqual(numCal.subtract(10, 5), 5)

    def test_multiply(self):
        self.assertEqual(numCal.multiply(10, 5), 50)

    def test_divide(self):
        self.assertEqual(numCal.divide(10, 5), 2)

    def test_remainder(self):
        self.assertEqual(numCal.remainder(10, 5), 0)

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

根据每个功能,我们应该更改测试方法名称。

输出:

ran 5 tests

这里困难的部分是需要在每个测试方法中设置每个函数的值。 当我们有数百种测试方法时,这将是一个问题。

如果需要更改值,我们必须审查每个测试方法并更改它们。

我们可以构建 setup() 函数来克服这个问题。 通过这种方法,我们只需要声明一次值。 然后在每个方法之前执行。

创建 setUp() 函数

def setUp(self):
	print("\nsetUp")
	self.num1 = 10
	self.num2 = 5

设置 setup() 函数后,还需要更改函数的参数。 首先,让我们更改 test_add 方法。

def test_add(self):
	print("Add")
	self.assertEqual(numCal.add(self.num1, self.num2), 15)

如上所述,我们可以对剩余的方法进行更改,我们的完整代码应该如下所示。

完整代码:

import unittest
import numCal

class TestNumCal(unittest.TestCase):

    def setUp(self):
        print("\nsetUp")
        self.num1 = 10
        self.num2 = 5

    def test_add(self):
        print("Add")
        self.assertEqual(numCal.add(self.num1, self.num2), 15)

    def test_subtract(self):
        print("Subtract")
        self.assertEqual(numCal.subtract(self.num1, self.num2), 5)

    def test_multiply(self):
        print("Multiply")
        self.assertEqual(numCal.multiply(self.num1, self.num2), 50)

    def test_divide(self):
        print("Divide")
        self.assertEqual(numCal.divide(self.num1, self.num2), 2)

    def test_remainder(self):
        print("remainder")
        self.assertEqual(numCal.remainder(self.num1, self.num2), 0)

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

输出:

setup 函数

在输出中,五个点表示测试已通过以及运行的测试数。 在它下面,值是在每次测试之前设置的; 为了识别这一点,我们放置了 print() 函数。

因此,在测试方法开始之前,setup() 函数会执行定义的指令,并使用它们进行测试。


总结

在本文中,我们了解了什么是单元测试和单元测试框架以及如何构建测试模块。 最重要的是,我们学习了如何使用 setup() 函数来设置一些定义的指令在每个测试方法之前执行。

当需要运行许多测试并且需要更改参数的值时,setup() 函数会派上用场。

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

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

相关文章

k8s - Flannel

1.Flannel概念剖析 Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络&#xff08;Overlay Network&#xff09;工具&#xff0c;其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。这次的分享内容将从Flannel的介绍、工作原理及安装和配置三方…

MySQL系列索引专题

存储引擎 1.MySQL 的体系结构可以分为四层 连接层&#xff1a;最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限服务层&#xff1a;第二层架构主要完成大多数的核心…

Redis实现简易消息队列的三种方式

Redis实现简易消息队列的三种方式 消息队列简介 消息队列是一种用于在计算机系统中传递和处理数据的重要工具。如果你完全不了解消息队列&#xff0c;不用担心&#xff0c;我将尽力以简单明了的方式来解释它。 首先&#xff0c;想象一下你正在玩一个游戏&#xff0c;而游戏中…

怎么把heic改成jpg?方法大全在这里

怎么把heic改成jpg&#xff1f;HEIC是一种现代的图像文件格式。它是由ISO制定的标准&#xff0c;并得到了苹果公司的支持和推广。与JPG等传统图像格式相比&#xff0c;HEIC格式可以提供更好的图像质量&#xff0c;并且占用更少的存储空间。这使得它在手机、平板电脑和其他移动设…

Java中在循环体内拼接字符串时为什么使用StringBuilder而不是String

在循环体内拼接字符串时为什么使用StringBuilder而不是String 在《阿里巴巴Java开发手册》一书中提到了&#xff1a; 循环体内&#xff0c;字符串的连接方式&#xff0c;请使用 StringBuilder 的 append 方法进行扩展。&#xff08;而不要用String的方式&#xff09; 说明&…

解决IP地址欺骗的网络安全策略

随着互联网的不断发展&#xff0c;网络安全已经成为企业和个人关注的重要问题。其中&#xff0c;IP地址欺骗是一种常见的威胁&#xff0c;它可能导致数据泄露、身份伪装和网络攻击。 1. 使用防火墙和入侵检测系统 防火墙和入侵检测系统&#xff08;IDS&#xff09;是网络安全…

Sui的动态可组合NFT为Cosmocadia增加游戏趣味性

的新游戏Cosmocadia展示了Sui NFT如何在游戏中四处走动&#xff0c;种植和收获蔬菜&#xff0c;并在工作台上制作工具和家具。未来将更新利用NFT&#xff0c;如私人土地&#xff0c;甚至让玩家将他们的SuiFrens NFT带入游戏中。 Lucky Kat Studios的产品经理Bente Bolland将Co…

神奇的代码恢复工具

文章目录 概述工具展示工具下载地址运行过程附件待恢复代码 概述 小C是一名程序猿&#xff0c;他有好多新奇的点子&#xff0c;也乐于把这些变成文字分享给大家。这些分享大部分都与代码相关&#xff0c;在文章里面把这些代码全部按本来的结构展示出来也不是一件容易的事&…

LMI FocalSpec 3D线共焦传感器 使用笔记1

一.硬件介绍 以上特别注意: 屏蔽线必须接地,因为在现场实际调试中,使用软件调试发现经常 弹窗 传感器丢失警告!! 以上 Position LED 的灯被钣金挡住,无法查看异常现象,能否将指示灯设置在软件界面上? 需要确认是软触发还是硬触发,理论上 硬触发比软触发速度要快.(我们目前使用…

Zilliz X Dify.AI ,快速打造知识库 AI 应用

Zilliz 大模型生态矩阵再迎新伙伴&#xff01;近日&#xff0c;Zilliz 和 Dify.AI 达成合作&#xff0c;Zilliz 旗下的产品 Zilliz Cloud、Milvus 与开源 LLMOps 平台 Dify 社区版进行了深度集成。 01.Zilliz Cloud v.s. Dify Dify 作为开源的 LLMs App 技术栈&#xff0c;在此…

[GXYCTF2019]BabyUpload - 文件上传+绕过(后缀文件类型文件内容.htaccess)

[GXYCTF2019]BabyUpload 解题流程 解题流程 1、上传一句话&#xff0c;提示“后缀不允许ph” 2、修改后缀为jpg&#xff0c;提示“上传类型也太露骨了吧&#xff01;” 3、修改类型为image/jpeg&#xff0c;提示“诶&#xff0c;别蒙我啊&#xff0c;这标志明显还是php啊” 4、…

【Axure教程】将figma导入Axure

Figma和Axure是两个不同的界面设计工具&#xff0c;Figma主要用于创建和协作设计图形界面&#xff08;UI&#xff09;&#xff0c;允许多个设计师和利益相关者同时在云端协作设计项目&#xff1b;Axure是原型设计工具&#xff0c;专注于创建高保真、可交互的原型。大家可以根据…

Java学习笔记(一)——概述

目录 一、Java概述 &#xff08;一&#xff09;Java技术体系平台 &#xff08;二&#xff09;Java重要特点 &#xff08;三&#xff09;Java运行机制及运行过程 &#xff08;四&#xff09;JDK &#xff08;五&#xff09;JRE 二、Java的快速入门 &#xff08;一&#…

掌握Python机器学习:空间模拟与时间预测的实战指南

了解全文点击:《掌握Python机器学习&#xff1a;空间模拟与时间预测的实战指南》 文章目录 一、机器学习原理与概述二、Python编译工具组合安装教程三、掌握Python语法及常见科学计算方法四、机器学习数据清洗五、机器学习与深度学习方法六、机器学习空间模拟实践操作七、机器…

6数据层相关框架-基本

MyBatis常见面试问题&#xff0c;以及和hibernate 的区别等_mybatis和hiberbate区别面试_my_styles的博客-CSDN博客*1、什么是MyBatis&#xff1f;*答&#xff1a;MyBatis是一个可以自定义SQL、存储过程和高级映射的持久层框架。*2、讲下MyBatis的缓存*答&#xff1a;MyBatis的…

实现即时沟通与协作的全功能IM即时通讯系统

在当今竞争激烈的商业环境中&#xff0c;高效的沟通和协作成为企业取得成功的关键。在过去&#xff0c;电子邮件和电话等传统工具是企业之间进行沟通和协作的重要手段&#xff0c;然而&#xff0c;随着科技的发展和社交化的趋势&#xff0c;IM即时通讯系统正逐渐成为企业协作的…

虹科方案 | 虹科ATTO 4K/8K以太网解决方案

一、方案背景 以太网为中小型媒体制作工作室提供经济高效的共享存储解决方案。尽管 10GbE 继续在 4K 工作流程中发挥重要作用&#xff0c;但 8K 等新格式需要额外的带宽。 为了使您的环境适应未来的新制作格式&#xff0c;需要一种更强大、低延迟的连接技术&#xff0c;一种足…

外卖点餐小程序源码 扫码点餐小程序源码

外卖点餐小程序源码 扫码点餐小程序源码 吃饭点外卖&#xff0c;坐车靠窗边&#xff0c;睡觉侧着身&#xff0c;洗澡要放歌&#xff0c;随时随地要自拍.......这些俨然早已成为我们当代新青年的真实生活写照。 近年来外卖行业蓬勃发展&#xff0c;外卖小哥走街串巷&#xff0…

FastAPI学习-26 并发 async / await

前言 有关路径操作函数的 async def 语法以及异步代码、并发和并行的一些背景知识 async 和 await 关键字 如果你正在使用第三方库&#xff0c;它们会告诉你使用 await 关键字来调用它们&#xff0c;就像这样&#xff1a; results await some_library()然后&#xff0c;通…

竞赛 深度学习 机器视觉 人脸识别系统 - opencv python

文章目录 0 前言1 机器学习-人脸识别过程人脸检测人脸对其人脸特征向量化人脸识别 2 深度学习-人脸识别过程人脸检测人脸识别Metric Larning 3 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习 机器视觉 人脸识别系统 该项目…