• 文件上传自动化测试方案


    一、概述

    【测试地址】: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页面上传到服务器

      首先是登录脚本,对webdriver看不懂的同学先看我的另外一篇帖子:http://www.cnblogs.com/fightever/p/6867619.html

     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做接下来的测试

      百度网盘有提供第三方开发者平台:https://pan.baidu.com/platform/read;有兴趣的同学可以了解下

    四、扩展及丰富系统

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

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

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

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

  • 相关阅读:
    SQL 数据开发(经典)转贴
    2018学习计划 借鉴
    SQL数据库索引理解与应用【转贴--收藏】
    学生成绩信息表
    网址收录
    导出word文档 通过DocX组件
    Aspose.word
    C#编码规范
    远程连接ORACLE服务
    Request.Form()的使用
  • 原文地址:https://www.cnblogs.com/fightever/p/7622408.html
Copyright © 2020-2023  润新知