112

基于百度网盘的自动化测试方案设计 - hello-real

 6 years ago
source link: http://www.cnblogs.com/fightever/p/7622408.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

文件上传自动化测试方案

一、概述

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

【测试工具】selenium、requests

【脚本语言】Python

【运行环境】Windows

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

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

646105-20171008115410215-1769826130.png

              图 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”):

646105-20171002205746474-1226110763.png

 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万个文件

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK