文件上传自动化测试方案

一、概述

【测试地址】: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万个文件

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

公众号:


资源分享

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值