IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 图片服务器测试项目 -> 正文阅读

[开发测试]图片服务器测试项目

背景需求
在 github 或者博客中插入图片会无法显示,这令人很苦恼。一般上传的图片直接是二进制数据,比较复杂。但如果我们给定一个 url, 从而能够获得到图片内容,便可以解决此问题。

整体架构
核心就是一个 HTTP 服务器, 提供对图片的增删改查能力.
同时搭配简单的页面辅助完成图片上传/展示.

数据库设计
drop database if exists drawing_bed;
create database drawing_bed character set utf8mb4;
use drawing_bed;

drop table if exists image_table;
create table image_table(image_id int not null primary key auto_increment,
image_name varchar(50),
size bigint,
upload_time varchar(50),
md5 varchar(128),
content_type varchar(50) comment ‘图片类型’,
path varchar(1024) comment ‘图片所在路径’);

服务器 API 设计
新增图片

写一个简单的 html 来上传图片,因为需要上传的是图片,而不是简单地数据,所以不使用浏览器默认的application/x-www-form-urlencoded格式和常见的application/json,而使用multipart/form-data。
我们使用表单上传文件时,必须让 表单的 enctype 等于 multipart/form-data。

文件上传:

设定接口如下.

请求
POST /image
Content-Type: application/x-www-form-urlencoded
------WebKitFormBoundary5muoelvEmAAVUyQB

Content-Disposition: form-data;
name=“uploadImage”; uploadImage=“图标.jpg” Content-Type: image/jpg

…[图片正文]…
响应:
HTTP/1.1 200 OK
{
“ok”: true,
}

查看所有图片元信息

请求:
GET /image
HTTP/1.1 200 OK
[
{
“imageId”: 1,
“imageName”: “1.png”,
“contentType”: “image/png”,
“md5”: “[md5值]”
}
]

删除图片
请求:
DELETE /image?imageId=1

响应:
HTTP/1.1 200 OK
{
“ok”: true
}

查看图片内容
请求:
GET /imageShow?imageId=1

响应:
HTTP/1.1 200 OK
content-type: image/png

[响应 body 中为 图片内容 数据]

前端
前端使用了一点Vue.js的知识

整体流程
第一步:输入index.html,页面进行初始化调用getImages()函数,去请求后端全部图片的信息

第二步:调用后端image路径下的doGet()方法,将相应的结果返回给前端

第三步:上传图片,调用后端image里的doPost()方法,将图片保存在服务器的本地文件中,添加后前端重新调用getImages()函数,显示所有图片

第四步:删除图片,调用后端image路径下的doDelete()方法,删除后前端重新调用getImages()函数,显示所有图片

基于白名单方式的防盗链
通过 HTTP 中的 refer 字段判定是否是指定网站请求图片.
修改 ImageShowServlet.doGet 方法

基于 MD5 实现相同内容图片只存一份
使用的是DigestUtils.md5Hex(inputStream)这个函数
整体思路

先获取到上传文件的输入流(二进制数据)
再根据输入流计算mid字符串(不同的数据mid不同)
在将图片保存到数据库和服务器本地文件之前先判断数据库中是已经 有相同的MD5了,如果有则禁止插入,如果没有才进行下面的代码
然后将图片保存到服务器本地(使用MD5 + 相对路径)
最后将图片保存到数据库当中

基于Filter的过滤器

LoginFilter有三个方法,我们只需要重写doFilter()即可

琐碎的知识点
保证当照片名称相同,但内容不同时,在服务器保存的文件名也是唯一的 而不能用前端传来的name(所以使用了路径+MD5的方式)

保存在数据库中的路径建议写成第二种要是在本地将文件名移动或者改名了要是在本地将文件名移动或者改名了,直接修改后端代码的IMAGE_PATH

不过在取图片的时候要补全路径

将文件写到服务器本地时,需要先从part中获取输入流,在直接用函数part.write将文件写入到服务器本地

要想取图片的话,并显示到网页上。先从服务端本地取得输入流,在将输出流输出到resp里(servlet的相应可以是任意格式的(html、文件)) 可能一次没读满(所以int len = fileInputStream.read(bytes) != -1)

结束完一定要关闭io流,防止被占用而在服务端本地删不掉

删除数据库当中的文件后,需要删除服务器的本地文件,本地的文件,在Java中的一个对象,可以操作这个文件

但在删除文件的时候,有可能数据库中删除文件了,但是服务器本地删除文件出错,所以需要将两个删除用事务绑定在一起,保证事务的四大特性

基于防盗链的方式过滤器----Filter,实现Filter接口,重写init,doFilter,destory方法
先获取到,应用上下文的服务路径
先获取到,应用上下文的服务路径,String url = req.getServletPath()
拦截敏感资源,前端的话,重定向到login.html,后端敏感资源的话返回401状态码,并返回相应的json数据,如果访问开放的资源,或者已登录访问敏感资源,则运行执行chain.doFilter()方法

使用Referce防盗链的方式,来防止别人下载,但是可以使用postman来设置header来时模拟登陆,不安全需要使用其他方法

单元测试
这里只对imageDAO层进行了单元测试

public class ImageDAOTest {

    @Test
    public void queryCountByMd5() {
        ImageDAO imageDAO = new ImageDAO();

        int n = imageDAO.queryCountByMd5("123123");
        assertEquals(1,n);

    }

    @Test
    public void insert() {
        ImageDAO imageDAO = new ImageDAO();
        Image image = new Image();
        image.setImageName("");
        image.setSize((long)44189);
        image.setUploadTime("2021-07-01 12:42:10");
        image.setMd5("71f7b259105fc5d3b86826945daff728");
        image.setContentType("image/jpeg");
        image.setPath("/71f7b259105fc5d3b86826945daff728");
        imageDAO.insert(image);
    }

    @Test
    public void queryAllImage() {
        ImageDAO imageDAO = new ImageDAO();
        List<Image> list = new ArrayList<>();
        list = imageDAO.queryAllImage();
        System.out.println(list.size());
        for(Image image : list) {
            System.out.println(image.getImageName());
        }
    }

    @Test
    public void queryOneImage() {
        ImageDAO imageDAO = new ImageDAO();
        Image image = imageDAO.queryOneImage(0);
        System.out.println(image);
    }

    @Test
    public void delete() {
        ImageDAO imageDAO = new ImageDAO();
        int n = imageDAO.delete(24);
        System.out.println(n);
    }
}

集成测试
根据chrome的开发者工具结合后端进行集成测试
在这里插入图片描述

自动化测试
这里采用了selenium和unittest完成了自动化测试。编写简单地上传和删除图片的脚本。

import HTMLTestRunner
from selenium import webdriver
import time
import unittest
import os
import sys
from selenium.common.exceptions import NoAlertPresentException
from ddt import ddt, file_data, unpack, data


@ddt
class testCase1(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.url = "http://localhost:8080/DrawingBed_war/"
        self.driver.get(self.url)
        self.driver.maximize_window()
        time.sleep(3)


    def tearDown(self):
        self.driver.quit()

    #删除图片脚本
    def test_delete(self):
        driver = self.driver
        driver.get(self.url)
        time.sleep(3)
        driver.find_element_by_xpath("//*[@id='container']/div[1]/button").click()
        time.sleep(3)
        driver.switch_to.alert.accept()
        time.sleep(3)
        driver.switch_to.alert.accept()

    #上传图片脚本
    def test_upload(self):
        driver = self.driver
        driver.get(self.url)
        time.sleep(3)
        driver.find_element_by_xpath("//*[@id='blog-collapse']/form/div[1]/input").send_keys(r"C:\Users\PC\Desktop\666.jpeg")
        time.sleep(3)
        driver.find_element_by_xpath("//*[@id='blog-collapse']/form/div[2]/input").click()
        time.sleep(3)

    #查看图片脚本
    def test_select(self):
        driver = self.driver
        driver.get(self.url)
        time.sleep(3)
        driver.find_element_by_xpath("//*[@id='container']/div[1]/img").click()
        time.sleep(3)

    if __name__ == '__main__':
        unittest.main(verbosity=0)

性能测试
采用了Loadrunner的三件套,先用Virtual User Generator 录制脚本,在用Controller模拟虚拟用户对负载压力进行了简单地测试,最后生成Analysis报告进行分析。

在这里插入图片描述
在这里插入图片描述

项目展示
在这里插入图片描述

上传文件

上传成功

在这里插入图片描述

测试用例
图片服务器项目测试
界面
布局
1,图片比较多时,每一行最多五张图片,剩下的折行展示
2,每张图篇的大小一一致,都是200px*200px
3,每一张图片都在一个div框里面,图片左下角有图片名称,删除按钮
4,每一页最上面是logo,标题,接下来右边是图片上传按钮,最后一部分展示的是已经上传到服务器上的图片。
文字的测试(标题,图片名称,按钮名称)
字体的大小
展示的位置
字体是否成功展示
页面上图片文件的名称是否按照设置的大小,字体形式展示
是否和需求一致
图片
图片是否完全展示,即上传的图片和展示的图片内容一致
每一行的图片个数相等,展示风格一致
图片的放大
点击图片本身可以放大图片
点击图片右边的放大按钮,也可以放大图片
可以连续查看放大图片
页面最多展示多少张图片
补充
插入的图片顺序是否是展示的顺序
浏览器大小发生改变,图片是否可以正常展示
图片名称过长时页面展示是否美观,是否影响其他图片
功能测试
1,上传功能
(1)点击选择上传按钮,可以出现电脑中资源选择的页面
(2)点击选择上传按钮,可以出现电脑中资源选择的页面,选中一张图片,点击打开按钮,方框中“未选择任何页面”——>“图片名称”
(3)点击上传按钮
页面会刷新,展示出刚刚上传的图片
存放图片的位置会有新的文件出现
数据库中会插入一条新的数据
(4)上传图片格式为JPG,PNG格式的图片均可以上传成功,其他后缀的文件提示文件格式不正确
(5)不选择任何文件,直接点击上传,应该有提示“请您选择一张图片”
(6)上传整个文件夹,无法上传,只会打开该文件夹
无法上传文件夹
(7)不允许一次性上传多个文件(无法选中多个图片文件
无法进行批量上传图片
(8)上传文件大小大于磁盘空间剩余大小,提示“磁盘空间不足,上传失败!”
(9)磁盘空间剩余0上传文件,提示“磁盘空间不足,上传失败!”
(10)上传除了图片以外的其他类型的图片,上传失败。
(11)上传不存在的图片,会显示不出来
(12)上传一个图片名称和数据库中图片名称相等的
图片名称相同,图片内容相同,提示上传图片重复
图片名称相同,图片内容不同,会上传成功
(13)上传图片的大小有没有限制
2,删除功能
(1)选择某一张图片下面的删除功能,点击,会出现提示删除弹框,点击确定,图片成功从页面上删除。
(2)不能进行批量删除(有删除全部图片按钮)
(3)删除某一张图片之后,页面整体图片为会发生重新排版
(4)删除图片后,在服务器存放图片的路径下,该图片是否消失
(5)删除图片后数据库中存放该图片的数据也相应被删除
(6)删除相同名称的其中一个图片,不会对其它名称相同的图片产生影响。
3,图片展示(加载)
(1)进入主页面,可以看到已经上传到图片服务器上的所有图片(但没有分页功能)
(2)当我们成功上传一个图片的时候,我们页面会重新加载,展示出新上传的图片
(3)图片数量多了可以分页展示吗?
(4)删除图片,页面重新加载排版
(5)删除,上传,进入主页面,页面渲染正常
4,异常情况
(1)数据库服务未启动,上传文件失败
(2)弱网(不同网络的情况下)

2G ,3G,wifi x信号不好
上传
图片加载(展示)
删除
功能稳定(采用自动化测试)
(3)加载(展示)已经损坏的文件,web前端页面不再展示
文件本身损坏
文件的名称被篡改
如何操作:删除,篡改文件名称
(4)上传已经损坏的文件,提示“该文件已经损坏,请停止上传)
(5)在上传的过程中,停止服务,查看是否上传成功
停止服务方案
停止Tomcat
服务器关机
在点击上传按钮之前停止服务,图片上传失败
在点击上传按钮之后停止服务,图片上传成功
上传了以后,断网或者tomact关闭,图片是否能正常显示?
(7)图片上传过程中,重启服务,图片是否可以正常展示?
5,网络测试
弱网
中国移动
中国联通
中国电信
兼容性测试
1,各种浏览器访问该服务(上传,删除,图片的展示)
(1)谷歌
(2)火狐
(3)IE(有点排版问题)
(5)edge
参照所有的功能测试和界面测试测试用例
2.每一个浏览器的不同系统版本
谷歌浏览器市场上主要的版本
3,不同的操作系统
测试方法
自动化测试
易用性测试
1,上传图片时,只要选中图片输入框,即可上传图片。(不一定非的是按钮)
2,页面功能按钮设计直观易用
(1)上传图片的按钮在右上方,符合用户的操作习惯
(2)删除图片的按钮在每一张图片的下方,并且标注为醒目的颜色
安全测试
1,上传带有病毒的文件,会有提示“该文件携带病毒,不允许上传”(没有实现)
2,上传图片超过最大限制值,服务器是否会崩溃
性能测试
1,上传速度
2,删除速度 用户可以接受的范围之内 3/5/8
3,图片超过50张时展示,加载速度
4,多个用户进行上传,删除,加载图片功能时 loadrunner

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-07-15 16:31:53  更:2021-07-15 16:32:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 23:49:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码