一、概述
【測試地址】: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萬個文件
這樣可以在平台上生成即可,能在一定程度上提升測試效率,有興趣的朋友自己實現或關注我,下期奉上!