【00后卷王秘籍】python自动化测试—Python自动化框架及工具
1 、概述
手续的关于测试的方法论,都是建立在之前的文章里面提到的观点:
功能测试不建议做自动化
接口测试性价比最高
接口测试可以做自动化
后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。
本系列选择的测试语言是 python 脚本语言。由于其官方文档已经对原理有了比较清楚的解释,本文就不做一些多余的翻译工作了。偏向于实战部分,而且为了偏向实战,也会结合 IDE 工具和项目组织来进行讲解。
理由如下:
1.脚本语言,开发和迭代的效率极高
2.第三方的扩展库极多,有很我现成的工具可以使用
在正式进入到 自动化测试 的领域之前,先要建立这样的价值观。在Google内部工程师发布的软件测试的出版物里面提到:
“软件的自动化测试是有成本的,而且成本不低,基本上相当于在原有的 功能开发工程 的基础上再建立一个平行的 测试开发工程 ”。
也就是说,如果你对自动化测试有你的期望值,那么就肯定是要付出相应的代价和精力的。好的东西也是需要优秀的人花大量的时间去完成的。
2 、PyUnit测试框架
使用 python 作为自动化编程语言,那么就自然的使用 pyunit 作为自动化测试框架了。
如下部分的内容主要来自于 pyunit 的官方文档,本文仅仅做了一些翻译和结构上的简单调整。这部分属于测试框架的基本原理和概念部分,在进行代码编写前,有必要进行了解。
python的单元测试框架 PyUnit,可以认为是 Java 语言下的单元测试框架 JUnit 的 Python 语言实现版本,甚至其作者之一 Kent Beck 就是 JUnit 的作者。
unittest要达到如下目标:
支持自动化测试
让所有的测试脚本共享 开启(setup) 和 关闭(shutdown) 的代码
可以通过集合(collections)的方式来组织测试用例脚本
将所有的测试脚本从测试报告框架中独立出来
为了达到以上目标,unittest支持如下几个重要概念:
测试装置(test fixture)
为一个或者多个测试用例做一些准备工作,例如:连接一个数据库,创建一个目录,或者开启一个进程
测试用例(test case)
测试用例是测试行为的最小单元,通过对一些输入输出值的对比来进行测试检查
测试套件(test suite)
将 测试用例 或者 测试用例集合 聚合组织起来的集合。可以批量执行一个测试套件内所有的测试用例
测试执行器(test runner)
组织安排测试脚本执行活动的组件。测试执行器通过一些图形界面,文本界面或者返回一些特殊的值来展示测试脚本的测试结果,主要用于生成测试报告。
3 、基本示例
如下示例也来自于官方文档 basic_demo.py:
# coding:utf-8
"""
基本的自动化测试脚本 basic_demo.py
"""
__author__ = 'zheng'import unittestclass TestStringMethods(unittest.TestCase):def setUp(self):print 'init by setUp...'def tearDown(self):print 'end by tearDown...'def test_upper(self):self.assertEqual('foo'.upper(), 'FOO')def test_isupper(self):self.assertTrue('FOO'.isupper())self.assertFalse('Foo'.isupper())self.assertTrue('Foo'.isupper())def test_split(self):s = 'hello world'self.assertEqual(s.split(), ['hello', 'world'])# check that s.split fails when the separator is not a stringwith self.assertRaises(TypeError):s.split(2)if __name__ == '__main__':unittest.main()
虽然官方文档里面介绍了几种组织测试用例脚本的方式:
1.独立测试函数
2.单用例测试类
3.多用例测试类
不同的编写形态,会有不同的组织方式,具体的可以看官方文档。本文作者研究过官方文档后,最喜欢第三种方式 多用例测试类,也就是上面基本示例的方式,这种方式具有如下特点:
测试类 继承于 unittest.TestCase
一个测试类可以管理多个 测试脚本函数
测试脚本函数名称需要以 test_ 开头
一个测试类里面的所有的测试函数共享 setUp和tearDown函数
在控制台中运行此程序:
➜ src git:(master) ✗ python basic_demo.py
init by setUp...
Fend by tearDown...
init by setUp...
end by tearDown...
.init by setUp...
end by tearDown...
.
======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):File "basic_demo.py", line 24, in test_isupperself.assertTrue('Foo'.isupper())
AssertionError: False is not true----------------------------------------------------------------------
Ran 3 tests in 0.001sFAILED (failures=1)
➜ src git:(master) ✗
前面的基本例子的 main 函数采用的最简单的方式,直接运行所有的测试用例,并生成默认的文本报告。其实只需要对调用函数做一些简单的修改,可以将这些测试用例进行合理组织,并获取其实有用的数据信息,以便和信息系统进行集成,形成较好的扩展。
if __name__ == '__main__':# unittest.main()# 装载测试用例test_cases = unittest.TestLoader().loadTestsFromTestCase(TestStringMethods)# 使用测试套件并打包测试用例test_suit = unittest.TestSuite()test_suit.addTests(test_cases)# 运行测试套件,并返回测试结果test_result = unittest.TextTestRunner(verbosity=2).run(test_suit)#生成测试报告print("testsRun:%s" % test_result.testsRun)print("failures:%s" % len(test_result.failures))print("errors:%s" % len(test_result.errors))print("skipped:%s" % len(test_result.skipped))
运行后生成的输出为:
➜ src git:(master) ✗ python basic_demo.py
test_isupper (__main__.TestStringMethods) ... init by setUp...
FAIL
end by tearDown...
test_split (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok
test_upper (__main__.TestStringMethods) ... init by setUp...
end by tearDown...
ok======================================================================
FAIL: test_isupper (__main__.TestStringMethods)
----------------------------------------------------------------------
Traceback (most recent call last):File "basic_demo.py", line 23, in test_isupperself.assertTrue('Foo'.isupper())
AssertionError: False is not true----------------------------------------------------------------------
Ran 3 tests in 0.001sFAILED (failures=1)
testsRun:3
failures:1
errors:0
skipped:0
显然上面的输入结果已经将测试的结果进行了统计,这些数据都是一次测试活动中的重要指标,这些数据可以入库,和测试信息管理系统集成,后期生成仪表盘或者统计报表,形成稳定和产品测试线路图,这些都是和开发相关的了,在此不再多叙述了。
结合上面的具体例子,我们也可以找到上一节的理论部分对应的具体实现对象:
测试装置(test fixture)
由setUp函数来做初始化工作,由tearDown做销毁工作
测试用例(test case)
对应TestCase类,或者更细化的对应里面的测试脚本函数
测试套件(test suite)
对应TestSuite类
测试执行器(test runner)
对应TextTestRunner类
4、IDE工具
既然需要开发代码的生产力,那么就需要介绍一款IDE工具-- Pycharm。不可否认,它是目前最专注/专业的 Python 语言的 IDE 了。在对Pyunit 也有比较好的支持。
主要支持如下:
可视化的编程开发(这是IDE的基本特点)
对测试结果进行可视化的展示
导出生成HTML的测试报告
可视化控制用例执行(这个在开发调试阶段很方便,可以方便控制指定代码单元运行)
1.让一个目录下的所有用命执行
2.让单个文件内所有用例执行
3.让单个文件内的单个用命执行
4.1 运行和调试
Pycharm 对测试脚本提供了灵活的运行和调试支持。
通过pycharm,开发人员可以不用编写main函数,就可以实现如下功能:
运行一个文件下所有的测试类
运行一个测试类的所有测试脚本
运行一个测试类的某个测试脚本
其中 “运行一个测试类的某个测试脚本” 比较有用,适合在开发阶段快速地对单个脚本进行开发和运行调试。
使用方法:
1.将光标移动到测试函数内部
2.按下运行快捷键 ctrl+shift+F10 (Eclipse快捷键方案)
如果要断点调试,则使用Debug模式,即可对单个函数运行和断点调试了。
当然,也可以不必借用IDE,而通过对testSuit操作,也可以实现以上功能,但是IDE却提供了更灵活直接的选择。这只是一些IDE使用技巧,也不多述了。
4.2 结果可视化
对于前面提到的例子,如果选择在IDE中运行此程序,会看到如下效果:

可以看到全部运行通过。如果刻意将其中一个弄成不通过的,则会显示如下的结果:

4.3 生成测试报告
Pycharm也提供了测试结果报告的导出功能,在测试结果显示框上的一个功能按钮上。

导出结果如下:

当然,如果不考虑和信息系统集成,不考虑后续的仪表盘和测试统计工作,仅仅只是要生成报告,这个功能已经足够了。
一般情况下,做自动化测试和开发,上面的那些那些技能已经完全能够满足要求了,接下来要做的事情就是利用各种计算机基本知识,面对不断增加的业务需求,而不断地增加测试用例脚本了。
功能开发项目,原理都很简单,但是随着量的增加,都会形成规模,测试开发工程也是一样。
5、项目组织
之前对测试用例的 开发调试态 的工具进行了介绍。但是如果真正的要纳入到 持续集成 的自动化体系,就显然不能依赖于 IDE 了。而是使用python 语言的组织和调用方式了,比如:要有 main 函数来作为执行入口,等等。
详细的技术实现细节,在后面有机会,将再会写相应的文章进行介绍。
通过脱离IDE的项目组织方式,有如下优点:
可以通过事件触发来执行所有脚本(能够成为 持续集成 流水线的一环节
可以将数据全部提出并进行自定义加工和处理(和测试信息系统集成,为质量分析系统提供数据源)
6、测试平台
关于如何自动化生成测试报告这个测试产物,现在有一些平台能够提供接口调用及报告展示和分享功能

7、小结
本小部分的内容,主要是讲基于 python 语言的 自动化测试框架 pyunit的一些设计思想和基本使用示例。其实工具的使用方法很简单,但是如何利用好这些工具来进行软件生产,则需要其它的计算机技能了,在后续的文章中将会从工程方面和技术方面来对此框架的应用进行深入的扩展。
学习资源分享
最后感谢每一个阅读我文章的人,一点小心意,虽然不是啥值钱的,需要的话直接拿走:

相关文章:
【00后卷王秘籍】python自动化测试—Python自动化框架及工具
1 、概述 手续的关于测试的方法论,都是建立在之前的文章里面提到的观点: 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本系列选择的测试语言是 python 脚本语言。由于其…...
MySQL数据库基本操作
DDL 1、DDL解释 DDL(Data Definition Language),数据定义语言,该语言部分包括以下内容: 对数据库的常用操作 对表结构的常用操作 修改表结构1、对数据库的常用操作 2、对表结构的常用操作-创建表 创建表格式 3、对表结构的常用操作-创建表…...
2023年最新的站内SEO指南:如何通过关键词优化提高网站排名
SEO或搜索引擎优化是指通过改善网站的内部和外部元素,以获得更好的自然搜索引擎排名和更多的网站流量。 链接建设和外链是SEO的重要组成部分,因为它们可以提高网站的权威性和可信度,从而使其在搜索引擎中排名更高。 在此指南中,…...
【Java】Java环开发环境安装
Java环开发环境安装 简介: 如果要从事Java编程,则需要安装JDK,如果仅仅是运行一款Java程序则JRE就满足要求。 Java的安装包分为两类 一类是JRE其就是一个独立的Java运行环境; 一类是JDK其是Java的开发环境,不过在JDK…...
[蓝桥杯] 枚举、模拟和排列问题
文章目录 一、连号区间数 1、1 题目描述 1、2 题解关键思路与解答 二、递增三元组 2、1 题目描述 2、2 题解关键思路与解答 三、错误票据 3、1 题目描述 3、2 题解关键思路与解答 四、回文日期 4、1 题目描述 4、2 题解关键思路与解答 五、归并排序 标题:蓝桥杯——…...
C++基础了解-02-C++ 数据类型
C 数据类型 一、C 数据类型 使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当创建一个变量时,就会在内存中保留一些空间。 可能需要存储各种数据类型(比如字符型、宽…...
关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、abort()R6010等故障模块排查及解决方法
一、常见故障介绍 最近在开发相机项目(项目细节由于公司保密就不介绍了),程序运行5个来月以来首次出现msvcr100.dll故障等问题,于是乎开始了分析之路,按照度娘上的一顿操作,期间也是出现了各种不一样的问…...
【蓝桥杯集训·每日一题】AcWing 3305. 作物杂交
文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴Spfa算法一、题目 1、原题链接 3305. 作物杂交 2、题目描述 作物杂交是作物栽培中重要的一步。 已知有 N 种作物 (编号 1 至 N),第 i 种作物从播种到成熟的时间…...
深入浅出PaddlePaddle函数——paddle.to_tensor
分类目录:《深入浅出PaddlePaddle函数》总目录 相关文章: 深入浅出PaddlePaddle函数——paddle.Tensor 深入浅出PaddlePaddle函数——paddle.to_tensor 通过已知的data来创建一个Tensor,Tensor类型为paddle.Tensor。data可以是scalar、tupl…...
JavaScript高级程序设计读书分享之10章——函数
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 定义函数 定义函数有两种方式:函数声明和函数表达式大致看这两种方式没有什么区别,事实上,JavaScript 引擎在加载数据时对它们是区别对待的。JavaScript 引擎在任何代…...
第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项
文章目录第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项设计注意事项第八章 使用 ^%ZSTART 和 ^%ZSTOP 例程自定义启动和停止行为 - 设计注意事项 IRIS 可以在特定事件发生时执行自定义代码。需要两个步骤: 定义 ^%ZSTART 例程、^%ZSTO…...
工作实战之拦截器模式
目录 前言 一、结构中包含的角色 二、拦截器使用 1.拦截器角色 a.自定义拦截器UserValidateInterceptor,UserUpdateInterceptor,UserEditNameInterceptor b.拦截器配置者UserInterceptorChainConfigure,任意组装拦截器顺序 c.拦截器管理者…...
某美颜app sig参数分析
之前转载过该app的文章,今天翻版重新整理下,版本号:576O5Zu56eA56eAYXBwIHY5MDgw (base64 解码)。 上来先抓个包: jadx搜索关键词 "sigTime",然后定位到这里 看这行代码 cVar.addForm(INoCaptchaComponent.sig, genera…...
Linux - Linux系统优化思路
文章目录影响Linux性能的因素CPU内存磁盘I/O性能网络宽带操作系统相关资源系统安装优化内核参数优化文件系统优化应用程序软件资源系统性能分析工具vmstat命令iostat命令sar命令系统性能分析标准小结影响Linux性能的因素 CPU CPU是操作系统稳定运行的根本,CPU的速…...
2.Elasticsearch入门
2.Elasticsearch入门[toc]1.Elasticsearch简介Elasticsearch是用Java开发并且是当前最流行的开源的企业级搜索引擎。 能够达到实时搜索,稳定,可靠,快速,安装使用方便。客户端支持Java、.NET(C#)、PHP、Pyth…...
RK3399平台开发系列讲解(应用开发篇)断言的使用
🚀返回专栏总目录 文章目录 一、什么是断言二、静态断言三、运行时断言沉淀、分享、成长,让自己和他人都能有所收获!😄 📢断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供。 一、什么是断言 在编程中…...
云原生系列之使用prometheus监控nginx
前言 大家好,又见面了,我是沐风晓月,本文主要讲解云原生系列之使用prometheus监控nginx 文章收录到 csdn 我是沐风晓月的博客【prometheus监控系列】专栏,此专栏是沐风晓月对云原生prometheus的的总结,希望能够加深自…...
第六届省赛——8移动距离(总结规律)
题目:X星球居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为1,2,3...当排满一行时,从下一行相邻的楼往反方向排号。比如:当小区排号宽度为6时,开始情形如下:1 2 3 4 5 612 11 10 9 8 713 14 1…...
C++vector 简单实现
一。概述 vector是我们经常用的一个容器,其本质是一个线性数组。通过对动态内存的管理,增删改查数据,达到方便使用的目的。 作为一个线性表,控制元素个数,容量,开始位置的指针分别是: start …...
通用缓存存储设计实践
目录介绍 01.整体概述说明 1.1 项目背景介绍1.2 遇到问题记录1.3 基础概念介绍1.4 设计目标1.5 产生收益分析 02.市面存储方案 2.1 缓存存储有哪些2.2 缓存策略有哪些2.3 常见存储方案2.4 市面存储方案说明2.5 存储方案的不足 03.存储方案原理 3.1 Sp存储原理分析3.2 MMKV存储…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
