单元测试框架-Unittest

1 Selenium自动化测试基础和环境部署

1.Web功能自动化测试——为什么要学习单元测试框架unittest?除此之外还有没有其他的单元测试框架?

Python语言编写的WebDriver测试脚本通常使用单元测试框架来运行,所以,了解单元测试框架的基本方法和使用技巧很有必要。

对于单元测试框架来讲,主要完成了3件事情:

(1)提供了测试用例的组织与执行
(2)提供了丰富的断言方法
(3)提供了丰富的日志信息

Python有很多单元测试框架,如unittest、pytest、doctest、nose等。

2 单元测试框架

2.什么是框架?什么是单元测试?

framework,框架指的是为了解决一个或者是一类问题而开发的产品,用户一般只需要调用框架所提供的类或函数,就可以实现它所定义的功能,从这个角度理解unittest框架,它主要实现了测试用例的组织与执行,以及测试结果的生成。

3 元素定位

3.不用单元测试框架可以写单元测试嘛? 可以#calculator.py#整数的加法运算
class Count:#给类的实例变量赋初始值def __init__(self,a,b):self.a=int(a)self.b=int(b)#计算实例变量的和并返回def add(self):return self.a+self.b#testcount.pyfrom calculator import Countclass TestCount:def test_add(self):try:c=Count(2,3)s=c.add()assert s==4,'test fail'except AssertionError as msg:print(msg)else:print('test pass')mytest=TestCount()
mytest.test_add()

 

注解:

(1)assert语句的语法格式:assert 表达式,'报错信息'
——》判断表达式是否成立,如果不成立,则抛出异常错误,给出后面的报错信息,如果成立,则测试通过。
(2)以上这种测试方法的编写存在许多问题。首先,单元测试的编写没有一定的规范可遵循,不同的人写出来的测试程序可能不同,不统一的代码维护起来很麻烦。其次,需要编写大量的辅助代码才能进行单元测试。

为了让我们的单元测试代码更容易维护和编写,单元测试框架应运而生。

(3)使用unittest单元测试框架编写单元测试用例的代码实现:

#testcount1.pyimport unittest
from calculator import Countclass TestCount(unittest.TestCase):def setUp(self):print('test start')def tearDown(self):print('test end')def test_add(self):c=Count(2,3)self.assertEqual(c.add(),5)if __name__=='__main__':unittest.main()


注解:
(1)class TestCount(unittest.TestCase):——》使用unittest写单元测试时,创建的单元测试用例的类必须继承unittest的TestCase类;
(2)setUp()方法用于测试用例执行前的初始化工作,tearDown()方法用于测试用例执行后的清理工作。再测试方法test_add()方法里,不再使用烦琐的异常处理,我们使用unittest提供的assertEqual()方法对add的返回值进行断言(断言指的是预期结果和实际结果进行比较的过程),判断预期结果和实际结果是否相等;
(3)unittest提供了main()方法,main()方法可以自己去搜索所有包含再当前模块的所有以test开头的测试方法,并自动执行它们。
(4)使用unittest组织的单元测试里,可以自动执行的方法有:setUp(),tearDown(),以test打头的方法,除此之外的其他方法,例如a,b等,不会自动执行。
(5)if __name__=='__main__':——》testcount1.py文件既可以用来直接运行,也可以用来作为一个模块导入运行。如果你在文件中写了这个语句,那么它下面的语句块在自己直接运行的时候会被执行,被当作模块导入的时候不会被执行。

4 WebDriver API

 4.unittest里的4个重要概念

(1)Test Case(测试用例)
    测试用例指的是一个完整的测试流程,包括测试前的准备工作、测试过程即测试后的环境清理
    
(2)Test Suite(测试套件)
    一个功能的验证往往需要多条测试用例,将许多的测试用例组织在一起执行,就产生了测试套件的概念。Test Suite可以用来组装单个的测试用例

(3)Test Runner(测试运行器)
    一个Test Runner由执行设定的测试用例和将测试结果提供给用户两部分功能组成

(4)Test Fixture(测试固件)
    一个Test Fixture代表一个或多个测试执行前的准备工作和测试结束后的清理工作

单元测试的加载有两种方式:
(1)直接通过unittest.main()方法来加载所有的测试用例进行执行;
(2)将所有的测试用例添加到测试套件中,然后执行。

示例如下:

import unittest
from calculator import Countclass TestCount(unittest.TestCase):def setUp(self):print('test start')def tearDown(self):print('test end')def test_add1(self):c=Count(2,3)self.assertEqual(c.add(),5)def test_add2(self):c=Count(20,30)self.assertEqual(c.add(),50)if __name__=='__main__':#调用unittest的TestSuite类来创建测试套件(根据TestSuite类生成一个对象/实例)suite=unittest.TestSuite()#使用测试套件提供的addtest方法将测试用例加载进来suite.addTest(TestCount("test_add1"))suite.addTest(TestCount("test_add2"))#执行测试(根据TestRunner生成一个对象,调用对象的run方法)runner=unittest.TextTestRunner()runner.run(suite)--------------------------------------------------------------------------------------------

 

5 项目实战

 5.unittest常用的断言方法

断言方法的作用:在于做预期结果和实际结果的比较。

unittest提供了丰富的断言方法:

assertEqual(a,b) 判断a和b是否相等,相等则测试通过,不相等则测试失败
assertNotEqual(a,b) 判断a和b是否不相等,相等则测试失败,不相等则测试失败

assertTrue(x) 判断表达式x是否为True(成立),成立则测试通过,不成立则测试失败
assertFalse(x)

assertIs(a,b) 判断a,b是否为同一个对象,是则测试通过,不是则测试失败
assertIsNot(a,b)

assertIsNone(x):判断x是否为None,不是则测试失败
assertIsNotNone(x)

assertIn(a,b):判断a是否在b中,不在则测试失败
assertNotIn(a,b)

assertIsInstance(a,b):判断a是否是b的实例,不是则测试失败
assertNotIsInstance(a,b)

6 跳过测试和预期失败

在运行测试时,有时需要跳过某些测试用例或者将某些测试用例标记为预期失败。unittest提供了实现这些需求的装饰器。

装饰器:本质上是一个python函数,它可以让它所修饰的函数在不做任何代码变动的前提下增加额外的功能。

(1)@unittest.skip(原因)
无条件的跳过该测试用例,说明跳过测试的原因
(2)@unittest.skipIf(条件,原因)
如果条件成立,则跳过该测试用例
(3)@unittest.skipUnless(条件,原因)
如果条件成立,则不跳过该测试用例,否则跳过
(4)@unittest.expectedFailure()
不管执行结果是否失败,该用例标记为失败

示例:

#testzsq.pyimport unittestclass MyTest(unittest.TestCase):@unittest.skip('无条件跳过该测试')def test_skip(self):print('print a')@unittest.skipIf(2>1,'当条件成立时,跳过该测试')def test_skipif(self):print('print b')@unittest.skipUnless(2>1,'当条件成立时,执行该测试')def test_skipunless(self):print('print c')@unittest.expectedFailuredef test_expectedfailure(self):self.assertEqual(2,3)if __name__=='__main__':unittest.main()

 

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

 

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

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

相关文章

【日积月累】Java Lambda 表达式

目录 【日积月累】Java Lambda 表达式 1.前言2.语法3.应用场景3.1简化匿名内部类的编写3.1简化匿名内部类的编写3.2简化集合类中的操作3.3实现函数式接口3.4简化多个方法的调用3.5简化异步编程 4.总结5.参考 文章所属专区 日积月累 1.前言 Lambda表达式是一个匿名函数&#…

useState和setState区别

一、主要是讲一下类组件的状态和函数组件的状态 1.类组件中state只能有一个, 函数组件中state可以有多个 函数组件:可以使用对个状态,便于控制。 // 文章数量的初始值const [articleData, setArticleData] useState({list: [],// 文章列表…

【C程序设计】 C存储类

存储类定义 C 程序中变量/函数的存储位置、生命周期和作用域。 这些说明符放置在它们所修饰的类型之前。 下面列出 C 程序中可用的存储类: autoregisterstaticextern auto 存储类 auto 存储类是所有局部变量默认的存储类。 定义在函数中的变量默认为 auto 存储…

k8s 之7大CNI 网络插件

一、介绍 网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性。因此,业界已有不少不同的网络方案,来满足特定的环境和要求。 CNI意为容器网络…

基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码

基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于混合蛙跳优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

在pbootcms中制作静态化的TAG标签列表

如果你使用pbootcms来管理你的网站,你可能会遇到这样的需求:将TAG标签列表改成静态化的类似于栏目结构的需求。下面是实现这个需求的步骤。 步骤1 修改PHP文件 打开 apps/home/controller/ParserController.php 并找到大约在1852行左右的代码段&#x…

2024年测试岗最新自动化测试面试题整理,干货满满

一、接口测试 1、接口测试用例的编写要点有哪些?(问法二:接口测试用例设计需要考虑哪些方面?问法三:接口测试中有哪些要注意的测试点?) 1) 考虑输入参数和输出参数的合法性&#x…

SQL窗口函数大小详解

窗口大小 OVER 子句中的 frame_clause 选项用于指定一个滑动的窗口。窗口总是位于分区范围之内,是分区的一个子集。指定了窗口之后,分析函数不再基于分区进行计算,而是基于窗口内的数据进行计算。 指定窗口大小的语法如下: ROWS…

java进阶四-深入理解泛型和注解

泛型和注解是框架技术必备的技能 5 泛型5.1泛型理解5.1.1 泛型概念5.1.2 泛型的特点5.1.3 如何理解Java中的泛型是伪泛型?5.1.4 泛型的价值 5.2 泛型语法5.2.1 泛型类5.2.2 泛型接口3.2.3 泛型方法3.2.4泛型的上下边界3.2.5创建泛型数组 5.3泛型应用场景5.3.1数据库…

通用异构参数服务器技术

一、架构设计 通用异构参数服务器技术的架构设计主要考虑的是系统的可扩展性和灵活性。这种设计需要能够适应不同的计算环境和任务需求,包括CPU、GPU、FPGA等不同的计算资源。为了实现这一目标,参数服务器采用了层次化的架构设计,包括数据层…

Python实现 病理图像mrxs格式转SVS

直接给代码吧。 如果不需要svs格式,需要的是tif的话,可以直接用slideviewer或者caseviewer转成tif。 事先说明一下,这个代码是采用一次性读取整个WSI后,再转存为svs的方式。 所需要的内存需要满足一次性读取整个WSI的要求。 这个代…

(七)独立按键

文章目录 独立按键原理图三行代码法简单概述代码书写键码推算如何使用短按键长按键 状态机法简单概述代码书写键码推算如何使用短按键长按键 现象 独立按键原理图 三行代码法 简单概述 代码书写 u8 Trg 0x00;//短按键 u8 Cont 0x00;//长按键 void BtnThree(void) {u8 reada…

JWT(JSON Web Tokens)入门与Java实践

一、JWT简介 在现代Web应用中,身份验证和授权是确保系统安全性的关键环节。JSON Web Tokens(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在网络之间安全地传输信息。JW…

【AI】大模型的黑盒困惑

目录 一、人工智能大模型 二、大模型的黑盒特性 三、黑盒导致的问题 一、人工智能大模型 人工智能大模型是指使用深度学习技术构建的,具有庞大规模参数的神经网络模型。这些模型具有数以亿计的参数,能够对大量的数据进行训练,从而在各种任…

CMake入门教程【核心篇】安装(install)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 概述2. 使用方法2…

如何从零开始搭建公司自动化测试框架?

一、为什么要搭建自动化测试框架 测试如果按照是否手工划分,可以分为“手工测试”和“自动化测试”。 “手工测试”也就是用人力来进行功能测试。相比自动化测试而言执行效率慢,可以进行探索性测试和发散性测试。 “自动化测试”主要是通过所开发的软…

SSE和websocket

SSE (Server-Sent Events,服务器推送事件) 是一种用于实现服务器向客户端推送实时数据的 Web 技术。 SSE 允许服务器在建立的 HTTP 连接上发送事件流,而不需要客户端发起请求。相比于传统的请求-响应模式,它提供了一种服务器主动推送数据给客…

Python控制程控电源(USB)

文章目录 前言一、环境搭建1.软件安装2.硬件安装二、设置程控电源连接方式三、Python代码四、验证结果五、pyd文件前言 随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制…

nifi详细介绍--一款开箱即用、功能强大可靠,可用于处理和分发数据的大数据组件

目录 目录 一、引言 二、NiFi 的历史背景介绍 三、NiFi 是什么? 核心特性 应用领域 四、NIFI 入门 五 、NiFi 工作流程 六、实际应用场景 七、优势总结 一、引言 NiFi(Apache NiFi),全名为“Niagara Files”&#xff0…

Docker把容器打包成镜像并迁移到另外一台服务器上运行

在Docker中,您可以通过两个步骤将容器打包成镜像,并将该镜像保存到本地文件系统中。以下是具体步骤: 将容器提交为镜像: 使用 docker commit 命令可以将现有的容器状态保存为新的镜像。这个过程类似于创建一个镜像的快照。 假设您…