文件上传自动化测试方案(超详细)

一、概述

【测试地址】:https://pan.baidu.com

【测试工具】:selenium、requests

【脚本语言】:Python

【运行环境】:Windows

百度网盘作为文件存储及分享的平台,核心功能大部分是对文件的操作,如果要对它进行自动化测试,优先覆盖的就是上传、分享、复制功能

测试方案的大致结构如下:

  图 1-1 系统流程图

二、上传测试用例

以文件上传功能为例,测试用例描述如下:

预置条件: 生成指定数量和大小的测试文件(txt、csv等)

操作步骤:1、用户登录

     2、遍历生成的文件所在的文件夹,得到所有的文件路径

     3、通过给FileUpload对象循环发送文件路径完成上传操作

预期结果:所有文件上传成功,查询文件信息显示正确

同时,在这我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看就行,希望对你有所帮助!【公众号:互联网杂货铺】免费领取软件测试资料!

软件测试工程师大忌!盲目自学软件测试真的会毁终生,能救一个是一个......

 

三、每个步骤的具体实现

1、生成指定数量和大小的测试文件:

以txt为例,其他文件(csv、word、pdf、jpg等)生成方式类似,可以网上找相关的方法和第三方库

 
 1 # -*- recoding:utf-8 -*-
 2 import os
 3 import time
 4 
 5 PATH = "D:/test_data/"
 6 
 7 
 8 def create_txt(path=PATH, file_num=1, file_size=8):
 9     """
10     :param path: 测试文件的存放路径
11     :param file_num: 需要生成的数量
12     :param file_size: 每个文件的大小,以KB为单位
13     """
14     if not os.path.exists(path):
15         os.mkdir(path)
16     for i in range(file_num):
17         file_name = "test_txt_"+str(i)+".txt"
18         data = "test_t"+str(time.localtime())
19         with open(os.path.join(path, file_name), 'w') as f_obj:
20             for j in range(8*file_size):
21                 f_obj.write(data)
22         print "create file: test_txt_(0-%d).txt in path %s success, file size: %sKB" % (file_num, path, file_size)
23 
24 
25 if __name__ == "__main__":
26     # 生成包含不同文件大小的文件夹
27     for i in range(10):
28         path = "D:/test_data/" + str(i)
29         create_txt(path=path, file_num=i, file_size=5*1024*i)

2、使用selenium通过web页面上传到服务器

首先是登录脚本

 1 # -*- coding:utf-8 -*-
 2 from WebDriver.webdriver import Driver
 3 from selenium.webdriver.common.by import By
 4 
 5 
 6 class Login():
 7 
 8     def __init__(self, user_name="admin", pwd="admin@123"):
 9         self.page = Driver()
10         page = self.page
11         page.start()
12         self.account_login_btn = page.find_element(By.LINK_TEXT, u"帐号密码登录")
13         self.account_text = page.find_element(By.ID, "TANGRAM__PSP_4__userName")
14         self.pwd_text = page.find_element(By.ID, "TANGRAM__PSP_4__password")
15         self.login_btn = page.find_element(By.ID, "TANGRAM__PSP_4__submit")
16         self.login(user_name, pwd)
17 
18     def login(self, user_name, pwd):
19         self.account_login_btn.click()
20         self.account_text.clear()
21         self.account_text.send_keys(user_name)
22         self.pwd_text.clear()
23         self.pwd_text.send_keys(pwd)
24         self.login_btn.click()
25         print "login success"
26 
27 
28 if __name__ == "__main__":
29     # 将XXX换成自己注册的百度网盘账号
30     Login("XXX", "XXX")

上传文件脚本:

1 # -*- coding:utf-8 -*-
 2 from WebDriver.webdriver import Driver
 3 from selenium.webdriver.common.by import By
 4 from File.create import create_txt
 5 from webpage.LoginPage.login import Login
 6 import os
 7 
 8 OVER_TIME = 10
 9 
10 
11 class Upload(object):
12 
13     def __init__(self, path):
14         self.page = Driver()
15         self.upload_file(path)
16 
17     def send_path(self, path):
18         for i in range(OVER_TIME):
19             try:
20                 self.page.find_element(By.NAME, "html5uploader").send_keys(path)
21                 return True
22             except Exception, e:
23                 print e
24 
25     def upload_file(self, path, file_num=3):
27         for root, dirs, files in os.walk(path):
28             for f_obj in files:
29                 self.send_path(os.path.join(path, f_obj))
30 
31 
32 if __name__ == "__main__":
33     Login("XXX", "XXX")
34     Upload("D:\\test_data")

大部分网站的上传控件使用的FileUpload对象,只要在页面找到上传控件的id或name等属性,通过给使用send_keys给控件发送文件在本地的路径,就能自动上传

百度的上传控件(这里使用的是name属性“html5uploader”):

3、上传结果检查,有两种检查方法:

1、检查上传时右下角的传输状态,通过上传成功标志的个数来判断是否上传完成及成功

2、在文件列表的中判断是否存在某个文件,代码实现如下:

 1 # -*- coding:utf-8 -*-
 2 from WebDriver.webdriver import Driver
 3 from webpage.LoginPage.login import Login
 4 from packages.selenium.webdriver.common.by import By
 5 
 6 
 7 class List(object):
 8 
 9     def __init__(self):
10         self.page = Driver()
11 
12     @property
13     def checkbox(self):
14         return self.page.find_elements(By.CLASS_NAME, "EOGexf")
15 
16     @property
17     def file_num(self):
18         return len(self.checkbox)
19 
20     @property
21     def file_name(self):
22         file_class = self.page.find_elements(By.CLASS_NAME, "nnmz6W8")
23         num = len(file_class)
24         name = []
25         for i in range(num):
26             file_name = file_class.__getitem__(i).get_attribute("title")
27             name.append(file_name)
28         return name
29 
30     def select(self, name="test_txt_1.txt"):
31         """
32         选中列表中的某个文件
33         :param name: 需要选中的文件名
34         """
35         for i in range(self.file_num):
36             check = self.checkbox.__getitem__(i)
37             file_name = self.file_name.__getitem__(i)
38             check.click()
39             if file_name == name:
40                 print file_name
41                 return True
42             else:
43                 check.click()
44         return False
45 
46 
47 if __name__ == "__main__":
48     Login("XXX", "XXX")
49     li = List()
50     li.select("test_file.txt")

 四、用例的管理

把main函数里面的操作步骤连起来就是测试用例了,当用例过多时,需要用框架来管理,目前比较流行的用例管理框架有RobotFramework、unittest,这里推荐unittest

 1 # -*- coding:utf-8 -*-
 2 from WebDriver.webdriver import Driver
 3 from webpage.LoginPage.login import Login
 4 from webpage.ListPage.list import List
 5 from File.create import create_txt
 6 from webpage.UploadFile.upload import Upload
 7 import unittest
 8 
 9 driver = Driver()
10 
11 
12 class TestCase(unittest.TestCase):
13 
14     @staticmethod
15     def setUpClass():
16         # 准备测试数据
17         create_txt(path="D:\\test_data2", file_num=10, file_size=50)
18 
19     def test_upload(self):
20         # 登录系统
21         Login("XXX", "XXX")
22         # 上传文件,upload方法后面少了一个wait_upload_finish()函数,可自行添加,如果想先看看效果,先time.sleep(20)
23         Upload("D:\\test_data2")
24         # 上传检查
25         li = List()
26         li.select("test_file.txt")
27 
28     def tearDown(self):
29         driver.quit()
30 
31     @staticmethod
32     def tearDownClass():
33         # 这个方法用来做一些清理工作,比如将已上传的文件删除
34         pass
35 
36     @staticmethod
37     def run_test():
38         suite = unittest.TestSuite()
39         # 此处只添加了一个用例,如果需要增加用例继续用addTest添加即可
40         suite.addTest(TestCase("test_upload"))
41         unittest.TextTestRunner().run(suite)
42 
43 if __name__ == "__main__":
44     TestCase.run_test()

五、使用requests完成接口自动化

做过UI自动化的同学一定会有这样的感受:

1、脚本运行慢,经常需要打开、关闭浏览器

2、经常出问题,维护需要消耗大量的精力,写了这么多用例没有发现几个BUG

所以现在大部分高自动化的童鞋都同意优先做接口的自动化测试,这里可以按照类似的思路实现接口自动化测试用例,还可以在UI自动化用例中引入接口脚本,

提升用例执行速度和减少维护工作,比如:需要测试分享功能,那可以通过调用接口来得到分享的URL,然后用selenium打开这个URL做接下来的测试

六、扩展及丰富系统

为了方便多人使用,可以用Django做一个测试平台出来,用来准备测试数据或管理测试用例,比如:

1、测试任务中需要20个文件的分享地址

2、需要测试某个操作的性能,需要50万个文件

这样可以在平台上生成即可,能在一定程度上提升测试效率,有兴趣的朋友自己实现或关注我,下期奉上!
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【单调栈】【区间合并】LeetCode85:最大矩形

作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的知识点 单调栈 区间合并 题目 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵,找出只包含 1 的最大矩形,并返回其面积。 示例 1&#xff1…

黑马头条--day01.环境搭建

一.前言 该项目学习自黑马程序员,由我整理如下,版权归黑马程序员所有 二.环境搭建 1.数据库 第一天,先创建如下库和表: sql文件如下: CREATE DATABASE IF NOT EXISTS leadnews_user DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_…

VBA快速填充缺失数据

实例需求:数据表中F列中存在数据缺失,如下图所示。现需要根据A列中的内容(类别,图中C1、C2、B1为不同类别),补充F列数据,已知每个类别中F列存在不少于一个非空单元格,并且其内容相同…

OpenAI发布了一份提示工程指南(Prompt Engineering Guide)

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 Open AI 发布了一份很棒的提示工程指南。 以下是在 GPT-4 使用提示时获得更好结果的 6 种策略的总结:

机器学习算法---回归

1. 线性回归(Linear Regression) 原理: 通过拟合一个线性方程来预测连续响应变量。线性回归假设特征和响应变量之间存在线性关系,并通过最小化误差的平方和来优化模型。优点: 简单、直观,易于理解和实现。…

瑞友天翼应用虚拟化系统 多处SQL 注入漏洞复现(可RCE)

0x01 产品简介 瑞友天翼应用虚拟化系统是西安瑞友信息技术资讯有限公司研发的具有自主知识产权,基于服务器计算架构的应用虚拟化平台。它将用户各种应用软件集中部署在瑞友天翼服务器(群)上,客户端通过WEB即可快速安全的访问经服务器上授权的应用软件,实现集中应用、远程接…

vue中iframe标签跨域通信——父子页面之间传值(解决子页面收不到父页面的值或子页面收到的数据为undefined的问题)

背景 因为本系统需要支持第三方系统页面的嵌入,于是尝试使用iframe标签,进行跨域通信,父子页面相互传值。初始化时,父页面发送数据给子页面,需要在子页面加载完成后发送,不然接收不到数据。父页面直接给子页…

js 高阶(含vue.js)

1、主动触发函数 this.$options.watch.watchOrdersFormPrice.apply(this);//主动触发watchOrdersFormPrice watch:{watchOrdersFormPrice: function(){if( !this.ordersForm.alone_sold_price && this.ordersForm.ginfo.goods_id ){var price_info this.ordersForm.…

uni-app微信小程序隐藏左上角返回按钮

官方文档链接:uni.setNavigationBarTitle(OBJECT) | uni-app官网 (dcloud.net.cn) 首先要明确的是页面间的跳转方式有几种、每一种默认的作用是什么。 uniapp五种跳转方式 第一:wx.navigatorTo 【新页面打开,默认会有返回按钮】第二&#x…

电脑自动关机怎么设置?

电脑自动关机怎么设置?如果你是一名上班族,工作忙起来很多事情都会忘记做,有时候忙到很晚后紧急下班,就会忘记给电脑关机,电脑如果经常不关机,那么电脑就会超负荷的运转,大家都知道电脑的寿命是…

jsp 健身房管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 健身房管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&a…

【系统设计】如何确保消息不会丢失?

一、前言 对于大部分业务系统来说,丢消息意味着数据丢失,是完全无法接受的。其实,现在主流的消息队列产品都提供了非常完善的消息可靠性保证机制,完全可以做到在消息传递过程中,即使发生网络中断或者硬件故障&#xf…

CMake创建wxWidgets桌面应用

CMake创建wxWidgets桌面应用 环境 Windows 10CMake 3.28MinGW 64 8.1wxWidgets 3.2.4 wxWidgets GitHub: https://github.com/wxWidgets/wxWidgets/文档地址: https://docs.wxwidgets.org/stable/page_topics.html下载地址:https://www.wxwidgets.org/downloads…

新版Edge(120) 侧边栏copilot消失解决办法

edge浏览器自动更新了,更新后侧边栏的copilot(以前的New Bing)图标没了查了网上的各种方法,说的比较多的是安装Edge Dev, 改地址等等,都比较麻烦,再装一个Edge也是不爽。终于在B站的评论里看到一个贼方便的…

python【matplotlib】鼠标拖动滚动缩放坐标范围和拖动图例共存

背景 根据前面的博文: python【matplotlib】画图鼠标缩放拖动动态改变坐标轴范围 和Python【Matplotlib】图例可拖动改变位置 两个博文,博主考虑了一下,如何将两者的功能结合起来,让二者共存。 只需根据Python【Matplotlib】鼠标…

代码随想录-刷题第二十八天

93. 复原 IP 地址 题目链接:93. 复原 IP 地址 思路:切割问题,原理上还是抽象成树形结构,然后使用回溯法。 131 题的要求是:让你把字符串 s 切分成若干个合法的回文串,返回所有的切分方法。 本题的要求是…

iOS_给View的部分区域截图 snapshot for view

文章目录 1.将整个view截图返回image:2.截取view的部分区域,返回image:3.旧方法:4.Tips参考: 1.将整个view截图返回image: 这些 api 已被废弃,所以需要判断 iOS 版本 写两套代码: R…

vue中实现PDF文件流预览

代码示例 <template><div class"print"><div v-if"!viewShow" class"opt-box"><div style"height: 700px; overflow: auto;"><el-table :data"tableData" border><el-table-column prop…

2019年第八届数学建模国际赛小美赛A题放射性产生的热量解题全过程文档及程序

2019年第八届数学建模国际赛小美赛 A题 放射性产生的热量 原题再现&#xff1a; 假设我们把一块半衰期很长的放射性物质做成一个特定的形状。在这种材料中&#xff0c;原子核在衰变时会以随机的方向释放质子。我们假设携带质子的能量是一个常数。质子在穿过致密物质时&#x…

详谈前端中常用的加/密算法

本文主要详细介绍了在前端开发中常用的加/解密算法&#xff0c;以及前端如何实现。 总的来说&#xff1a;前端加密无论使用哪个加密都一样是有可能性被他人获取到相关的公钥或密钥的&#xff08;比如&#xff1a;拦截请求、查看源代码等&#xff09;&#xff0c;然后进行加密与…