python单元测试框架(测试固件、批量执行)

python测试框架

在Python语言中应用最广泛的单元测试框架是unittest和pytest,unittest属于标准库,只要安装了Python解释器后就可以直接导入使用了,pytest是第三方的库,需要单独的安装。

1.白盒测试原理

在软件架构的层面来说,测试最核心的步骤就是在软件开发过程中。就软件本身而言,软件的行为或者功能是软件细节实现的产物,这些最终是交付给用户的东⻄。所以在早期执行测试的系统有可能是一个可测试和健壮的系统,它会带来为用户提供的功能往往是让人满意的结果。因此给予这样的⻆度,开始执行测试的最佳方法是来自源代码,也就是软件编写的地方以及开发人员。由于源代码是对开发人员是可⻅的,这样的一个测试过程我们可以称为白盒测试

2.自动化测试用例编写

 

3.unittest实战

   unittest各个组件的介绍

  • testCase测试⽤例:测试类继承unittest模块中的TestCase类后,依据继承的这个类来设置⼀个新的测试⽤例类和测试⽅法。
  • 测试固件:测试固件表示⼀个测试⽤例或者多个测试以及清理⼯作所需要的设置或者准备。初始化合情理
  • testSuite测试套件:测试套件顾名思义就是相关测试⽤例的集合。在unittest中主要通过TestSuite类提供对测试套件的⽀持。
  • testRunner测试运⾏:管理和运⾏测试⽤例的对象。
  • assert测试断⾔:对所测试的对象依据返回的实际结果与期望结果进⾏断⾔校验
  • 测试结果:测试结果类管理着测试结果的输出,测试结果呈现给最终的⽤户来反馈本次测试执⾏的结果信息。

自动化测试用例要素包含:

1、前提条件 setUp()

2、测试步骤

3、结果验证

4、清理 tearDown()

4.unittest测试固件详解:

在unittest中测试固件依据方法可以分为两种执行方式,一种是测试固件只执行一次,另外一种是测试固件每次都执行,下面依据具体的案例来讲解二者

1.测试固件每次均执行

from selenium import webdriver
import unittest
class BaiduTest(unittest.TestCase):def setUp(self) -> None:self.driver=webdriver.Chrome()self.driver.get('http://www.baidu.com')self.driver.maximize_window()self.driver.implicitly_wait(30)def tearDown(self) -> None:self.driver.quit()def test_baidu_title(self):'''百度测试:验证百度首页的title'''# assert self.driver.title=='百度一下,你就知道'self.assertEqual(self.driver.title,'百度一下,你就知道')def test_baidu_url(self):'''百度测试:验证百度首页的url'''assert self.driver.current_url=='https://www.baidu.com/'def test_baidu_video(self):'''百度测试:验证点击视频后跳转到视频的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('视频').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url.startswith('https://haokan.baidu.com/?sfrom=baidu-top'))def test_baidu_map(self):'''百度测试:验证点击地图后跳转到地图的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('地图').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))if __name__ == '__main__':unittest.main(verbosuty=2)

执行如上的代码后,它的顺序为:测试固件-->测试用例,测试固件-->测试用例

2.测试固件只执行一次

使用的是类方法,这样测试固件只会执行一次的,⻅案例的代码:

from selenium import webdriver
import unittestclass BaiduTest(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.driver=webdriver.Chrome()cls.driver.maximize_window()cls.driver.get('http://www.baidu.com')cls.driver.implicitly_wait(30)@classmethoddef tearDownClass(cls) -> None:cls.driver.quit()def test_baidu_title(self):'''百度测试:验证百度首页的title'''# assert self.driver.title=='百度一下,你就知道'self.assertEqual(self.driver.title,'百度一下,你就知道')def test_baidu_url(self):'''百度测试:验证百度首页的url'''assert self.driver.current_url=='https://www.baidu.com/'def test_baidu_video(self):'''百度测试:验证点击视频后跳转到视频的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('视频').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')self.driver.close()self.driver.switch_to.window(nowhandler)def test_baidu_map(self):'''百度测试:验证点击地图后跳转到地图的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('地图').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))self.driver.close()self.driver.switch_to.window(nowhandler)unittest.main(verbosity=2)

5.测试用例执行顺序详解

在unittest中,测试点的执行顺序是依据ascill码来执行的,也就是说根据ASCII码的顺序加载,数字与字母的顺序为:0-9,A-Z,a-z,所以以A开头的测试用例方法会优先执行,以a开头会后执行。也就是根据数字的大小从小到大执行的,切记数字的大小值的是不包含test,值的是test后面的测试点的数字大小,

6.verbosity的详解

在unittest中,执行的时候默认是1,也就是unittest.main(verbosity=1),在verbosity有三个参数,分别是0,1,2,代表的意思具体如下:

0(静默模式):仅仅获取总的测试用例数以及总的结果

1(默认模式)

2(详细模式):测试结果会显示每个测试用例的所有相关信息

7.测试用例注意事项:

            1、在⼀个测试类⾥⾯,每⼀个测试⽅法都是以test开头的,test不能是中间或者尾部,必须是开头,建议test_

    2、每⼀个测试⽤例⽅法都应该有注释信息,这样在测试报告就会显示具体的测试点的检查点

    3、在⾃动化测试中,每个测试⽤例都必须得有断⾔,⽆断⾔的⾃动化测试⽤例是⽆效的

    4、最好⼀个测试⽤例⽅法对应⼀个业务测试点,不要多个业务检查点写⼀个测试⽤例

    5、如果涉及到业务逻辑的处理,最好把业务逻辑的处理⽅法放在断⾔前⾯,这样做的⽬的是不要因为业务逻辑执⾏错误导致断⾔也是失败

    6、测试⽤例名称最好规范,有约束

    7、是否先写⾃动化测试的测试代码,在使⽤⾃动化测试⽅式写,本⼈觉得没必要,毕竟能够做⾃动化测试的都具备了功能测试的基本⽔平,所以没必要把⼀个业务的检查点写多次,浪费时间和⼈⼒成本。

8.测试套件详解

按测试类执行

from selenium import webdriver
import unittestclass BaiduTest(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.driver=webdriver.Chrome()cls.driver.maximize_window()cls.driver.get('http://www.baidu.com')cls.driver.implicitly_wait(30)@classmethoddef tearDownClass(cls) -> None:cls.driver.quit()def test_baidu_title(self):'''百度测试:验证百度首页的title'''# assert self.driver.title=='百度一下,你就知道'self.assertEqual(self.driver.title,'百度一下,你就知道')def test_baidu_url(self):'''百度测试:验证百度首页的url'''assert self.driver.current_url=='https://www.baidu.com/'def test_baidu_video(self):'''百度测试:验证点击视频后跳转到视频的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('视频').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')self.driver.close()self.driver.switch_to.window(nowhandler)def test_baidu_map(self):'''百度测试:验证点击地图后跳转到地图的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('地图').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))self.driver.close()self.driver.switch_to.window(nowhandler)if __name__ == '__main__':# #按测试类来进行执行 调用TestLoader()当中的loadTestsFromTestCase的方法suite=unnittest.TestLoader().loadTestsFromTestCase(baiduTest)unnitest.TextTestRunner().run(suite)

按测试模块执行:

from selenium import webdriver
import unittestclass BaiduTest(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.driver=webdriver.Chrome()cls.driver.maximize_window()cls.driver.get('http://www.baidu.com')cls.driver.implicitly_wait(30)@classmethoddef tearDownClass(cls) -> None:cls.driver.quit()def test_baidu_title(self):'''百度测试:验证百度首页的title'''# assert self.driver.title=='百度一下,你就知道'self.assertEqual(self.driver.title,'百度一下,你就知道')def test_baidu_url(self):'''百度测试:验证百度首页的url'''assert self.driver.current_url=='https://www.baidu.com/'def test_baidu_video(self):'''百度测试:验证点击视频后跳转到视频的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('视频').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url,'https://haokan.baidu.com/?sfrom=baidu-top')self.driver.close()self.driver.switch_to.window(nowhandler)def test_baidu_map(self):'''百度测试:验证点击地图后跳转到地图的页面'''nowhandler=self.driver.current_window_handleself.driver.find_element_by_link_text('地图').click()allhandlers=self.driver.window_handlesfor handler in allhandlers:if handler!=nowhandler:self.driver.switch_to.window(handler)self.assertTrue(self.driver.current_url.startswith('https://map.baidu'))self.driver.close()self.driver.switch_to.window(nowhandler)if __name__ == '__main__':# 按模块来进行执行suite = unnittest.TestLoader().loadTestsFromModule('test_baidu_class.py')unnitest.TextTestRunner().run(suite)

9.批量执行所有的测试用例

import unittest
import osdef getTests():'''加载所有的测试模块'''suite=unittest.TestLoader().discover(#找到被执行模块的路径start_dir=os.path.dirname(__file__),#加载路径下所有以test_开头的测试模块的文件pattern='test_*.py' #正则表达式)return suitedef runSuite():unittest.TextTestRunner().run(getTests())runSuite()

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

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

相关文章

Kotlin入门:变量和函数——02

目录 一、Kotlin 基本数据类型 ​编辑 二、变量 val 关键字: var 关键字: 类型推断: 可空类型: 三、函数 基本函数语法: 单表达式函数: 默认参数值: 命名参数: 一、Kotlin 基本数据类型 Kotlin 的基本数…

关于selenium 元素定位的浅度解析

一、By类单一属性定位 元素名称 描述 Webdriver API id id属性 driver.find_element(By.ID, "id属性值") name name属性 driver.find_element(By.NAME, "name属性值") class_name class属性 driver.find_element(By.CLASS_NAME, "class_na…

MAUI+Blazor:隐藏标题栏和问题

文章目录 前言相关文章代码问题有必要解决吗? 前言 最近在研究MAUIBlazor开发,发现一个问题,原生的的标题栏实在是太丑了。 相关文章 MAUI桌面端标题栏设置和窗口调整 MAUI Windows How to completely hide the TitleBar? #15142 MAUI …

Chrome开发者工具介绍

Chrome开发者工具介绍 前言1 打开DevTools2 命令菜单3 Elements面板ConsoleJavaScript调试Network 前言 Chrome开发者工具是谷歌浏览器自带的一款开发者工具,它可以给开发者带来很大的便利。常用的开发者工具面板主要包含Elements面板、Console面板、Sources面板、…

数据结构——时间复杂度和空间复杂度

1.算法效率 2.时间复杂度 3.空间复杂度 4. 常见时间复杂度以及复杂度oj练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数的计算 long long Fib(int N) { if(N < 3) return 1; return Fib(N-1) Fib(N-2); }我们看到…

2023 互联网大厂薪资大比拼

最近整理了33家互联网大厂的薪资情况。可以看出来&#xff0c;大部分互联网大厂薪资还是很不错的&#xff0c;腾讯、阿里、美团、百度等大厂平均月薪超过30k&#xff0c;其他互联网大厂平均月薪也都在25k以上。01020304050607080910111213141516171819202122232425262728293031…

yo!这里是STL::list类简单模拟实现

目录 前言 重要接口实现 框架 默认成员函数 迭代器&#xff08;重点&#xff09; 1.引言 2.list迭代器类实现 3.list类中调用实现 增删查改 后记 前言 我们知道&#xff0c;stl中的vector对应数据结构中的顺序表&#xff0c;string类对应字符串&#xff0c;而今天要…

Unity C# 之 Http 获取网页的 html 数据,并去掉 html 格式等相关信息

Unity C# 之 Http 获取网页的 html 数据&#xff0c;并去掉 html 格式等相关信息 目录 Unity C# 之 Http 获取网页的 html 数据&#xff0c;并去掉 html 格式等相关信息 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、关键代码 一、简单介绍 Unity中的一些知…

Linux网络基础(中)

目录&#xff1a; 再谈“协议” HTTP协议 认识URL&#xff1a; urlnecode和urldecode HTTP协议格式&#xff1a; HTTP的方法&#xff1a; 简易HTTP服务器&#xff1a; 传输层 再谈端口号&#xff1a; 端口号范围划分&#xff1a; netstat&#xff1a; pidof&…

Ubantu安装Docker(完整详细)

先在官网上查看对应的版本:官网 然后根据官方文档一步一步跟着操作即可 必要准备 要成功安装Docker Desktop&#xff0c;必须&#xff1a; 满足系统要求 拥有64位版本的Ubuntu Jammy Jellyfish 22.04&#xff08;LTS&#xff09;或Ubuntu Impish Indri 21.10。 Docker Deskto…

Redis基础命令大全

这里写目录标题 第一章、Redis 命令大全1.1&#xff09;通用命令语法&#xff1a;ping语法&#xff1a;dbsize语法&#xff1a;select db语法&#xff1a;flushdb语法&#xff1a;exit 或 quit语法&#xff1a;redis-cli 1.2&#xff09;Redis 的 Key 的操作命令语法&#xff1…

Elasticsearch之kibana相关命令

1.中文分词器相关命令 2.拼音分词器相关命令

服务器之LNMP

lnmp的构成 L&#xff1a;linux系统,操作系统。 N&#xff1a;nginx网站服务&#xff0c;前端,提供前端的静态页面服务。同时具有代理,转发的作用。 转发&#xff1a;主要是转发后端请求。转发到PHP。nginx没有处理动态资源的功能,他有可以支持转发动态请求的模块。 M&…

REDIS主从配置

目录 前言 一、概述 二、作用 三、缺点 四、redis主从复制的流程 五、搭建redis主从复制 总结 前言 Redis的主从配置是指在Redis集群中&#xff0c;将一个Redis节点配置为主节点&#xff08;master&#xff09;&#xff0c;其他节点配置为从节点&#xff08;slave&#xff09;…

【数据结构•堆】堆排序(理论基础)

堆的定义  • 堆是一个完全二叉树   –所有叶子在同一层或者两个连续层   –最后一层的结点占据尽量左的位置  • 堆性质   –为空, 或者最小元素在根上   –两棵子树也是堆 存储方式  • 最小堆的元素保存在heap[1..hs]内   – 根在heap[1]   –K的左儿子是2k,…

细胞——求细胞数量 C++详解

细胞——求细胞数量 C详解 求细胞数量题目描述输入格式输出格式样例样例输入样例输出 提示数据规模与约定 解法代码 求细胞数量 题目描述 一矩形阵列由数字 0 0 0 到 9 9 9 组成&#xff0c;数字 1 1 1 到 9 9 9 代表细胞&#xff0c;细胞的定义为沿细胞数字上下左右若还…

vue3中使用component动态组件常见问题

一. 在vue3中使用动态组件问题警告处理 1. 代码如下 <template><div v-for"(item, index) in navItems" :key"index"><component :is"item.component" :key"item.gameId"></component></div> </te…

Leetcode-每日一题【剑指 Offer 26. 树的子结构】

题目 输入两棵二叉树A和B&#xff0c;判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构&#xff0c; 即 A中有出现和B相同的结构和节点值。 例如: 给定的树 A: 3 / \ 4 5 / \ 1 2 给定的树 B&#xff1a; 4 / 1 返回 true&#xff0…

Vue + MapBox快速搭建

一、说明&#xff1a; 1.mapbox-gl自2.0版本开始不再开源&#xff0c;需要用户在官网申请key使用。 2.maplibre GL JS是一个开源库&#xff0c;它起源于 mapbox-gl-js 的开源分支。该库的初始版本&#xff08;1.x&#xff09;旨在替代Mapbox的OSS版本。简单来说maplibre是mapb…

C++——缺省参数

缺省参数的定义 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数的时候&#xff0c;如果没有指定实参&#xff0c;则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout << a << endl; } int main() { Func()…