Python 单元测试设置

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

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

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


Python 单元测试设置

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

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

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

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

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

创建要测试的函数

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

def add(a, b):return a + bdef subtract(a, b):return a - bdef multiply(a, b):return a * bdef divide(a, b):return a / bdef 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 numCalclass 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 numCalclass 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 = 10self.num2 = 5

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

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

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

完整代码:

import unittest
import numCalclass TestNumCal(unittest.TestCase):def setUp(self):print("\nsetUp")self.num1 = 10self.num2 = 5def 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.mzph.cn/news/102769.shtml

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

相关文章

java并发之AQS详解(待更)

一、为什么要用AQS同步框架&#xff1f; 开发者如果不了解JMM和多线程编程&#xff0c;就会写出很多线程不安全的程序&#xff0c;即使是经验丰富的程序员&#xff0c;并发编程也难免会出错。 而对于java程序员来说&#xff0c;并发编程就变得容易得多了&#xff0c;因为并发编…

如何在雷电模拟器上安装Magisk并加载movecert模块抓https包(二)

接来下在PC端安装和配置Charles&#xff0c;方法同下面链接&#xff0c;不再赘述。在模拟器上安装magisk实现Charles抓https包&#xff08;二&#xff09;_小小爬虾的博客-CSDN博客 一、记录下本机IP和代理端口 二、在手机模拟器上设置代理192.168.31.71:8888&#xff0c;设置…

rv1126-rknpu-v1.7.3添加opencv库

rv1126所使用的rknn sdk里默认是不带opencv库的&#xff0c;官方所用的例程里也没有使用opencv&#xff0c;但是这样在进行图像处理的时候有点麻烦了&#xff0c;这里有两种办法: 一是先用python将所需要的图片处理好后在转化为bin格式文件&#xff0c;在使用c或c进行读取&…

vue配置@路径

第一步&#xff1a;安装path&#xff0c;如果node_module文件夹中有path就不用安装了 安装命令&#xff1a;npm install path --save 第二步&#xff1a;在vue.config.js文件&#xff08;如果没有就新建&#xff09;中配置 const path require("path"); function …

设计模式-状态模式

介绍 一个对象有状态变化每次状态变化都会触发一个逻辑不能总是用if else来控制 示例 交通信号灯不同颜色的变化 UML类图 传统UML类图 简化后的UML类图 代码演示 // 状态&#xff08;红灯、绿灯、黄灯&#xff09; class State {constructor(color) {this.color col…

软件工程概论

文章目录 软件的定义软件的特点软件的种类软件工程的起源软件工程的三个阶段软件工程概念的提出软件开发的本质软件工程框架软件工程的目标软件工程的原则软件工程的活动 软件的定义 计算机系统中的程序及其文档。 程序是计算任务的处理对象和处理规则的描述&#xff1b; 文档…

腾讯云优惠券种类、领取方法及使用教程分享

腾讯云是国内领先的云计算服务提供商&#xff0c;为用户提供丰富的云计算产品和服务。为了吸引更多用户使用腾讯云的产品和服务&#xff0c;腾讯云会定期推出各种优惠券活动。本文将为大家介绍腾讯云优惠券的种类、领取方法及使用教程。 一、腾讯云优惠券种类介绍 腾讯云优惠券…

“.NET视频总结:认识框架的结构和组件,掌握开发工具的奥妙“

目录 第一单元&#xff1a;二十一世纪程序执行 背景: 总结&#xff1a; 第二单元:对象导向与类别设计 背景: 总结&#xff1a; 第三单元&#xff1a;使用类别与基底类别库 背景: 总结: 第四单元:Windows开发程序 背景: 总结: 第五单元:防护式程序设计 背景: 总结…

SXSSFWorkbook-MinIo-大数据-流式导出

文章目录 前言业务现状架构思路技术细节生成摘要IDSXSSFWorkbookMinIomybatis 流查询PipedInputStream 保存到minio 总结 前言 由于业务涉及到数据比较大&#xff0c;用户对导出功能使用频繁&#xff0c;每次导出数据两10万以上。 为了减少数据库压力&#xff0c;及应用服务器…

代理IP端口是什么意思呢?

今天&#xff0c;咱们来聊聊一个小众但很有料的话题——代理IP端口&#xff0c;它可是你纵横互联网世界的好搭子哦&#xff01; 首先&#xff0c;我们得先弄明白&#xff0c;代理IP端口是个啥? 代理IP端口就像是通往网络世界的门票&#xff0c;是你和代理服务器之间的桥梁。…

API接口安全运营研究(内附官方开发平台api接口接入方式)

摘 要 根据当前API技术发展的趋势&#xff0c;从实际应用中发生的安全事件出发&#xff0c;分析并讨论相关API安全运营问题。从风险角度阐述了API接口安全存在的问题&#xff0c;探讨了API检测技术在安全运营中起到的作用&#xff0c;同时针对API安全运营实践&#xff0c;提出…

关于系统/网络运维面试经验总结

一. 熟悉Linux命令 1. 最最最常问到的是 如何查看系统内存占用情况&#xff1f; ① free命令&#xff1a;free [-h][-m] 显示系统的内存使用情况&#xff0c;包括总内存、已使用内存、空闲内存等信息。其中&#xff0c;-m选项是以MB为单位来展示内存使用信息&#xff1b;-h选…

办公室人人在用的iTab桌面真的好用吗?

本人坐标北京&#xff0c;在一家中型互联网公司当社畜多年。最近发现一个奇怪的现象&#xff0c;我工位前后左右的同事都跟我在用一样的浏览器桌面——iTab新标签页。我表示莫非真的英雄所见略同&#xff1f; 我是去年1月份在刷B站时偶然刷到一条评论&#xff0c;有人分享自己…

日语学习网站web项目

支持日语五十音,平片假名、罗马音、词义转换、百度翻译功能,方便日语初学者学习日语发音 介绍 采用vitevue3ts技术栈开发, pinia管理全局化。主要是为了日语入门学习五十音, 以及日语句子罗马 发音对照练习。 参考以下两个项目完成 https://github.com/hexenq/kuroshiro ht…

卫星/RedCap/高算力/解决方案/创新金奖……移远通信为IOTE 2023再添新活力

9月20日&#xff0c;IOTE 2023第二十届国际物联网展深圳场震撼来袭。 作为IOTE多年的“老朋友”&#xff0c;移远通信在参展当天&#xff0c;不仅有5G RedCap、卫星通信、高算力、车载等高性能产品及终端展出&#xff0c;还携智慧出行、智慧生活、智慧能源、工业互联网等多领域…

SettingsView/设置页 的实现

1. 创建设置视图 SettingsView.swift import SwiftUI/// 设置页面 struct SettingsView: View {/// 环境变量&#xff0c;呈现方式&#xff1a;显示或者关闭Environment(\.presentationMode) var presentationMode/// 默认网址let defaultURL URL(string: "https://www.…

淘宝天猫商品历史价格API接口

获取淘宝商品历史价格接口的步骤如下&#xff1a; 注册淘宝开放平台&#xff1a;首先在淘宝开放平台上注册一个账号&#xff0c;并进行登录。创建应用&#xff1a;在淘宝开放平台上创建一个应用&#xff0c;并获取该应用的App Key和App Secret&#xff0c;用于后续的接口调用。…

外卖App点菜页-两个tableView联动【1】

这里新开一个项目 配置两个tableView的section和row以及ce 处理常见的tableView约束错误rowHeight 去掉滚动条 tableView的sectionHeaderxib初探 默认自带效果 不用这个 配置sectionHeader的内容 点击左侧tableViewCell使右边tableView 设置cell被选中后的样式及初始被选中ce…

Python爬虫提高排名

在如今竞争激烈的互联网时代&#xff0c;网站的SEO优化变得尤为重要。而Python爬虫作为一种强大的工具&#xff0c;可以帮助网站主们提升搜索排名&#xff0c;吸引更多的流量和用户。本文将为您揭秘如何利用Python爬虫来改善您的SEO优化&#xff0c;并帮助您提升搜索排名。无论…

淘宝天猫店铺所有商品数据接口,淘宝API接口

获取淘宝店铺所有商品数据接口的步骤如下&#xff1a; 获取授权&#xff1a;使用 OAuth 2.0 协议对应用进行授权&#xff0c;以便能够访问店铺的商品信息。获取店铺信息&#xff1a;使用淘宝 API 的 taobao.shop.get 接口&#xff0c;传入店铺的 user_id 参数&#xff0c;获取…