一、概述
【测试地址】: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页面上传到服务器
首先是登录脚本
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做接下来的测试
六、扩展及丰富系统
为了方便多人使用,可以用Django做一个测试平台出来,用来准备测试数据或管理测试用例,比如:
1、测试任务中需要20个文件的分享地址
2、需要测试某个操作的性能,需要50万个文件
这样可以在平台上生成即可,能在一定程度上提升测试效率,有兴趣的朋友自己实现或关注我,下期奉上!