文件上傳自動化測試方案


一、概述

【測試地址】: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萬個文件

  這樣可以在平台上生成即可,能在一定程度上提升測試效率,有興趣的朋友自己實現或關注我,下期奉上!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM