项目背景:
公司提出需求,要求开发部分开发一个文件服务器来统一管理公司的文档,要求有上传、下载、查 看、删除功能。
目标:完成所有文件类型的上传、下载、查看、删除。
项目需求分析:
功能需求:
1.文件类型:支持所有的文件
2.上传文件个数:每次只能上传一个文件,最多上传的文件个数根据磁盘大小而定
3.上传文件大小:最大不超过10M
4.性能需求: 上传和下载时间不超过10分钟
5.接口测试:上传、下载、查看
6.安全需求:带有病毒感染的文件不能上传、下载、查看
7.易用性需求 操作简单、方便
8.界面需求: 布局、排版美观
兼容性需求:
1.浏览器:IE,Firefox,Chrome
2.操作系统:Windows7,8,10
界面效果图:
测试用例设计
自动测试用例设计(测试用例太多,只举几个栗子):
用例编号 | 测试类别 | 功能 | 标题 | 操作平台 | 测试方式 | 操作步骤 | 输入数据 | 预期结果 |
---|---|---|---|---|---|---|---|---|
001 | 功能 | 上传 | 空文件上传 | … | ||||
002 | 功能 | 上传 | 单个文件上传,文件大小5M | … | ||||
003 | 功能 | 下载 | 空文件下载 | … | ||||
004 | 功能 | 查看 | 空文件查看 | … | ||||
005 | 功能 | 删除 | 空文件删除 | … | ||||
006 | 性能 | 上传 | 上传0M大小文件耗时 | … | ||||
007 | 性能 | 下载 | 下载5M文件 | … | ||||
008 | 性能 | 下载 | 下载10M文件 | … | ||||
009 | 接口 | 上传 | 未传参数文件名 | … | ||||
010 | 接口 | 查看 | 传入id | … | ||||
011 | 安全 | 下载 | 登录后可以下载 | … | ||||
012 | 兼容性 | 功能 | IE, Chrome,FireFox | … | ||||
013 | 易用性 | 功能 | 操作简单,方便 | … | ||||
014 | 界面 | UI | 界面布局,文字大小,颜色搭配 | … |
实际使用测试用例:
序号 | 功能点 | 完成时间 | 负责人 |
---|---|---|---|
1 | 上传 | 2019-07-25 | 测试人员 |
2 | 下载 | 2019-07-25 | 测试人员 |
3 | 加载 | 2019-07-25 | 测试人员 |
4 | 删除 | 2019-07-25 | 测试人员 |
自动化脚本开发:
单文件实现脚本:
__author__ = 'sunraylily'
# -*- coding: utf-8 -*-
from selenium import webdriver
import unittest,os
class Testupload(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.base_url = "http://localhost:8080/"
self.verificationErrors = []
self.accept_next_alert = True
#上传文件
def test1_upload(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_name("filename").clear()
driver.find_element_by_name("filename").send_keys(u"C:\\Users\\Rachel\\Pictures\\Saved Pictures\\timgU0QAKK1A.jpg")
driver.find_element_by_css_selector("input[type=\"submit\"]").click()
driver.implicitly_wait(30)
if driver.find_element_by_link_text(u"timgU0QAKK1A.jpg").is_displayed():
print "上传成功"
else:
print "上传失败"
driver.quit()
#下载文件
def test2_down(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_link_text(u"timgU0QAKK1A.jpg").click()
driver.implicitly_wait(30)
if os.path.exists(u"C:\\Users\Rachel\AppData\Local\Temp\\timgU0QAKK1A.jpg"):
print "下载成功"
else:
print "下载失败"
driver.quit()
#查看文件
def test3_view(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_xpath(u"(//a[contains(text(),'查看')])[3]").click()
driver.implicitly_wait(30)
handles = driver.window_handles #获取当前打开的所有窗口的句柄
print(handles)
driver.switch_to.window(handles[1]) #切换到第二个窗口的句柄
print(driver.current_window_handle)
print(driver.title)
print(driver.current_url)
driver.quit()
#删除上传文件
def test4_delete(self):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_xpath(u"(//a[contains(text(),'删除')])[2]").click()
driver.implicitly_wait(30)
print "删除成功"
driver.quit()
def tearDown(self):
self.driver.quit()
self.assertEqual([], self.verificationErrors)
if __name__ == "__main__":
unittest.main()
输出测试报告:
# -*- coding: utf-8 -*-
import unittest,csv
import os,sys
import time
import HTMLTestRunner
#手工添加案例到套件,
def createsuite():
discover=unittest.defaultTestLoader.discover('../FunctionScritp',pattern='test*.py',top_level_dir=None)
print discover
return discover
if __name__=="__main__":
curpath=sys.path[0]
#取当前时间
now=time.strftime("%Y-%m-%d-%H %M %S",time.localtime(time.time()))
if not os.path.exists(curpath+'/Opration'):
os.makedirs(curpath+'/Opration')
filename=curpath+'/Opration/'+now+'Opration.html'
#输出html报告
with open(filename,'wb') as fp:
runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'测试报告',description=u'用例执行情况',verbosity=2)
suite=createsuite()
runner.run(suite)
测试报告: