软件测试-unittest框架

unittest框架

文章大致内容

  • unittest框架的组成
  • 断言
  • 跳过(某些用列由于某些原因不想执行)
  • 参数化
  • 测试报告

UnitTest框架

  • 什么是Unittest框架?
    概念:unittest是python自带的一个单元测试框架,用他来做单元测试
    unittest框架作用是自动化脚本(用例代码)执行框架(使用unittest框架来管理运行多个测试用例)
  • 为什么使用unittest框架?
    1. 能够组织多个用例去执行
    2. 提供丰富的断言方法(让程序代替人工自动的判断预期结果和实际结果是否相符)
    3. 能够生成测试报告
  • UnitTest核心要素(unittest的组成部分)
    1. TestCase(最核心的模块)

      TestCase(测试用列),注意这个测试用例是unittest框架的组成部分,不是手工和自动化中我们说的用列(Test case)
      主要作用:每个TestCase(测试用例)都是一个代码,在这个代码文件中 来书写 真正的用例代码

    2. TestSuite

      TestSuite(测试套件),用来管理组装(打包)多个TestCased的

    3. TestRunner

      TestRunner(测试执行,测试运行) 用来执行TestSuite(测试套件)的

    4. TestLoader

      TestLoader(测试加载),功能是对TestSuite(测试套件)功能的补充
      管理组装(打包)多个TestCase(测试用例)的

    5. Fixture

      Fixture(测试夹具),书写TestCase(测试用例)代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容
      比如: 测试登录,每个用中都要重复书写的代码可以写在Fixture代码结构中,只写一遍,但是每次用例方法的执行,都会执行Fixture中的代码.1.打开浏览器,2.输入网址

TestCase(测试用例)
  1. 是一个代码文件
  2. 文件名称必须按照标识符的规则来书写,diamante作用可以在文件开头注释出来
  • 步骤:
    1. 导包 unittest
    2. 自定义测试类
    3. 在测试类中书写测试方法
    4. 执行用例
  • 代码
'''
代码的目的:学习TestCase(测试用例)模块的书写方法
'''
#1.导包
import unittest
#2.自定义测试类,需要继承unittest模块中的TestCase类即ke
class TestDemo3(unittest.TestCase):# 3.书写测试方法,即用列代码,目前没有真正的用例代码,使用print代替# 书写要求,测试方法 必须以test_开头(本质是以test开头)def test_method31(self):print('测试方法3-1')def test_method32(self):print('测试方法3-2')
#4 执行用列(方法)
#4.1 将光标放在 类名的后边 运行,会执行类中的所有的测试方法
#4.2 将光标放在 方法名的后边 运行,只执行当前的方法

文件的命名不规范

  1. 数字开头
  2. 有空格
  3. 有中文
  4. 其他特殊符号
    (应该是数字,字母,下划线组成,不能以数字开头)

代码运行没有结果
右键运行没有unittest For的提示,出现的问题
解决方案:

  1. 重新新建一个代码文件,将写好的代码复制进去
  2. 删除已有的运行方式

没有找到用例
测试方法中不是以test_开头的,或者单词写错了

Testsuite & TestRunner

Testsuite(测试套件):管理 打包 组装 TestCase(测试用例)文件的
TestRunner(测试执行):执行TestSuite(套件)

  • 步骤
  1. 导包(unittest)
  2. 实例化(创建对象)套件对象
  3. 使用套件对象添加用例方法
  4. 实例化运行对象
  5. 使用运行对象去执行套件对象
  • 代码
    TestSuite(测试套件):是用来管理多个TestCase(测试用例)的
    先创建多个TestCase(测试用列)文件
'''
代码的目的:学习TestCase(测试用例)模块的书写方法
'''
#1.导包
import unittest
#2.自定义测试类,需要继承unittest模块中的TestCase类即ke
class TestDemo(unittest.TestCase):# 3.书写测试方法,即用列代码,目前没有真正的用例代码,使用print代替# 书写要求,测试方法 必须以test_开头(本质是以test开头)def test_method01(self):print('测试方法1-1')def test_method02(self):print('测试方法1-2')
# 4 执行用列(方法)
#4.1 将光标放在 类名的后边 运行,会执行类中的所有的测试方法
#4.2 将光标放在 方法名的后边 运行,只执行当前的方法
'''
代码的目的:学习testCase(测试用列)模块的书写方法
'''
#1导包
import unittest
#2自动定义测试列
class TestDemo2(unittest.TestCase):#3书写测试方法,即用例代码def test_method11(self):print('测试方法2-1')def test_method12(self):print('测试方法2-2')# 4执行用列(方法)
#
'''
学习TestSuite和TestRunner的使用
'''
#1.导包(unittest)
import unittest
from TestDemo1 import TestDemo
from TestDemo2 import TestDemo2
# 2. 实例化(创建对象)套件对象
suite = unittest.TestSuite()
# 3. 使用套件对象添加用例方法
#方式一,套件对象.addTest(测试类名('方法名'))
#建议测试类名和方法名直接赋值,防止写错
suite.addTest(TestDemo('test_method01'))
suite.addTest(TestDemo('test_method02'))
suite.addTest(TestDemo2('test_method11'))
suite.addTest(TestDemo2('test_method12'))
# 4实例化运行对象
runner = unittest.TextTestRunner()
#5使用运行对象
#运行对象.run(套件对象)
runner.run(suite)
'''
学习TestSuite和TestRunner的使用
'''
#1.导包(unittest)
import unittest
from TestDemo1 import TestDemo
from TestDemo2 import TestDemo2
# 2. 实例化(创建对象)套件对象
suite = unittest.TestSuite()
# 3. 使用套件对象添加用例方法
#方式二,将一个测试类中的所有方法进行添加
#套件对象.addTest(unittest.makeSuite(测试类名))
# 缺点:makeSuite() 不会提示
suite.addTest(unittest.makeSuite(TestDemo))
suite.addTest(unittest.makeSuite(TestDemo2))
# 4实例化运行对象
runner = unittest.TextTestRunner()
#5使用运行对象
#运行对象.run(套件对象)
runner.run(suite)
Unittest组成

TestLoader(测试加载)
TestLoader(测试加载),作用和TestSuite的作用是一样的,对Testsuite功能的补充,用来组装测试用列的
如下:如果TestCase的代码文件有很多(10,20,30)
使用步骤:

  1. 导包
  2. 实例化测试加载对象并添加用例 ----> 得到的是suite对象
  3. 实例化,运行对象
  4. 运行对象执行套件对象
#1.导包
import unittest
#2.使用默认的加载对象并加载用例
suite = unittest.defaultTestLoader.discover('case','test*.py')#3.实例化运行对象并运行
unittest.TextTestRunner().run(suite)
Fixture(测试夹具)

fixture(测试夹具)是一种代码结构,在某种特定情况下会自动执行

import unittest
class TestLogin(unittest.TestCase):def setUp(self):'''每个测试方法执行前都会先调用这个方法'''print('输入网址')def tearDown(self):'''每个测试方法执行之后都会调用这个方法'''print('关闭页面')@classmethoddef setUpClass(cls) -> None:'''类,执行前调用这个方法'''print('打开浏览器')@classmethoddef tearDownClass(cls) -> None:'''类,执行后调用这个方法'''print('关闭浏览器')def test_login(self):print('输入正确的用户名和密码')def test_login2(self):print("输入错误的用户名和密码")
断言

让程序代替人工自动的判断预期结果和实际结果是否相符
断言的结果有两种:
True,用列通过
False,代码抛出异常,用列不通过
在unittest中使用断言,都需要通过self.断言方法 来试验

  • assertEqual
    self.assertEqual(预期结果,实际结果)
    相等通过,不相等不通过,抛出异常

  • assertIn
    self.assertIn(预期结果,实际结果)
    包含,通过,不包含不通过抛出异常

import unittestfrom Day_One.tools import loginclass TestLogin02(unittest.TestCase):def test_username_password_ok(self):"""正确的用户名和密码: admin, 123456, 登录成功"""self.assertEqual('登录成功',login('admin', '123456'))def test_username_error(self):"""错误的用户名: root, 123456, 登录失败"""self.assertEqual('登录失败',login('root', '123456'))def test_password_error(self):"""错误的密码: admin, 123123, 登录失败"""self.assertEqual('登录失败',login('admin', '123123'))def test_username_password_error(self):"""错误的用户名和错误的密码: aaa, 123123, 登录失败"""self.assertIn('失败', login('aaa', '123123'))
参数化

参数化,在测试方法中,使用变量来替代具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量

好处:相似代码不需要多次书写

工作中的场景

  1. 测试数据一般放在json文件中
  2. 使用代码读取json文件,提取需要的数据[(),()]or[[],[]]

安装插件

unittes框架不支持,参数化,想要使用参数化,需要安装插件来完成

联网安装(cmd窗口安装)

pip install parameterizedpip 是python中包的管理工具
#导包 unittest/pa
import unittest
from parameterized import parameterized
#组织测试数据[(),(),()] or [[],[],[]]
from Day_One.tools import logindata=[('admin','123456','登录成功'),('root','12344','登录失败'),('admin','123123','登录失败')]
#定义测试类
class TestLogin23(unittest.TestCase):#书写测试方法(用到的测试数据使用变量代替@parameterized.expand(data)def test_login(self,username,password,expect):self.assertEqual(expect,login(username,password))
# 组织测试数据并传参(装饰器@)
跳过

对于一些未完成的或者不满足测试条件的测试函数和测试类,不想执行,可以使用跳过

使用方法,装饰器完成

代码书写在TestCase文件

直接将测试函数标记成跳过

@unittest.skip(‘跳过的原因’)

根据条件判断测试函数是否跳过,判断条件成立,跳过

@unittest.skipif(判断条件,‘跳过原因’)

import unittest
version = 30
class TestDemo(unittest.TestCase):@unittest.skip('没有什么原因就是不想执行')def test_1(self):print('测试方法1')@unittest.skipIf(version>=30,'版本信息大于30,跳过')def test_2(self):print('测试方法2')def test_3(self):print('测试方法3')
第三方测试报告HTMLTestRunner
#1 获取第三方的测试运行类模块,将其放在代码的目录中
#2 导包unittest
import unittest
from HTMLTestRunner import HTMLTestRunner# 使用套件对象,加载对象,去添加用例方法
suite = unittest.defaultTestLoader.discover('.','Test_parameterized.py')
# 实例化第三方运行对象,并运行 套件对象
# HTMLTestRunner()参数如下
# stream=sys.stdout,文件对象 open
# verbosity=1, 报告详细程度 1简单 2详细
# title=None, 报告文件标题
# description=None 描述信息file = 'reort1.html'
with open(file,mode='wb') as f:runner = HTMLTestRunner(f,2,'ceshi','python3.6')#运行对象执行套件runner.run(suite)

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

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

相关文章

嵌入式学习记录6.17(qss练习)

一思维导图 二.练习 widget.h #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowFlag(Qt::FramelessWindowHint);this->setAttribute(Qt:…

五种HTTP数据传输方式

在前端开发过程中,后端主要提供 http 接口来传输数据,而这种数据传输方式主要有五种: url paramqueryform-urlencodedform-datajson 下面就让我们一起来了解一下在Nest.js中如何使用这五种HTTP数据传输方式: 一,创建项目 使用nest new 创建一个nest的项目 nest new 项目名称 …

Three.js框架的技术难点

Three.js作为一款功能强大的3D JavaScript框架,在为开发者提供丰富的功能和灵活性的同时,也带来了一些技术难点,需要开发者具备一定的知识和经验才能克服。以下是一些Three.js框架的技术难点。北京木奇移动技术有限公司,专业的软件…

微信小程序地图功能详解

引言 随着移动互联网的快速发展,地图服务已经成为我们日常生活中不可或缺的一部分。无论是查找目的地、规划路线还是探索周边环境,地图都能提供极大的便利。微信小程序作为一款轻量级的应用,也提供了丰富的地图功能,为用户提供了…

【解决】法启动此程序,因为计算机中丢失vcruntime140_1.dll,尝试重新安装此程序以解决此问题【包括安装mysql在内的】

缺少vcruntime140_1.dll解决此问题的第一步找到该文件,有些dll修复工具是收费的,因此下面介绍几种比较简单有效而且免费的解决办法 方法1:重新安装Visual C Redistributable Packages 上面的安装包解决win7,8,10,11的…

STM32HAL库--NVIC和EXTI

1. 外部中断实验 1.1 NVIC和EXTI简介 1.1.1 NVIC简介 NVIC 即嵌套向量中断控制器,全称 Nested vectored interrupt controller。是ARM Cortex-M处理器中用于管理中断的重要组件。负责处理中断请求,分配优先级,并协调中断的触发和响应。 它是…

【日记】被客户一顿输出该怎么办(431 字)

正文 上午有个客户在电话里对着我一顿输出,说他们没有发票财务账务没法处理怎么怎么的。话里话外满满一股 “全是你们的错” 的味道。 当时我很想笑,大姐,你对我输出有啥用啊。票是上级行开的,我们又没有开票权限,对…

让AI代替我写代码???——Codeium安装及使用

序 不知不觉又到了期末大作业的时间了,面对老师布置的超繁琐代码项目,竟一时有些发怵,不知道从何下手才好…… 但是,懒惰如张同学的我怎么能拘泥于老老实实完成这些毫无技术可言的作业呢? 于是乎,我便寻…

工程咨询单位乙级资信预评价条件一览

工程咨询单位乙级资信预评价条件一览: 一、基本要求 独立法人资格:申请单位必须具备独立的法人资格。 二、专业技术力量 咨询工程师数量:单位内咨询工程师(投资或相应专业领域)应不少于4人。专业人员配置&#xff…

【SQL server速成之路】函数

(3)LEFT函数 LEFT ( character_expression , integer_expression ) 功能:返回从字符串character_expression左边开始,由integer_expression指定个数的字符。参数character_expression:为字符型表达式,integ…

c#音乐播放器续(联网下载)

0.前言 书接上文,我们已经实现了一个能够播放本地音乐的音乐播放器,能够播放众多音乐格式,包括.ogg,接下来,我们将为我们的音乐播放器添加一个令人激动的新功能——联网音乐下载和播放!这个功能将使我们能…

浅谈Java23种设计模式之创建型设计模式的几种使用场景

前言: 都知道Java有23种设计模式,但实际开发中相信很多同学基本很少能利用上这些设计模式. 下面我将结合实际开发应用场景来进行简单解读一下这些设计模式在实际开发中是怎么使用的. 1.单例模式(Singleton) 确保一个类只有一个实例,并提供一…

C++中的享元模式

目录 享元模式(Flyweight Pattern) 实际应用 文字编辑器中的字符 修仙游戏中的地图瓦片 图形编辑器中的图形对象 总结 享元模式(Flyweight Pattern) 享元模式是一种结构型设计模式,用于减少对象的内存使用和提高…

Ubuntu 22.04 解决 firefox 中文界面乱码

问题复现 在为Ubuntu 22.04 Server安装完整的GNOME 42.01桌面后,将桌面语言设置为中文时,打开Firefox可能会出现中文乱码的问题。经过网上调查发现,这个问题是由Snap软件包引起的。 解决方案 为了避免在Ubuntu 22.04中文模式下的乱码问题…

Java解析Json格式数据

首先通过一定的方法得到String类型的Json数据。 然后利用fastjson中的JSON的parseObject()将String解析为JSONObject 然后通过get方法得到某个键对应的值&#xff1a; private String getOpenid(String code) {Map<String, String> map new HashMap<>();map.put(&…

数学建模基础:非线性模型

目录 前言 一、非线性方程组 二、非线性规划 三、微分方程模型 四、非线性模型的应用 五、实例示范&#xff1a;传染病传播模型 实例总结 五、总结 前言 非线性模型用于描述变量之间的非线性关系&#xff0c;相比线性模型&#xff0c;其数学形式更为复杂&#xff0c;但…

AI大模型会如何颠覆手机?

导语&#xff1a;大模型在手机端的落地&#xff0c;不仅仅是AI进入人类生活的开始&#xff0c;也是行业发生颠覆&#xff0c;新老巨头进行更替的时刻。 将大模型变小&#xff0c;再塞进手机&#xff0c;会给人们的生活带来怎样的影响&#xff1f; 最近&#xff0c;荣耀成为了…

【杂记-浅谈实现流量控制】

一、流量控制概述 流量控制是计算机网络中的一个关键技术&#xff0c;它涉及到的不仅仅是单一的技术层面&#xff0c;而是涵盖了从物理层到应用层的多个层次。在网络通信中&#xff0c;流量控制技术通过各种手段对数据流量进行管理和调控&#xff0c;以防止网络拥堵、提高网络…

Java基础学习-流程控制语句-顺序结构-分支结构-循环结构

目录 顺序结构&#xff1a; 分支结构&#xff1a; if语句&#xff1a; 第一种格式&#xff1a; if第二种格式&#xff1a; 案例练习 if第三种格式&#xff1a; switch语句&#xff1a; 格式&#xff1a; switch其他知识点&#xff1a; 循环结构&#xff1a; for循环…

centos安装多实例mysql

参考&#xff1a;CentOS7 单机配置mysql多实例运行-腾讯云开发者社区-腾讯云