单元测试框架-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: [],// 文章列表…

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数据库…

(七)独立按键

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

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

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

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

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

Python控制程控电源(USB)

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

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

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

StratifiedGroupKFold解释和代码实现

StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么?二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码…

Redis:原理速成+项目实战——初识Redis、Redis的安装及启动、Redis客户端

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:首期文章 📚订阅专栏:Redis速成 希望文章对你们有所帮助 在此之前,我做过的项目里面也用到了…

利用深度学习图像识别技术实现教室人数识别

引言 在现代教育环境中,高效管理和监控教室成为了一个重要议题。随着人工智能技术的迅猛发展,特别是深度学习和图像识别领域的突破,我们现在可以通过智能系统来自动识别教室内的人数,从而实现更加智能化的教室管理。 深度学习与图…

LeetCode 84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释…

Spring-IOC综述

文章迁移自语雀。 怎么查看spring的文档 ioc综述 说到spring的ioc,其实就是控制反转,为啥需要控制反转呢,其实是为了功能的增强,如果不用spring, 我们直接使用工厂方法,静态工厂方法, 都是是可以获取到对象的,但是如果需求变了,我们在类的生成时,添加了很多信息,使用工厂就不…

【鸿蒙杂谈①】——鸿蒙基础介绍及应用领域

1.前言 小伙伴们大家好,最近被复习整的痛苦无比,所以今天咱们了解 一点轻松的东西,至于高并发就先放放吧。好了,废话不多说,咱们进入正题。 相信小伙伴们都已经看到了最近鸿蒙的势头了,那鸿蒙究竟是怎么发…

《Linux C编程实战》笔记:实现自己的myshell

ok,考完试成功复活 这次是自己的shell命令程序的示例 流程图: 关键函数 1.void print_prompt() 函数说明:这个函数打印myshell提示符,即“myshell$$”. 2.void get_input(char *buf) 函数说明:获得一条指令&#…