文件上传自动化测试方案

news2024/12/26 0:05:33

一、概述

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

【测试工具】selenium、requests

【脚本语言】Python

【运行环境】Windows

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

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

二、上传测试用例

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

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

操作步骤:1、用户登录

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

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

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

三、每个步骤的具体实现

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

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

# -*- recoding:utf-8 -*-
import os
import time

PATH = "D:/test_data/"


def create_txt(path=PATH, file_num=1, file_size=8):
    """
    :param path: 测试文件的存放路径
    :param file_num: 需要生成的数量
    :param file_size: 每个文件的大小,以KB为单位
    """
    if not os.path.exists(path):
        os.mkdir(path)
    for i in range(file_num):
        file_name = "test_txt_"+str(i)+".txt"
        data = "test_t"+str(time.localtime())
        with open(os.path.join(path, file_name), 'w') as f_obj:
            for j in range(8*file_size):
                f_obj.write(data)
        print "create file: test_txt_(0-%d).txt in path %s success, file size: %sKB" % (file_num, path, file_size)


if __name__ == "__main__":
    # 生成包含不同文件大小的文件夹
    for i in range(10):
        path = "D:/test_data/" + str(i)
        create_txt(path=path, file_num=i, file_size=5*1024*i)

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

首先是登录脚本,对webdriver看不懂的同学可以关注我的公众号进群交流

# -*- coding:utf-8 -*-
from WebDriver.webdriver import Driver
from selenium.webdriver.common.by import By


class Login():

    def __init__(self, user_name="admin", pwd="admin@123"):
        self.page = Driver()
        page = self.page
        page.start()
        self.account_login_btn = page.find_element(By.LINK_TEXT, u"帐号密码登录")
        self.account_text = page.find_element(By.ID, "TANGRAM__PSP_4__userName")
        self.pwd_text = page.find_element(By.ID, "TANGRAM__PSP_4__password")
        self.login_btn = page.find_element(By.ID, "TANGRAM__PSP_4__submit")
        self.login(user_name, pwd)

    def login(self, user_name, pwd):
        self.account_login_btn.click()
        self.account_text.clear()
        self.account_text.send_keys(user_name)
        self.pwd_text.clear()
        self.pwd_text.send_keys(pwd)
        self.login_btn.click()
        print "login success"


if __name__ == "__main__":
    # 将XXX换成自己注册的百度网盘账号
    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、在文件列表的中判断是否存在某个文件,代码实现如下:

# -*- coding:utf-8 -*-
from WebDriver.webdriver import Driver
from webpage.LoginPage.login import Login
from packages.selenium.webdriver.common.by import By


class List(object):

    def __init__(self):
        self.page = Driver()

    @property
    def checkbox(self):
        return self.page.find_elements(By.CLASS_NAME, "EOGexf")

    @property
    def file_num(self):
        return len(self.checkbox)

    @property
    def file_name(self):
        file_class = self.page.find_elements(By.CLASS_NAME, "nnmz6W8")
        num = len(file_class)
        name = []
        for i in range(num):
            file_name = file_class.__getitem__(i).get_attribute("title")
            name.append(file_name)
        return name

    def select(self, name="test_txt_1.txt"):
        """
        选中列表中的某个文件
        :param name: 需要选中的文件名
        """
        for i in range(self.file_num):
            check = self.checkbox.__getitem__(i)
            file_name = self.file_name.__getitem__(i)
            check.click()
            if file_name == name:
                print file_name
                return True
            else:
                check.click()
        return False


if __name__ == "__main__":
    Login("XXX", "XXX")
    li = List()
    li.select("test_file.txt")

三、用例的管理

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

# -*- coding:utf-8 -*-
from WebDriver.webdriver import Driver
from webpage.LoginPage.login import Login
from webpage.ListPage.list import List
from File.create import create_txt
from webpage.UploadFile.upload import Upload
import unittest

driver = Driver()


class TestCase(unittest.TestCase):

    @staticmethod
    def setUpClass():
        # 准备测试数据
        create_txt(path="D:\\test_data2", file_num=10, file_size=50)

    def test_upload(self):
        # 登录系统
        Login("XXX", "XXX")
        # 上传文件,upload方法后面少了一个wait_upload_finish()函数,可自行添加,如果想先看看效果,先time.sleep(20)
        Upload("D:\\test_data2")
        # 上传检查
        li = List()
        li.select("test_file.txt")

    def tearDown(self):
        driver.quit()

    @staticmethod
    def tearDownClass():
        # 这个方法用来做一些清理工作,比如将已上传的文件删除
        pass

    @staticmethod
    def run_test():
        suite = unittest.TestSuite()
        # 此处只添加了一个用例,如果需要增加用例继续用addTest添加即可
        suite.addTest(TestCase("test_upload"))
        unittest.TextTestRunner().run(suite)

if __name__ == "__main__":
    TestCase.run_test()

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

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

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

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

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

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

四、扩展及丰富系统

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

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

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

这样可以在平台上生成即可,能在一定程度上提升测试效率

公众号:


资源分享

下面这份资源,对于想学习【软件测试】的朋友来说应该是最全面最完整的备战仓库,希望也能帮助到你!在这里插入图片描述

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

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

相关文章

马克思主义基本原理笔记(黄色标记要求会背)

马克思主义基本组成部分 马克思主义哲学马克思主义政治经济学科学社会主义历史学、政治学、法学、文化学、新闻学、军事学等 唯物主义,唯心主义划分标准 唯物主义:把世界的本原归结为物质,主张物质是第一性,意识第二性&#xff0c…

Docker容器网络入门

1、查看默认网络模式 首先假定已经安装好docker了,不会安装的可以看我其他文章,很简单。docker安装好后默认是提供三种网络模式(bridge、host、none),可以使用命令docker network ls查看网络状态 [rootlocalhost ~]#…

构建平衡二叉树(数据结构)

构建二又平衡树,插入的节点序列依次为:70 60 40 90 80 98 我们先了解一个构造规则 1、将每一个节点按照顺序依次使用 2、先将第一个节点画在图上,将第二个节点与第一个节点比较, (1)若比该节点大,第二个…

飞行员兄弟(蓝桥杯C/C++B组真题详解)

目录 题目链接:116. 飞行员兄弟 - AcWing题库​​​​​​ 题目思路: 代码详解: 题目链接:116. 飞行员兄弟 - AcWing题库​​​​​​ 题目思路: 1.我们可以知道 对于任意一个点 重复的按两次的话 回不改变原状…

ADI Blackfin DSP处理器-BF533的开发详解43:图像处理专题-ReverseColor (图像反色处理)(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像反色处理,代码运行时,会通过文件系统打开工程文件根目下" …/ImageView"路径中的 tes…

Linux下局域网yum源配置

文章目录一 需求二 搭建环境准备三 服务端1 创建镜像存放目录与挂载目录2 上传centos7镜像3 对镜像文件进行挂载4 配置本地yum源5 对挂载点建立软链接6 安装http服务7 浏览器验证http服务是否正常启动四 客户端1 修改yum配置文件2 查看yum源一 需求 公司集群架构中&#xff0c…

【linux】之大数据基础平台实施及运维上

一、大数据介绍 学习目标 能够了解为什么使用大数据技术 能够了解大数据指的是什么 为什么使用大数据技术? 数据量越来越大 数据量越来越大数据分析的实时性越来越强数据结果的应用越来越广泛 结论:我们需要使用大数据技术 大数据的定义 大数据是收…

GC垃圾回收器

分代收集器 新生代回收器 Serial:复制算法 | 单线程 | 适合内存不大的场景 ParNew:复制算法 | 多线程 | Serial收集器多线程版本 Parallel Scavenge:复制算法 | 多线程 | 类ParNew,更关注吞吐量 老年代回收器 Serial Old&#xf…

postgresql文件结构

一、控制文件 pg_controldata $PGDATA 二、数据文件 pg中,每个索引、每个表都是一个单独的文件,pg中称为page(也称为段),默认是每个大于1G的page会被分割。例如某个表有200g的大小,那么会被分割为200个文件存储 sel…

Gateway限流的使用

目录 1. 限流的使用场景 2. gateway限流实现 2.1 前提: 2.2 导入依赖包 2.3 在项目配置文件中配置redis​编辑 2.4 开发限流需要的Bean​编辑 2.5 为服务配置限流参数 2.6 压力测试 3. 熔断 3.1 熔断的使用场景 1. 限流的使用场景 为什么限流 限流就是限制…

web网页设计期末课程大作业 基于HTML+CSS+JavaScript制作八大菜系介绍舌尖上的美食5页

🎀 精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

4、Metasploit系列----未知目标测试

靶机Metasploitable2:192.168.11.105 攻击机kail:192.168.11.106 一、创建工作空间 显示数据库未连接:使用msfdb init对数据进行初始化:db_status显示数据库已连接。使用命令workspace -a 192.168.11.105创建目标工作空间。二、信…

Spring Batch 批处理-作业参数校验

引言 接着上篇:Spring Batch 批处理-作业参数设置与获取,了解作业参数设置与获取后,本篇就来了解一下Spirng Batch 作业参数的校验。 作业参数校验 当外部传入的参数进入步骤处理时,我们需要确保参数符合期望。比如&#xff1a…

前端实现电子签名(web、移动端)通用

前言 在现在的时代发展中,从以前的手写签名,逐渐衍生出了电子签名。电子签名和纸质手写签名一样具有法律效应。电子签名目前主要还是在需要个人确认的产品环节和司法类相关的产品上较多。 举个常用的例子,大家都用过钉钉,钉钉上…

对于双欧拉角(正反欧拉角)的一些理解和思考

文章目录一、正反欧拉角定义二、相关文献阐述三、对正反欧拉角的思考四、参考代码五、参考文献最近看到有人讨论“双欧拉角”或者“正反欧拉角”的问题,因为自己之前没听说过这个概念,为了避免无知,因此找了一些文献进行学习和理解。不过基于…

mysql优化,SELECT语句创建理想索引

思考索引的问题: 1.为什么主键索引比非主键索引快? 2.为什么sql使用like关键字 “%XXX%”无法走索引,而“XXX%”可以? 3.为什么有索引的字段,数据量大了后,增删改会很慢? 一. 了解数据库索引的必…

ADI Blackfin DSP处理器-BF533的开发详解45:图像处理专题-ThresholdData (图像阈值分割处理)(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 代码实现了图像阈值分割处理,代码运行时,会通过文件系统打开工程文件根目下" …/ImageView"路径中的…

Hive中数据类型介绍

文章目录数据库表分区表桶表数据库 当于关系数据库中的命名空间( namespace ),它的作用是将用户和数据库的应用,隔离到不同的数据库或者模式中 Hive中创建数据库等语法 表 Hive 的表在逻辑上由存储的数据和描述表格数据形式的相关元数据组成 元数据&a…

腾讯电竞广泛布局,难逃城市同质化怪圈?

文 | 螳螂观察 作者 | 张左文 2018年的那个夏天,那年的《英雄联盟》S赛,中国战队IG以3:0的绝对领先击败欧洲老牌冠军战队FNC,为LPL赛区拿下首个S赛冠军奖杯。 那是中国电竞史上浓墨重彩的一笔,也是腾讯电竞8年蛰伏后腾飞的开始…

​实验8 IP协议实验分析

注:原实验是在虚拟机中对主机使用ping命令,本文对www.bilibili.com使用ping命令来代替 IP分片 实验内容 wireshak开始捕获分组后,在cmd中输入ping www.bilibili.com -l 3000并执行 打开wireshak,在显示过滤器中输入icmp。得到…