自动化测试系列 之 Python单元测试框架unittest

一、概述

什么是单元测试

单元测试是一种软件测试方法,是测试最小的可测试单元,通常是一个函数或一个方法。

在软件开发过程中,单元测试作为一项重要的测试方法被广泛应用。

为什么需要单元测试

单元测试是软件开发中重要的一环,具有以下作用:

  1. 验证代码的正确性:单元测试可以自动化地验证代码的正确性,避免开发人员手动测试时漏掉某些情况或错误。通过单元测试,可以及时发现和定位代码中的错误,并保障代码质量和缺陷率。
  2. 更好地组织和维护代码:通过单元测试,代码将被分割为小的可测试单元,每一个单元都有对应的测试用例,更好地组织代码,增加代码的可读性和可维护性。
  3. 提高开发效率:单元测试的快速执行和反馈,可以有助于开发人员快速找到问题并迅速地解决它们。这样可以加快迭代速度,提高软件开发效率。
  4. 自信心:通过单元测试,开发人员可以自信地修改和重构现有的代码,因为单元测试可以保证代码质量和正确性,减少犯错的机会。
Python 中的单元测试框架

各种编程语言都有自己的单元测试框架,Python中主流的单元测试框架包括:

  1. unittest: Python自带的单元测试框架,是xUnit风格的测试框架。
  2. pytest: 一个第三方的Python单元测试框架,具有更好的扩展性和灵活性。pytest具有更好的预期错误展示和简化测试用例编写的特点。
  3. nose: 另一个第三方的Python单元测试框架,它具有可插拔的插件架构,可以轻松地扩展其功能。
  4. doctest: Python自带的另一个单元测试框架,可以在Python代码中使用文档字符串编写测试用例
  5. Testify: 一个相对较新的Python单元测试框架,专注于在类与海量测试用例下提供更快速的速度和更好的效率。

本文将着重介绍Python自带的带有测试皇家 unittest

二、unittest框架介绍

unittest框架的背景和产生

unittest 是一个Java单元测试框架 JUnit 的Python版本。unittest最初由Python的核心开发者Tim Peters在2001年开发,旨在提供一种规范的方式来编写单元测试,以改进传统的debugging因试错所造成的时延。

unittest框架的特点与优势

unittest框架有以下特点与优势:

  • 标准化的测试工具: unittest框架提供了标准化的测试工具和从标准TestCase集成的测试运行器,为新手和高级用户提供了一个可用的接口。
  • 支持自动化测试: 可以通过编写自动化测试用例,加快测试效率,缩短测试时间,减少人工测试工作。
  • 支持测试定制: unittest框架可以轻松集成第三方库,支持创建自定义的测试用例和测试套件。
  • 执行结果明确: unittest框架提供了详细的错误信息,让测试人员能够快速地定位和修复错误。

三、unittest框架基础

安装和配置unittest框架

unittest是Python的内置模块,所以你不需要额外安装。

unittest 简单示例

被测试的代码demo,包含了两个方法, addsub

#!/usr/bin/env python3
# -*- coding: utf-8 -*-def add(a, b):return a + bdef sub(a, b):return a - b

为这两个函数编写单元测试用例

import unittest
from calculate import add, subclass TestCalcuate(unittest.TestCase):def test_add(self):result = add(2, 3)self.assertEqual(result, 5) def test_sub(self):result = sub(5, 3)self.assertEqual(result, 2)if __name__ == '__main__':unittest.main()

在这个测试用例中,我们导入了addsub函数,并创建了一个名为 TestCalcuate 的测试类(所有的测试类都必须是unittest.TestCase 的子类)。在这个类中,我们定义了两个测试方法test_addtest_sub,分别用于测试加法和减法函数的行为。

在每个测试方法中,我们调用相应的函数,并使用self.assertEqual断言方法来验证计算结果是否等于预期值。

最后,我们使用unittest.main()来运行测试用例。

四、unittest框架常用的测试类和方法

Python的unittest框架中,提供了许多用于辅助构建单元测试的类和方法

常用的测试类
  1. unittest.TestCase:这是unittest框架中最重要的测试类,所有的测试用例都应该继承自它。它提供了一些常用的断言方法和测试辅助方法,用于编写和运行测试。
  2. unittest.TestSuite:这个类用于组织和管理一组测试用例。你可以将多个测试用例添加到一个测试套件中,并一次性运行它们。
  3. unittest.TestLoader:这个类用于加载测试用例。它提供了一些方法,可以从模块、类或者目录中自动发现和加载测试用例。
  4. unittest.TextTestRunner:这个类用于运行测试用例并生成测试结果的文本报告。它提供了一些方法,可以控制测试的输出格式和详细程度。
  5. unittest.TestResult:这个类用于存储测试结果。它提供了一些方法,可以获取测试的状态、错误信息和失败信息等。
常用的方法

在unittest框架中,常用的方法包括setUp()tearDown()setUpClass()tearDownClass()。这些方法用于在测试用例的执行过程中进行准备和清理工作。

  1. setUp()方法:在每个测试方法运行之前调用。它用于准备测试环境,例如初始化对象、打开文件等。每个测试方法都会在调用setUp()方法后执行。
  2. tearDown()方法:在每个测试方法运行之后调用。它用于清理测试环境,例如关闭文件、释放资源等。每个测试方法都会在调用tearDown()方法后执行。
  3. setUpClass()方法:在测试类中的所有测试方法运行之前调用。它用于进行一次性的测试环境准备工作,例如连接数据库、启动服务器等。setUpClass()方法需要使用@classmethod装饰器进行标记。
  4. tearDownClass()方法:在测试类中的所有测试方法运行之后调用。它用于进行一次性的测试环境清理工作,例如断开数据库连接、关闭服务器等。tearDownClass()方法需要使用@classmethod装饰器进行标记。

这些方法可以在测试类中重写,并根据需要进行自定义操作。

五、编写测试用例

当使用unittest框架编写测试用例时,通常需要进行以下步骤:

  1. 创建测试用例:
    • 创建一个继承自unittest.TestCase的测试类。
    • 在测试类中定义一个或多个测试方法。每个测试方法应该以test_开头,以便unittest能够自动识别并运行它们。
    • 在每个测试方法中,编写测试逻辑并使用断言方法来验证结果是否符合预期。
  2. 管理测试用例:
    • 使用unittest.TestLoader类来加载测试用例。你可以使用loadTestsFromModule()方法从模块中加载测试用例,或者使用loadTestsFromTestCase()方法从测试类中加载测试用例。
    • 创建一个unittest.TestSuite对象,并将加载的测试用例添加到测试套件中。你可以使用addTest()方法添加单个测试用例,或者使用addTests()方法添加多个测试用例。
  3. 运行测试用例:
    • 使用unittest.TextTestRunner类来运行测试用例并生成测试结果的文本报告。
    • 创建一个unittest.TextTestRunner对象。
    • 调用run()方法运行测试套件,并将结果输出到控制台或文件中。

结合前面的例子,进一步演示如何编写、管理和运行测试用例:

import unittestclass MyTestCase(unittest.TestCase):def test_add(self):result = 2 + 2self.assertEqual(result, 4)def test_sub(self):result = 5 - 3self.assertEqual(result, 2)if __name__ == '__main__':# 创建测试套件并添加测试用例suite = unittest.TestSuite()suite.addTest(MyTestCase('test_add'))suite.addTest(MyTestCase('test_sub'))# 创建测试运行器并运行测试套件runner = unittest.TextTestRunner()runner.run(suite)

在这个示例中,我们创建了一个名为MyTestCase的测试类,并在其中定义了两个测试方法test_addtest_sub。然后,我们创建了一个测试套件,并使用addTest()方法将测试用例添加到测试套件中。最后,我们创建了一个测试运行器,并使用run()方法运行测试套件。

运行这个示例,你将看到测试结果的输出。如果所有测试通过,你将看到一个成功的消息。如果有测试失败,你将看到失败的消息和详细的错误信息。

这是使用unittest编写、管理和运行测试用例的基本步骤。你可以根据需要编写更多的测试方法,并使用各种断言方法来验证你的代码的行为。

六、unittest常用的断言方法

以下是unittest常用的断言方法以markdown表格的方式呈现:

断言方法

描述

assertEqual(a, b)

断言a和b相等

assertNotEqual(a, b)

断言a和b不相等

assertTrue(x)

断言x为True

assertFalse(x)

断言x为False

assertIs(a, b)

断言a和b是同一个对象

assertIsNot(a, b)

断言a和b不是同一个对象

assertIsNone(x)

断言x为None

assertIsNotNone(x)

断言x不为None

assertIn(a, b)

断言a在b中

assertNotIn(a, b)

断言a不在b中

assertIsInstance(a, b)

断言a是b的实例

assertNotIsInstance(a, b)

断言a不是b的实例

assertRaises(exception, callable, *args, **kwargs)

断言调用callable(*args, **kwargs)会引发指定的异常

assertWarns(warning, callable, *args, **kwargs)

断言调用callable(*args, **kwargs)会引发指定的警告

assertLogs(logger=None, level=None)

断言在指定的日志记录器上发生了指定级别的日志记录

assertAlmostEqual(a, b, places=None, msg=None, delta=None)

断言a和b近似相等

assertNotAlmostEqual(a, b, places=None, msg=None, delta=None)

断言a和b不近似相等

assertSequenceEqual(a, b, msg=None, seq_type=None)

断言a和b是相同的序列

assertListEqual(a, b, msg=None)

断言a和b是相同的列表

assertTupleEqual(a, b, msg=None)

断言a和b是相同的元组

assertSetEqual(a, b, msg=None)

断言a和b是相同的集合

assertDictEqual(a, b, msg=None)

断言a和b是相同的字典

这些断言方法可以根据需要选择合适的方法来编写测试用例,并验证代码的行为是否符合预期。

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

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

相关文章

前后端分离架构的特点以及优缺点

文章目录 一、前后端不分离架构(传统单体结构)1.1 什么是前后端不分离1.2 工作原理1.3 前后端不分离的优缺点1.4 应用场景 二、前后端分离架构2.1 为什么要前后端分离2.2 什么是前后端分离2.3 工作原理2.4 前后端分离的优缺点 参考资料 一、前后端不分离架构(传统单体结构) 首…

LAMP集中式搭建+LNMP分布式搭建(新版)

LAMP搭建LNMP搭建 LAMP搭建LNMP搭建一、LAMP搭建(集中式)1、LAMP简介2、LAMP组件及作用3、编译安装Apache httpd服务4、编译安装mysqld 服务5、编译安装PHP解析环境6、安装论坛7、安装博客 二、LNMP搭建(分布式)1、LNMP工作原理2、安装nginx3、安装mysql4、安装php5、在浏览器测…

Unity坦克大战开发全流程——开始场景——设置界面

开始场景——设置界面 step1:设置面板的背景图 照着这个来设置就行了 step2:写代码 关联的按钮控件 监听事件函数 注意:要在start函数中再写一行HideMe函数,以便该面板能在一开始就能隐藏自己。 再在BeginPanel脚本中调用该函数即…

1.S32K3电源和复位

一、电源 S32K3系列芯片的电源各不相同。以S32K34x,S32K32x及S32K314为例。 并且该芯片支持以下特性: • Combination of internal and external voltage regulator options, offering RUN and Standby modes • FPM , which is used on chip-level in…

市场复盘总结 20231229

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: -- 今日 SELECT * FROM (SELECT TOP 100 CODE,20231229 入选日期,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,主力净额,DDE大单净量,CONVERT(DATETIM…

Linux驱动开发简易流程

推荐视频: 正点原子【第四期】手把手教你学 Linux之驱动开发篇 小智-学长嵌入式Linux&Android底层开发入门教程 能力矩阵 基础能力矩阵 熟悉c/c、熟悉数据结构 熟悉linux系统,Shell脚本,Makefile/cmake/mk 文件IO、多线程、竞争、并发…

Python实现员工管理系统(Django页面版 ) 七

各位小伙伴们好久不见,2024年即将到来,小编在这里提前祝大家新的一年快快乐乐,能够事业有成,学习顺心,家庭和睦,事事顺利。 今天我们本篇要实现的是一个登录界面的实现,其实登录界面的实现看着挺…

【linux】Linux管道的原理与使用场景

Linux管道是Linux命令行界面中一种强大的工具,它允许用户将多个命令链接起来,使得一个命令的输出可以作为另一个命令的输入。这种机制使得我们可以创建复杂的命令链,并在处理数据时提供了极大的灵活性。在本文中,我们将详细介绍Li…

nacos入门篇001-安装与启动

1、下载zip包 我这里下载的是版本2.2.0 Nacos 快速开始 2、修改配置文件 2.1集群模式修改成单例模式 vi startup.sh 2.2 修改数据库配置信息 3、初始化数据库 3.1 创建db名称:db_nacos 3.2 执行mysql-schema.sql 3.3 执行完截图: 4、运行脚本启动 …

Chapter 7 - 8. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Stomped CRC Counters Stomped CRC counters help in finding the location of bit errors in a network that uses cut-through switches. More precisely, these counters help in finding where bit errors do not exist. Stomped CRC 计数器有助于在使用直通式交换机的网络…

CSS:盒子模型

CSS:盒子模型 盒子模型盒子模型的组成盒子内容边框 border内边距 padding盒子实际大小计算CSS3的盒子类型content-boxborder-box 外边距 margin外边距合并相邻块元素垂直外边距合并嵌套块元素垂直外边距塌陷 行内元素的内外边距 盒子相关属性圆角边框盒子阴影 盒子模…

APP UI自动化测试思路总结

首先想要说明一下,APP自动化测试可能很多公司不用,但也是大部分自动化测试工程师、高级测试工程师岗位招聘信息上要求的,所以为了更好的待遇,我们还是需要花时间去掌握的,毕竟谁也不会跟钱过不去。接下来,一…