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.hqwc.cn/news/132492.html

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

相关文章

windows创建服务:更新服务信息乱码问题(ChangeServiceConfig)

因为小项目需要创建windows服务&#xff0c;安装微软官方示例一切都挺顺利&#xff0c;代码运行后发现配置的信息在系统里显示乱码。打开注册表发现的确是乱码。这就排除软件读取得问题&#xff0c;而是调用ChangeServiceConfig系统函数写入时就发生了乱码。让我在网上查找了一…

读书笔记-《ON JAVA 中文版》-摘要26[第二十三章 注解]

文章目录 第二十三章 注解1. 基本语法1.1 基本语法1.2 定义注解1.3 元注解 2. 编写注解处理器2.1 编写注解处理器2.2 注解元素2.3 默认值限制 3. 使用javac处理注解4. 基于注解的单元测试5. 本章小结 第二十三章 注解 注解&#xff08;也被称为元数据&#xff09;为我们在代码…

Web应用-Thinkphp框架-开发指南

Thinkphp框架 二级导航分类&#xff0c;模板继承&#xff0c;内置标签Public 修改MVC模块化 ——访问机制传参加载模版模版引入 分离Runtime 缓存文件管理员添加数据验证及验证场景 控制器 validate 在sql执行&#xff08;敏感操作&#xff09;之前验证数据模板 分页数据表连接…

nextjs构建服务端渲染,同时使用Material UI进行项目配置

一、创建一个next项目 使用create-next-app来启动一个新的Next.js应用&#xff0c;它会自动为你设置好一切 运行命令: npx create-next-applatest 执行结果如下&#xff1a; 启动项目&#xff1a; pnpm dev 执行结果&#xff1a; 启动成功&#xff01; 二、安装Mater…

深入理解强化学习——标准强化学习和深度强化学习

分类目录&#xff1a;《深入理解强化学习》总目录 强化学习的历史 早期的强化学习&#xff0c;我们称其为标准强化学习。最近业界把强化学习与深度学习结合起来&#xff0c;就形成了深度强化学习&#xff08;Deep ReinforcemetLearning&#xff09;。因此&#xff0c;深度强化…

C语言中常用的字符串处理函数(strlen、strcpy、strcat、strcmp)

文章目录 写在前面1. strlen1.1 函数介绍1.2 模拟实现 2. strcpy2.1 函数介绍2.2 模拟实现 3. strcat3.1 函数介绍3.2 模拟实现 4. strcmp4.1 函数介绍4.2 模拟实现 写在前面 本篇文章介绍了C语言中常用的字符串处理函数&#xff0c;包括strlen、strcpy、strcat和strcmp。文章…

[开源]基于流程编排的自动化测试工具,插件驱动,测试无限可能

一、开源项目简介 流程编排&#xff0c;插件驱动&#xff0c;测试无限可能 一款基于流程编排的自动化测试工具 二、开源协议 使用Apache-2.0开源协议 三、界面展示 四、功能概述 在软件开发旅程中&#xff0c;测试流程的管理和执行常常是复杂且耗时的挑战。传统测试工具主…

云原生Kubernetes:K8S集群版本升级(v1.20.15 - v1.22.14)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群&#xff08;v1.21.14&#xff09; 4.验证集群&#xff08;v1.21.14&#xff09; 5.升级集群&#xff08;v1.22.14&#xff09; 6.验证集群 (v1.22.14) 二、实验 1.升级集群&#xff08;v1.21.14&#xff09; 2.验…

JAVA学习第一天,java的运行方式

对未来很迷茫&#xff0c;不知道以后能出去干什么&#xff0c;好像掌握的东西很少&#xff0c;从今天开始学习学习java吧&#xff0c;让自己充实起来&#xff0c;记录一下。 jav…

python结合excel数据轻松实现接口自动化测试

在刚刚进入测试行业的时候&#xff0c;最开始也是做功能测试&#xff0c;我想很多伙伴和我一样&#xff0c;觉得自动化测试都很高端&#xff0c;很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化&#xff0c;后面发现excel个人觉得更加适合&#x…

js的indexOf方法

一、数组调用 indexOf() 方法可返回数组中某个指定的元素位置。 该方法将从头到尾地检索数组&#xff0c;看它是否含有对应的元素。开始检索的位置在数组 start 处或数组的开头&#xff08;没有指定 start参数时&#xff09;。如果找到一个 item&#xff0c;则返回 item 的第一…

新手如何快速上手HTTP爬虫IP?

对于刚接触HTTP爬虫IP的新手来说&#xff0c;可能会感到有些困惑。但是&#xff0c;实际上HTTP爬虫IP并不复杂&#xff0c;只要掌握了基本的操作步骤&#xff0c;就可以轻松使用。本文将为新手们提供一个快速上手HTTP爬虫IP的入门指南&#xff0c;帮助您迅速了解HTTP爬虫IP的基…