python07-单元测试框架unittest1-3

news2024/9/21 19:05:03

        当测试用例数量增加,一个一个执行效率低下,需要将工程下的,case收集并按顺序执行将对应的代码放入run_tests.py

 

run_tests.py:运行程序目的

  • 收集所有的测试用例
  • 执行
  • 生成测试报告

运用测试用例的收集器或测试用例的加载器

7 TestSuite & TestLoader的使用

使用TestSuite类来组织多个测试用例

使用TestLoader类来动态加载测试用例

常用的方法如下:

  • 方法一:
    unittest.TestSuite()
    addTest()添加一个测试用例
  • 方法二:
    unittest.TestLoader()
     unittest.TestLoader.loadTestsFromModule(模块名)不需要加引号(注意要导入模块)
  • 方法三:unittest.TestLoader.loadTestsFromTestCase(测试类名)不需要加引号

7.1 使用unittest.TestSuite()测试组件--addTest()

        当测试用例的数量增加时,需要将这些测试用例分组并按顺序执行,可以通过unittest.TestSuite来创建测试套件,并将多个测试用例添加到测试套件中

例子如下:

import unittest

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

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('hello'.upper(), 'HELLO')

    def test_isupper(self):
        self.assertTrue('HELLO'.isupper())
        self.assertFalse('Hello'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])

        with self.assertRaises(TypeError):
            s.split(2)

class TestAdd(unittest.TestCase):

    def test_add(self):
        self.assertEqual(add(1, 2), 3)
        self.assertEqual(add(0, 0), 0)

    def test_add_negative(self):
        self.assertEqual(add(-1, -2), -3)
        self.assertEqual(add(-1, 1), 0)

if __name__ == '__main__':
    suite = unittest.TestSuite()
    suite.addTest(unittest.makeSuite(TestStringMethods))
    suite.addTest(TestAdd('test_add'))
    unittest.TextTestRunner(verbosity=2).run(suite)

 

        在 例子中,定义了测试程序TestStringMethods和TestAdd。在main函数中,创建了一个测试套件suite,并使用addTest将TestStringMethods和TestAdd这两个测试程序添加到测试套件中,使用unittest.TextTestRunner类别来执行测试套件,并设置verbosity=2参数以显示更详细的报告

        使用测试套件可以将多个测试用例按顺序执行,从而更好的管理和执行测试

7.2  使用unittest.TestLoader()测试组件--loadTestsFromModule()

loader = unittest.TestLoader()

#只加载注册和登录的用例
suite_login = loader.loadTestsFromModule(test_login)#从某个模块中加载
suite_register = loader.loadTestsFromModule(test_register)

#有2个suite,需要再次合并初始化一个suite
suite_total = unittest.TestSuite()
suite_total.addTests([suite_login,suite_register]) #放入总的测试集

8 执行用例

8.1 TextTestRunner的用法

测试用例集合完毕,如何来执行测试用例?

需要用到TextTestrRunner执行测试集,用run 方法

#创建runner对象
runner = unittest.TextTestrRunner()
#这是传入测试集合执行
runner.run(suite)
import unittest
import os

#初始哈一个加载器,test_loader
loader = unittest.TestLoader()

#获取测试用例目录的路径
dir_path = os.path.dirname(os.path.abspath(__file__))
case_path = os.path.join(dir_path, 'tests')

#收集使用loader 收集所有的测试用例
#test_suit: unittest.TestSuite = loader.discover(case_path)
#discover自动识别收集测试用例,
test_suit = loader.discover(case_path)
print(test_suit)

#执行测试用例
#TextTestRunner:生成文本格式的测试报告

runner = unittest.TextTestRunner()
runner.run(test_suit)

 loader.discover(case_path),动态加载路径下符合条件的test模块,按顺序进行执行

 

"""动态加载的case"""
<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_addcase.TestAdd testMethod=test_add>]>]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_example01case.TestStringMethods testMethod=test_isupper>, <test_example01case.TestStringMethods testMethod=test_split>, <test_example01case.TestStringMethods testMethod=test_upper>]>]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_fixture.TestAdd testMethod=test_add>, <test_fixture.TestAdd testMethod=test_add_negative>]>, <unittest.suite.TestSuite tests=[<test_fixture.TestAdd2 testMethod=test_add2>, <test_fixture.TestAdd2 testMethod=test_add2_negative>]>]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_login.TesrLogin testMethod=test_login_01_success>, <test_login.TesrLogin testMethod=test_login_02_error>]>]>, <unittest.suite.TestSuite tests=[]>, <unittest.suite.TestSuite tests=[<unittest.suite.TestSuite tests=[<test_suitecase.TestAdd testMethod=test_add>, <test_suitecase.TestAdd testMethod=test_add_negative>]>, <unittest.suite.TestSuite tests=[<test_suitecase.TestStringMethods testMethod=test_isupper>, <test_suitecase.TestStringMethods testMethod=test_split>, <test_suitecase.TestStringMethods testMethod=test_upper>]>]>, <unittest.suite.TestSuite tests=[]>]>

9 生成测试报告

9.1 text类型的测试报告:

一般不使用这种报告,比较不规范

创建一个文件,以写的方式打开

#生成测试报告
with open("test_reports.txt", 'w', encoding= 'utf-8') as f:
    runner =unittest.TextTestRunner(f)
    runner.run(test_suit)

 

 补充点:

 .F:测试用例断言失败问题,可能是测试用例预期结果不对,可能测试用例执行出现bug

出现2种问题:

  • 发现bug
  • 代码预期结果不对

如图记录错误

.E:代码问题 ,需要改代码自己问题

9.2 html类型的测试报告:

 1)方法一:BeautifulReport模块生成

环境安装:pip install BeautifulReport

使用方式:

from BeautifulReport import BeautifulReport

br = BeautifulReport(suit)
br.report("测试报告", "test.html")
2) 方法二:HTMLTestRunnerNew模块生成
import unittest
import os
#初始化加载器
from HTMLTestRunnerNew import  HTMLTestRunner

from class20240714_unittest.tests import test_login,test_register

#初始哈一个加载器,test_loader
loader = unittest.TestLoader()

#获取测试用例目录的路径
dir_path = os.path.dirname(os.path.abspath(__file__))
case_path = os.path.join(dir_path, 'tests')

#收集使用loader 收集所有的测试用例
#test_suit: unittest.TestSuite = loader.discover(case_path)
#discover自动识别收集测试用例,
test_suit = loader.discover(case_path)
print(test_suit)

#HTML测试报告,不是内置的,是需要自己准备的
with open("test_reports.html", 'wb') as f:
    #自定义HTML内容
    runner = HTMLTestRunner(f, title = '测试报告',description= '测试报告的描述', tester= 'xiaoyi')
    runner.run(test_suit)

 运行结果:

报告:

unittest 图解:

 

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

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

相关文章

2.4梯度下降与量化策略优化

1. 梯度下降法的基本原理 欢迎来到“梯度下降”的世界&#xff01;听上去有点像在爬山对吧&#xff1f;其实&#xff0c;这个算法的灵感确实来自爬山。想象你在一个山谷中迷路了&#xff0c;周围雾蒙蒙的&#xff0c;看不清楚路&#xff0c;只能摸着石头一步一步往下走。每走一…

短效ip—互联网利器

《瞬息万变&#xff1a;短效IP在网络世界的奇幻之旅》 在浩瀚无垠的数字宇宙中&#xff0c;互联网如同一条奔腾不息的河流&#xff0c;携带着无数创新与技术的浪花。在这片日新月异的疆域里&#xff0c;短效IP以其独有的魅力&#xff0c;悄然成为网络探险家们手中的魔法钥匙。它…

编译原理概述

编译原理概述 编译原理是计算机科学的重要领域&#xff0c;主要研究编译器如何将高级编程语言转换为机器可执行代码。编译器的工作流程可以分为多个阶段&#xff0c;每个阶段都有特定的功能和目标。理解编译原理对于编写高效的代码、优化程序性能以及开发新语言或编译器非常重…

Java 线程实现暂停、中止

需求&#xff1a;用户可以开启任务&#xff0c;暂停任务和中止任务。 用户开启任务后&#xff0c;可以随时暂停或者中止。暂停后又可以回到原进度继续运行。 这里写目录标题 demo版-使用废弃的stop、suspend、resume实现为什么废弃了&#xff1f;不用stop&#xff0c;如何销毁线…

MySQL5.7.36之主从复制部署安装-centos7

主库是192.168.31.209:3306 从库是192.168.31.210:3308、192.168.31.209:3307、192.168.31.210:3309、192.168.31.211:3310、192.168.31.211:3311 切记&#xff1a;不管是主库还是从库&#xff0c;server_id一定不能重复 1、主库创建复制账号及授权 create user repl% iden…

Linux驱动开发基础(IRDA 红外遥控模块)

所学来自百问网 目录 1.红外遥控简介 2.硬件设计 3.软件设计 4. 示例代码 4.1 驱动代码 4.2 Makefile 4.3 实验效果 1.红外遥控简介 红外遥控被广泛应用于家用电器、工业控制和智能仪器系统中&#xff0c;像我们熟知的有电视机盒子遥控器、空调遥控器。红外遥控器系统…

分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP 含基础BP对比模型

分类预测|基于灰狼GWO优化BP神经网络的数据分类预测Matlab程序GWO-BP 含基础BP对比模型 文章目录 一、基本原理1. 灰狼优化算法&#xff08;GWO&#xff09;简介GWO的基本步骤 2. BP神经网络简介**BP网络的基本结构****训练过程** 3. GWO-BP分类预测的结合**结合流程** 4. GWO-…

苹果mac数据恢复概率大吗 mac数据恢复专业软件哪个好用

一般情况下&#xff0c;当我们把电脑中的数据删掉后&#xff0c;都会保存在回收站里面&#xff0c;但如果回收站被清空了或者数据在回收站中没有找到的话&#xff0c;那么&#xff0c;之前被删掉的数据还能恢复吗&#xff1f;恢复的概率有多大呢&#xff1f; 答案是可以的&…

Hive 案例分析(B站用户行为大数据分析)

Hive 案例分析&#xff08;B站用户行为大数据分析&#xff09; 一、案例需求二、设计数据表结构2.1 user 表结构2.2 video 表结构 三、创建数据表3.1 创建 video 数据库3.2 创建外表3.1.2 创建 external_user3.1.3 创建 external_video 3.2 创建内表3.2.1 创建 orc_user3.2.2 创…

Atlas阿特拉斯wordpress主题

Atlas阿特拉斯是一个专为WordPress平台设计的多功能主题&#xff0c;该主题由简站wordpress主题开发&#xff0c;旨在为用户提供一个强大而灵活的工具&#xff0c;以构建各种类型的网站。以下是对Atlas阿特拉斯WordPress主题的简介&#xff1a; Atlas阿特拉斯WordPress主题简介…

谷歌账号被停用了怎么申诉?申诉了好多天没有收到回复怎么办?申诉了很多次都被拒了怎么办?只有一个办法

这段时间似乎谷歌的风控措施又变严了&#xff0c;许多新账号被封&#xff08;尤其是买来的账号或者新注册的账号&#xff09;&#xff0c;甚至有一些使用了一年以上的老账号“莫名其妙地”也封了。 注&#xff1a;这里的封号是谷歌用户的一个通俗的说法&#xff0c;实际上指的…

【AIGC】MimicMotion:姿态引导的高质量人体运动视频生成技术

资源 论文&#xff1a;https://arxiv.org/pdf/2406.19680 github:https://github.com/Tencent/MimicMotion comfyui:https://github.com/kijai/ComfyUI-MimicMotionWrapper 核心要点 1. confidence-aware pose guidance可以确保高质量视频和时间维度上的帧与帧之间的平滑 …

MySQL的索引原理及使用

索引模型&#xff08;基础数据结构&#xff09; 索引模型&#xff1a;哈希表、有序数组、搜索树&#xff0c;这里的模型是指索引的底层实现的基本数据结构&#xff0c;Mysql中不同的引擎对于索引的实现结构说的即是索引模型。 有序数组 有序数组这个在数据结构中是最基础的结…

【开关电源】数字交错式升压功率因数校正解析(1)

文章目录 Digital Interleaved PFC 链接: TIDM-02010 Dual motor control with digital interleaved PFC for HVAC reference design Digital Interleaved PFC 电路的主干部分不做过多介绍&#xff0c;默认读者已清楚知道PFC电路的控制原理。 这里想要探讨一下D5和L6的作用。 …

Go开发运维:Go项目工程化进行初始配置

目录 一、实验 1.环境 2.初始化Go项目 3.Go项目工程化 4. 导入Gin包 5.下载viper与logrus依赖 二、问题 1.Windows如何进行go的版本升级 2. Go mod常用命令 3.下载Gin依赖失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统 软件版本备注Windows1…

JUC-指令有序性

指令重排 JVM 会在不影响正确性的前提下&#xff0c;可以调整语句的执行顺序&#xff0c;思考下面一段代码 static int i; static int j; // 在某个线程内执行如下赋值操作 i ...; j ...; 可以看到&#xff0c;至于是先执行 i 还是 先执行 j &#xff0c;对最终的结果不…

大数据技术之HBase优化(5)

目录 HBase 优化 RowKey 设计 实现需求 1 实现需求 2 添加预分区优化 参数优化 JVM 调优 HBase 使用经验法则 HBase 优化 RowKey 设计 一条数据的唯一标识就是 rowkey&#xff0c;那么这条数据存储于哪个分区&#xff0c;取决于 rowkey 处于哪个预分区的区间内。设计 rowkey …

音乐发烧友的蓝牙耳机推荐?四款开放式耳机推荐

蓝牙耳机我还是很推荐开放式耳机的&#xff0c;因为开放式耳机相较入耳式耳机佩戴起来真的很舒适。 不入耳的设计&#xff0c;能够给耳道带来足够的“呼吸空间”。还有许多主流的开放式耳机&#xff0c;像是大部分的挂耳式的蓝牙耳机&#xff0c;耳挂部分都是使用的耐用且易弯…

【吊打面试官系列-Redis面试题】Redis 的持久化机制是什么?各自的优缺点?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 的持久化机制是什么&#xff1f;各自的优缺点&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 的持久化机制是什么&#xff1f;各自的优缺点&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Jav…

网站开发:XTML+CSS - 网页文档结构

1. 前言 HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09;是构建网页和 web 应用程序的标准标记语言。它定义了网页的结构和内容&#xff0c;允许开发者创建有组织、语义化的文档。 HTML 使用一系列的元素&#xff08;elements&#xff09;和…