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

一、概述

【测试地址】: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 os3 import time4 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 Driver3 from selenium.webdriver.common.by import By4 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 Driver3 from selenium.webdriver.common.by import By4 from File.create import create_txt5 from webpage.LoginPage.login import Login6 import os7 8 OVER_TIME = 109 
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 Driver3 from webpage.LoginPage.login import Login4 from packages.selenium.webdriver.common.by import By5 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 Driver3 from webpage.LoginPage.login import Login4 from webpage.ListPage.list import List5 from File.create import create_txt6 from webpage.UploadFile.upload import Upload7 import unittest8 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万个文件

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

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

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

相关文章

基于高通MSM8953平台的android系统GPIO驱动开发

一、GPIO驱动: 1.1、注册设备: 1.1.1、创建文件: 1)、在kernel/msm-4.9/drivers/下创建july文件夹。 2)、在july文件夹下创建Kconfig、Makefile、ledctrl.c文件。 3)、修改Kconfine文件: 添加 source "drivers/july/Kconfig" 4)、修改Makefile文件: 添…

如何一键打开系统属性,编辑环境变量

常规方法: ①右键此电脑→打开属性 ②在控制面版中→系统与安全→系统 对于以上方法,我的电脑都不行,右键属性没反应;点击系统也没反应,这时打开运行窗口(winR)→输入sysdm.cpl →就可以直接到…

什么是PHP中的多态?

在面向对象编程(OOP)中,多态(Polymorphism)是一个重要的概念,它允许对象能够以多种形式进行操作。多态性使得具有相同接口的不同对象可以被同样的方式处理,从而提高了代码的灵活性和可扩展性。 …

Linux--Docker容器(最新)

这里写目录标题 安装Docker安装指令配置加速器 Docker简介名词解释作用run命令解读 操作常见命令命令的别名 数据卷简介数据卷命令使用 本地目录挂载问题发现问题解决二级目录二级目录 安装Docker 安装指令 如下文档 https://b11et3un53m.feishu.cn/wiki/Rfocw7ctXij2RBkShcu…

C# ref传参与out传参

在 C# 中,ref 和 out 都是用于传递参数的关键字 1、ref 关键字: ref 用于将一个变量传递给方法,并允许方法修改该变量的值。 调用方法时,必须先初始化被 ref 修饰的变量,否则会编译错误。 方法内部可以不给 ref 参数重…

【教3妹学编程-算法题】反转二叉树的奇数层

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家一起学习鸭~~~ 3妹:“你不是真正的快乐, 你的…

开具实习证明:在线实习项目介绍

大数据在线实习项目,是在线上为学生提供实习经验的项目。我们希望能够帮助想要在毕业后从事数据科学类工作的学生更加顺利地适应从教室到职场的转换;也帮助那些在工作中需要处理数据、实现数据价值的其他职能的从业者高效快速地掌握每天都能用起来的数据…

代码求解方程

说在前面 🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。 题目描述 求解一个给定的方程,将x以字符串 “x#value” 的形式返回。该方程仅包含 ‘’ &…

【5】基于多设计模式下的同步异步日志系统-代码设计

8. 代码设计 8.1 实用类设计 提前完成⼀些零碎的功能接⼝,以便于项⽬中会⽤到。 • 获取系统时间 • 判断⽂件是否存在 • 获取⽂件的所在⽬录路径 • 创建⽬录 /* 通⽤功能类,与业务⽆关的功能实现1. 获取系统时间2. 获取⽂件⼤⼩3. 创建⽬录4. 获取⽂…

SuperMap iClient3D for Cesium 实现鼠标移动选中模型并显示模型对应字段

SuperMap iClient3D for cesium 实现鼠标移动选中模型并显示模型对应字段 一、实现思路二、数据制作1. 计算出模型中心点并保存到属性表中2. 计算出模型顶部高程3. 模型数据切缓存4. 发布三维服务. 三、代码编写 作者:xkf 一、实现思路 将模型属性数据存储到前端&a…

深度学习环境配置

一、Anaconda安装 下载:从清华大学开源软件镜像下载 镜像网址 出现base即为安装成功: 检查显卡的驱动是否正确安装: (GPU可以显示出名称) GPU0是集显集成显卡是主板自带的显卡。 GPU1是独显即独立显卡&#xff0c…

[渗透测试学习] Codify - HackTheBox

首先nmap扫描端口 nmap -sV -sC -p- -v --min-rate 1000 10.10.11.239扫出来三个端口,22端口为ssh服务,80端口有http服务,3000端口为nodejs框架 尝试访问下80端口,发现页面重定向 将该域名添加到hosts里 sudo vim /etc/hosts 成…

el-table的复选框占满全格

el-table的复选框格子很小每次点击都点不到&#xff0c;又不想设置行点击&#xff0c;因为每次复制内容都会选中&#xff0c;实现效果是点击el-table的复选框单元格就可以选中 <template><div style"width: 60vw; margin: 10px;"><el-table :data&quo…

Java小案例-RocketMQ的11种消息类型,你知道几种?(延迟消息)

前言 上一节给大家讲了Rocket的顺序消息&#xff0c;这一节和大家聊一下延迟消息&#xff0c;关于顺序消息大家可以点下面这个链接直接看 RocketMQ的延迟消息 延迟消息 延迟消息就是指生产者发送消息之后&#xff0c;消息不会立马被消费&#xff0c;而是等待一定的时间之后…

计算机硬件 3.3其他存储设备

第三节 其他存储设备 一、固态硬盘&#xff08;SSD&#xff09; 1.优点&#xff1a;读写速度快、防震抗摔、低功耗、无噪声、轻便。 2.缺点&#xff1a;容量小、寿命限制、售价高。 3.接口&#xff1a;SATA3、M.2、Type-C、mSATA等。 4.分类&#xff1a;盒装式、插卡式。 二…

十五 动手学深度学习v2计算机视觉 ——全连接神经网络FCN

文章目录 FCN FCN 全卷积网络先使用卷积神经网络抽取图像特征&#xff0c;然后通过卷积层将通道数变换为类别个数&#xff0c;最后通过转置卷积层将特征图的高和宽变换为输入图像的尺寸。 因此&#xff0c;模型输出与输入图像的高和宽相同&#xff0c;且最终输出通道包含了该空…

海思平台isp之ccm标定

文章目录 1、raw图采集2、ccm标定2.1、标定参数配置2.2、标定效果优化2.2.1、优化方式一2.2.2、优化方式二2.2.3、优化方式三1、raw图采集 raw图采集步骤及标准,请参考文章 《海思平台isp之ccm标定》。2、ccm标定 2.1、标定参数配置 (1)图像基本参数 (2)黑电平设置 (…

Spring-MVC-文件上传下载

依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version> </dependency> <dependency><groupId>javax.servlet</groupId><artif…

mac视频调色 DaVinci Resolve Studio 18 中文 for Mac

DaVinci Resolve Studio 18是一款功能强大、专业可靠的视频编辑软件&#xff0c;适用于各种规模的媒体项目制作。无论是独立制片人还是大型制片公司&#xff0c;都可以借助该软件进行高质量的视频创作和后期制作。 得编辑工作更加高效和灵活。 调色和色彩校正&#xff1a;软件…

国外博士论文下载网址

系列文章目录 前言 如果你想补充其他相关网址&#xff0c;请留言 一、pqdtcn 1.1 使用说明 浏览本数据库建议使用chrome浏览器&#xff01; ProQuest检索平台在今年暑假做了界面升级。为了使您能更快了解升级后的界面功能&#xff0c;ProQuest公司准备了中文版用户使用手册…