Python测试-unittest,2022-11-27

news2025/1/22 15:43:19

(2022.11.27 Sun)
unittest是Python自带的单元测试框架。unittest+html和pytest+allure(测试报告)成为常用的自动测试和报告的框架组合。

unittest-archi-2022-11-23-2114.png

概念

  • test case测试用例:测试用例是测试的基本单元,用于测试一组特定输入的特定响应,unittest提供了基类unittest.TestCase用于创建测试案例。案例包括“输入用户名不输入密码,则提示密码为空”等。
  • test fixture测试脚手架:为开展测试需要进行的准备工作,以及所有相关的清理操作(cleanup actions),比如创建临时或代理数据库、目录,启动一个服务器进程等。
  • test suite测试套件:一系列的测试用例或测试套件,用于整合一些一起执行的测试。
  • test runner测试运行器:用于执行和输出测试结果的组件,可使用图形接口、文本接口,或返回运行测试结果的特定值。

案例

# unittest_basic_example01.py
import logging
import unittest

class Login:
    pass

class TestStringMethods(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        # 必须使用@classmethod 装饰器,所有test运行前运行一次
        super().setUpClass()
        logging.info("setUpClass")

    @classmethod
    def tearDownClass(cls):
        # 必须使用@classmethod, 所有test运行完后运行一次
        super().tearDownClass()
        logging.info("tearDownClass")

    def setUp(self):
        # 每个测试用例执行之后做操作
        # do preparation
        super().setUp()
        logging.info("setUp")

    def tearDown(self):
        # 每个测试用例执行之前做操作
        super().tearDown()
        logging.info("tearDown")

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        logging.info('method test_isupper is in progress')
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        logging.info('method test_split is in progress')
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    format = "%(asctime)s: %(message)s"
    logging.basicConfig(format=format, level=logging.INFO) #, datefmt="%H:%M:%S.%f"    
    unittest.main()

运行结果

$ python unittest_basic_example01.py 
2022-11-27 14:48:37,872: setUpClass
2022-11-27 14:48:37,873: setUp
2022-11-27 14:48:37,873: method test_isupper is in progress
2022-11-27 14:48:37,873: tearDown
.2022-11-27 14:48:37,873: setUp
2022-11-27 14:48:37,873: method test_split is in progress
2022-11-27 14:48:37,873: tearDown
.2022-11-27 14:48:37,873: setUp
2022-11-27 14:48:37,873: tearDown
.2022-11-27 14:48:37,873: tearDownClass

----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK

该案例给出若干测试用例的结果和方法的执行顺序。

案例中定义了单元测试类TestStringMethods,在import unittest之后,定义该单元测试类之时,继承unittest.TestCase,使得该类成为一个unittest类。

unittest.TestCase有四个基本方法

  • setUpClass
  • setUp
  • tearDownClass
  • tearDown

注意这四个方法针对不同的测试用例和测试用例类,两两成一对,即setUptearDownsetUpClasstearDownClass

setUpClasstearDownClass都用@classmethod装饰器装饰为类方法,这两个方法分别在TestStringMethods的所有test case之前和之后运行一次。

setUptearDown则针对test case而言,每个test case执行前、后分别执行这两个方法。用于做测试的准备和收尾工作。

test case都以test作为方法的开始,这个命名传统用于向test runner通知哪些方法代表着test case。

观察测试结果,两个test case中, test_isupper先于test_split执行。默认情况下,test case的执行顺序为方法名的字典序(alphabetical)。同时还有其他若干方法可以调整test case的执行顺序。

断言assert

test case中最常用的断言方法

methodchecks thatnew in
assertEqual(a, b)a == b
assertNotEqual(a, b)a != b
assertTrue(x)bool(x) is True
assertFalse(x)bool(x) is False
assertIs(a, b)a is b3.1
assertIsNot(a, b)a is not b3.1
assertIsNone(x)x is None
assertIsNotNone(x)x is not None
assertIn(a, b)a in b3.1
assertNotIn(a, b)a not in b3.1
assertIsInstance(a, b)isinstance(a, b)3.2
assertNotIsInstance(a, b)not isinstance(a, b)3.2

Reference

1 经验分享:自动化测试框架之unittest,测试小涛
2 unittest教程(2w字实例合集)——Python自动化测试一文入门,是羽十八ya
3 python unittest official doc
4 Python unittest.TestCase execution order, stackoverflow

 

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

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

相关文章

OpenCV图像特征提取学习四,SIFT特征检测算法

一、SIFT特征检测概述 SIFT的全称是Scale Invariant Feature Transform,尺度不变特征变换,由加拿大教授David G.Lowe提出的。SIFT特征具有对旋转、尺度缩放、亮度变化等保持不变性,是一种非常稳定的局部特征。 1.1 SIFT算法具的特点 图像…

平衡搜索树——AVL树小记

文章目录二叉搜索树平衡搜索树AVL树定义AVL中平衡(Balance)因子的定义AVL树插入规则AVL树失衡情况左左失衡/右右失衡左右失衡RL失衡代码左旋-调整平衡插入调整平衡因子AVL树正确性的验证二叉搜索树 理想情况下,二叉搜索树的查找时间复杂度是0(log(n)) 但是&#xff…

Linux 进程概念 —— 初识操作系统(OS)

文章目录1. 概念2. 设计操作系统的目的3. 定位4. 如何理解管理5. 再谈操作系统🍑 硬件部分🍑 操作系统🍑 驱动程序🍑 用户部分🍑 系统调用接口🍑 用户接口操作6. 总结1. 概念 任何计算机系统都包含一个基本…

HTML5基础汇总

目录 一,html5文档头部 1.页面标题及字符集的收集 (1).title标签 (2).charset属性 2.元信息的设置 (1).meta标签的作用 (2).http-equiv/content (2&am…

数据结构堆介绍,图文详解分析——Java/Kotlin双版本代码

堆介绍 堆是一种特殊的树结构。根据根节点的值与子节点值的大小关系,堆又分为最大堆和最小堆。 最大堆:每个节点的值总是大于或者等于其任意子节点的值。所以最大堆中根节点即为最大值。 最小堆:每个节点的值总是小于或者等于其任意子节点…

第六章课后题(LSTM | GRU)

目录习题6-3 当使用公式(6.50)作为循环神经网络得状态更新公式时,分析其可能存在梯度爆炸的原因并给出解决办法.习题6-4 推导LSTM网络中参数的梯度,并分析其避免梯度消失的效果​编辑习题6-5 推导GRU网络中参数的梯度,并分析其避免梯度消失的…

集合框架----源码解读Vector篇

1.vector官方简绍 Vector类实现了一个可增长的对象数组。与数组一样,它包含可以使用整数索引访问的组件。但是,Vector的大小可以根据需要增加或缩小,以适应在创建Vector之后添加和删除项。 每个向量都试图通过维护一个容量和一个capacityIncr…

C#设计模式详解(2)——Factory Method(工厂方法)

文章目录C#设计模式详解(2)——Factory Method(工厂方法)工厂方法模式1.1 概念1.2 意图1.3 问题1.4 解决方案1.5 工厂方法模式结构1.6 案例代码1.7 游戏开发中的应用C#设计模式详解(2)——Factory Method(工厂方法) 工厂方法模式…

领悟《信号与系统》之 非周期信号的傅里叶变换

非周期信号的傅里叶变换一、非周期信号的傅里叶变换二、 典型信号的傅立叶变换1.单边指数信号2.偶双边指数3. 矩阵脉冲信号4. 奇双边指数5. 符号函数6. 冲激信号7. 阶跃信号三、常用傅里叶变换表这里记录的信号都是非周期信号的傅里叶变化,频谱变换的特点就是&#…

【计算机网络】数据链路层:使用广播信道的数据链路层(1)

局域网的数据链路层 局域网特点:网络为一个单位所拥有,地理范围和站点数目均有限。 地理范围和站点数目均有限。 局域网优点: 具有广播功能,从一个站点可以很方便地访问全网。 便于系统的拓展和演变,各设备的位置…

Discourse 论坛激活邮件问题

根据 Discourse 的官方推荐,我们使用的是 MailGun 的服务。 在大部分情况下都没有问题,但是在一些特定的邮件地址,例如 iCloud,我们在发送激活邮件的时候有提示为: "message": "5.5.1 Error: need MA…

实验:温湿度数据oled显示

OK,本次介绍一个oled实验 本来只想做oled实验的 后面想想这个实验太简单 就加上了温湿度传感器 oled可以打印英文和数字,比如用display.println(“Hello World!”)就可以了 如果打印汉字就比较复杂了 需要相应的软件,生成编码 然后一个字一个字打印 不过只要汉字不…

【数据结构】树——二叉树

1.树的介绍以及树的基本概念和性质 2.二叉树介绍以及二叉树的性质 3.二叉树的构建:穷举创建,递归创建 4.二叉树的基本操作 之前我们介绍了顺序表,链表,以及栈和队列,这几种数据结构都属于线性结构,而我们接…

GreenPlum/PostGreSQL表锁处理

GreenPlum/PostGreSQL表锁处理 数据库中遇到表锁的情况,可以通过select * from pg_stat_activity;查看表锁的进程及进程ID,从而取消进程,解锁。 一、模拟表锁 1.1 模拟表数据 创建lock_test表,并随意插入一条数据,…

Oracle自治事务示例演示

自治事务 自治事务(Pragma autonomous_transaction):是PL/SQL块中的一个单独事务,与调用或触发自己的事务之间互不干扰,自己commit和rollback不会影响其他事务,也不会被其他事务所影响。 通俗的讲&#xff…

【Android App】在线语音识别功能实现(使用云知声平台与WebSocket 超详细 附源码)

需要源码和相关资源请点赞关注收藏后评论区留下QQ~~~ 一、在线语音识别 云知声的语音识别同样采用WebSocket接口,待识别的音频流支持MP3和PCM两种格式,对于在线语音识别来说,云知声使用JSON串封装报文,待识别的音频以二进制形式发…

webpack打包vue文件+gulp打包sass文件

webpack打包vue文件 1,下载依赖 npm i vue-loader npm i webpack-cli2,编写webpack配置文件 /*** 关于webpack的配置文件*/const path require(path)const { VueLoaderPlugin } require(vue-loader)const glob require(glob) // node自带的读取文件的库 /*** …

会多门编程语言的你,最推荐哪3-5门语言?

如果你还想在编程的路上继续提高,那我建议你至少学习4种编程语言。可用的编程语言有很多,所以选择一种感兴趣的学习就可以了。我这么建议的原因是,要掌握编程,建立信心,提高能力,最简单的办法就是学习多种编…

浅析工作流调度器Azkaban

title: Azkaban系列 第一章 概述 1.1 为什么需要工作流调度器 1、一个完整的数据分析系统通常都是由大量任务单元组成: shell 脚本程序,java 程序,mapreduce 程序、hive 脚本等 2、各任务单元之间存在时间先后及前后依赖关系 3、为了很好地…

TIA西门子博途V18安装教程及注意事项

TIA西门子博途V18安装教程及注意事项 前提条件: TIA Portal V18需要.Net Framework 3.5环境,所以在安装TIA V18之前要先安装它。大家可以在控制面板中的程序和功能中检查是否已经安装,如果没有,可以参考以下步骤自行安装: 操作系统&#x