【00后卷王秘籍】python自动化测试—Python自动化框架及工具

news2025/8/6 0:10:26

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 unittest
 
 
class 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 string
        with 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_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true
 
----------------------------------------------------------------------
Ran 3 tests in 0.001s
 
FAILED (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_isupper
    self.assertTrue('Foo'.isupper())
AssertionError: False is not true
 
----------------------------------------------------------------------
Ran 3 tests in 0.001s
 
FAILED (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的一些设计思想和基本使用示例。其实工具的使用方法很简单,但是如何利用好这些工具来进行软件生产,则需要其它的计算机技能了,在后续的文章中将会从工程方面和技术方面来对此框架的应用进行深入的扩展。

学习资源分享

最后感谢每一个阅读我文章的人,一点小心意,虽然不是啥值钱的,需要的话直接拿走: 

 

 


 

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

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

相关文章

为什么99%的程序员都做不好SQL优化?

连接层 最上层是一些客户端和链接服务,包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念,为通过认证安全接入的客户端提供线程。同样…

forEach() 的用法

forEach() 方法用于遍历动态数组中每一个元素并执行特定操作。 forEach(回调函数(item){}) :数组遍历方法 item:指的是数组里的每一项 含义是:遍历数组里的每一项,对每一项执行一次回…

【Git】Git工作流程及使用

Git工作流程及使用Git工作流程与常用命令Git工作流程Git常用命令项目中使用Git的场景需求开发前的分支拉取流程,需求开发后的分支合并流程分支合并出现冲突如何解决线上出现事故代码如何回退Git工作流程与常用命令 Git工作流程 workspace:工作区 stagin…

学习streamlit-2

首先视频快速预览下今天的学习内容: Streamlit Shorts: How to make a button今天继续学习streamlit,首先激活之前建立的虚拟环境: ❯ conda activate streamlit-env (streamlit-env) ~ via 🐍 v3.9.16 via &#x1f…

3DCAT+一汽奥迪:共建线上个性化订车实时云渲染方案

近年来,随着5G网络和云计算技术的不断发展,交互式3D实时云看车正在成为一种新的看车方式。与传统的到4S店实地考察不同,消费者可以足不出户,通过网络与终端设备即可实现全方位展示、自选汽车配色、模拟效果、快捷选车并进行个性化…

面向对象设计模式:创建型模式之建造者模式

一、引入 Build:建造和构建具有建筑结构的大型物体 建楼:打牢地基、搭建框架、然后自下而上一层层盖起来。构建物体:通常需要先建造组成这个物体的各个部分,然后分阶段把它们组装起来 二、建造者模式 2.1 Intent 意图 Separate…

不考虑分配与合并情况下,GO实现GCMarkSweep(标记清除算法)

观前提醒 熟悉涉及到GC的最基本概念到底什么意思(《垃圾回收的算法与实现》)我用go实现(因为其他的都忘了,(╬◣д◢)ムキー!!) 源码地址(你的点赞,是我开源的…

基于鲸鱼算法优化SVM的发电功率回归预测,eemd-woa-svm

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 鲸鱼算法的原理及步骤 SVM应用实例,基于eemd分解+鲸鱼算法改进SVM的回归分析 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在…

Linux中将多块新硬盘合并成一个,挂载到/mysqldata目录下

需求: 将两块空硬盘合并为“一块”,挂载到指定目录(/data)下,达到在一个目录使用2块硬盘所有空间的效果。 使用 fdisk -l 命令查看当前系统中的硬盘,如下图: 系统中存在两块未分配的硬盘&#…

< Linux > 进程信号

目录 1、信号入门 生活角度的信号 技术应用角度的信号 前台进程 && 后台进程 信号概念 用kill -l命令察看系统定义的信号列表 信号处理的方式 2、信号产生前 用户层产生信号的方式 3、产生信号 3.1、通过终端按键产生信号 3.2、核心转储core dump 3.3、调用系统函数…

目前全网最全Linux学习笔记

操作系统 用户和计算机的接口,同时也是计算机硬件和其他软件的接口; 用户程序是运行的操作系统之上; 功能: 管理计算机系统的硬件、软件及数据资源,控制程序运行,改善人机界面,为其他应用软…

6.4 深度负反馈放大电路放大倍数的分析

实用的放大电路中多引入深度负反馈,因此分析负反馈放大电路的重点是从电路中分离出反馈网络,并求出反馈系数 F˙\pmb{\dot F}F˙。 一、深度负反馈的实质 在负反馈放大电路的一般表达式中,若 ∣1A˙F˙∣>>1|1\dot A\dot F|>>1…

微服务之 CAP原则

文章目录微服务CAP原则AC 可用性 一致性CP 一致性 分区容错性AP 可用性 分区容错性提示:以下是本篇文章正文内容,SpringCloud系列学习将会持续更新 微服务CAP原则 经过前面的学习,我们对 SpringCloud Netflix 以及 SpringCloud 官方整个生…

Windows 上 执行docker pull命令 提示:The system cannot find the file specified.

错误提示error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/version": open //./pipe/docker_engine: The system cannot find the file specified.解决办法在cmd 窗口中执…

视觉SLAM十四讲ch7-1视觉里程计笔记

视觉SLAM十四讲ch7-1 视觉里程计笔记本讲目标从本讲开始,开始介绍SLAM系统的重要算法特征点法ORB特征BRIEF实践特征提取与匹配2D-2D:对极几何八点法求E八点法的讨论从单应矩阵恢复R,t小结三角化![在这里插入图片描述](https://img-blog.csdni…

网络割接概述

网络割接概述割接背景企业网络的变化割接概述割接难点割接的操作流程情景模拟及解决方案常见的割接场景割接背景 随着企业业务的不断发展,企业网络为了适应业务的需求不断的改造和优化。无论是硬件的扩容、软件的升级、配置的变更,凡是影响现网运行业务…

转速/线速度/角速度计算FC

工业应用中很多设备控制离不开转速、线速度的计算,这篇博客给大家汇总整理。张力控制的开环闭环方法中也离不开转速和线速度的计算,详细内容请参看下面的文章链接: PLC张力控制(开环闭环算法分析)_plc的收卷张力控制系统_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不…

十四届蓝桥选拔赛Scratch-2023.01.15 试题解析

十四届蓝桥选拔赛Scratch-2023.01.15 试题解析 单选题: 1. 运行以下程序,当角色被点击时会出现什么效果?( C ) *选择题严禁使用程序验证,选择题不答和答错不扣分 A. 小猫说:“你好&#xff01…

前端脚手架搭建(part4)动态插入

例如控制模板的name、选择使用的插件,动态插入之前vue模板是有选择是否使用pinia、unocss,通过用户的选择,在项目中动态配置插件需要用到ejs读取模板,然后动态修改npm install ejs在libs/utils/index.js添加ejs模板的操作函数impo…

IOS - 抓包通杀篇

IOS中大多数情况,开发者都会使用OC提供的api函数,CFNetworkCopySystemProxySettings来进行代理检测; CFNetworkCopySystemProxySettings 检测函数直接会检测这些ip和端口等: 采用直接附加页面进程: frida -UF -l 通…