【软件测试】博客系统项目测试报告(ssm项目)

文章目录

  • 一. 报告概要
  • 二. 引言
  • 三. 测试环境
  • 四. 测试执行概况及功能测试
    • 1. 手工测试
      • 1.1 编写测试用例
      • 1.2 执行部分测试用例
    • 2. 自动化测试Selenium
      • 2.1 编写测试用例
      • 2.2自动化测试代码
        • 1. 自动化测试工具类
        • 2. 博客登录页测试
        • 3. 博客注册页
        • 4. 博客详情页
        • 5. 博客编辑页
        • 6. 博客列表页
        • 7. 个人列表页
        • 8. 注销
    • 3. 测试结果
    • 4. 测试项目主要特点
  • 五. 其他

一. 报告概要

项目概要:基于ssm项目的博客系统测试
项目相关技术栈SpringBoot, SpringMVC ,MyBatis, MySQL, Redis, HTML, CSS, JavaScript
测试报告的目的:测试自己的博客项目是否符合预期结果.
范围和日期:2023年10月
测试执行的总体情况:主要针对常见功能进行测试例如:博客登录页面,博客列表页面,博客详情页,博客编辑页…

二. 引言

项目背景:巩固所学自动化测试相关知识.
测试目标:基于Servlet实现的博客系统.
测试策略进行说明:按照用户一般登录的逻辑编写测试用例并进行测试.
阐述测试的目的和重点:查缺补漏.

三. 测试环境

硬件:XiaoXinAir 14ALC 2021
软件:Google Chrome
开发工具:IDEA
测试工具:自动化测试工具Selenium
操作系统:Windows 10家庭中文版
浏览器版本:Google Chrome 117.0.5938.134(正式版本)(64 位)

四. 测试执行概况及功能测试

1. 手工测试

博客登录页:
在这里插入图片描述
博客注册页:
在这里插入图片描述
个人博客列表页:
在这里插入图片描述
博客主页:
在这里插入图片描述
博客详情页:
在这里插入图片描述

博客编辑页:
在这里插入图片描述

1.1 编写测试用例

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

1.2 执行部分测试用例

  1. 博客登录页:界面能否正常加载,输入正确或错误的账号、密码是否能得到预期的响应
    (1)界面能否正常加载在这里插入图片描述
    (2)账号正确,密码错误
    预期结果:弹窗提登录失败,用户名或者密码输入错误
    实际结果如下:
    在这里插入图片描述
    (3)账号正确,密码为空
    预期结果:窗口提示请输入密码;
    实际结果如下:
    在这里插入图片描述
    (4)账号正确,密码正确
    预期结果:窗口跳转至个人博客列表页;
    实际结果如下:
    在这里插入图片描述2. 个人博客列表页:检测界面是否符合预期,点击“查看全文”按钮是否能跳转到对应的博客详情页,点击注销是否能退出登录
    (1)界面
    在这里插入图片描述
    (2)点击“查看全文”按钮是否能跳转到对应的博客详情页
    预期结果:进入到对应的博客详情页,且能够正确加载文章内容。
    实际结果如下:
    在这里插入图片描述
    (3)点击注销是否能退出登录
    预期结果:点击注销后退出跳转到博客列表页
    实际结果如下:
    在这里插入图片描述
    (4)点击修改
    预期结果:点击修改后跳转到文章编辑页
    实际结果如下:
    在这里插入图片描述
    (5)点击删除
    预期结果:点击删除后文章被删除
    实际结果如下:
    在这里插入图片描述

2. 自动化测试Selenium

由于随着项目版本的迭代,功能的逐渐增多,各种功能回归测试的需要,单纯的手工测试已经难以满足我们对于测试效率的要求,于是我们引入了自动化测试。它能够将人工从重复机械的测试过程中解放,使得人力资源能够投入到更加关键的测试中。

2.1 编写测试用例

在这里插入图片描述

2.2自动化测试代码

1. 自动化测试工具类

(包含截图测试):AutotestUtils

import org.apache.commons.io.FileUtils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;public class AutotestUtils {static WebDriver webDriver;@BeforeAllstatic void SetUp() {webDriver = new ChromeDriver();}@AfterAllstatic void TearDown() {webDriver.quit();}//获取当前时间将截图按照时间保存public List<String> getTime(){//文件夹以天保存//截图以毫秒时间戳保存SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sim2 = new SimpleDateFormat("yyyyMMdd");String filename=sim1.format(System.currentTimeMillis());String dirname=sim2.format(System.currentTimeMillis());List<String> list = new ArrayList<>();list.add(dirname);list.add(filename);return  list;}//获取屏幕截图,把所有的用例执行的结果保存下来public void getScreenShot(String str) throws IOException {List<String> list=getTime();String filename="E:\\TestClass\\blog_ssm_test\\src\\main\\java\\com\\blogautotest"+list.get(0)+"\\"+str+"_"+list.get(1)+".png";File srcfile=((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);//把屏幕截图生成的文件放到指定的路径FileUtils.copyFile(srcfile,new File(filename));}
}

测试截图如下所示:
在这里插入图片描述

2. 博客登录页测试

LoginCases:

import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;import java.io.IOException;
import java.util.concurrent.TimeUnit;public class BlogCases extends AutotestUtils{static String name;/**** 输入正确的账号,密码登录成功*/@Order(1)@ParameterizedTest@CsvFileSource(resources = "LoginSuccess.csv")void LoginSuccess(String username, String password, String blog_list_url) throws IOException {System.out.println(username + password + blog_list_url);// 打开博客登录页面webDriver.get("http://localhost:8080/login.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入账号zhangsanwebDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 输入密码12345webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击提交按钮webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 跳转到列表页// 获取到当前页面urlString methodName = Thread.currentThread().getStackTrace()[1].getMethodName();getScreenShot(methodName);String cur_url = webDriver.getCurrentUrl();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 如果url=http://localhost:8080/myblog_list.html,测试通过,否则测试不通过Assertions.assertEquals(blog_list_url, cur_url);}
//    账号正确,密码错误@Order(2)@ParameterizedTest@CsvSource({"admin,123","zhangsan,666"})void LoginAbnormal(String username,String password) throws InterruptedException {webDriver.get("http://localhost:8080/login.html");webDriver.findElement(By.cssSelector("#username")).clear();webDriver.findElement(By.cssSelector("#password")).clear();webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.findElement(By.cssSelector("#submit")).click();//处理弹窗Thread.sleep(300);//获取弹窗内容String text=webDriver.switchTo().alert().getText();String except="登陆成功!";webDriver.switchTo().alert().accept();Assertions.assertNotEquals(except,text);}
}
3. 博客注册页
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.By;import java.util.concurrent.TimeUnit;import static java.lang.Thread.sleep;public class RegCases extends AutotestUtils{@Order(1)@ParameterizedTest@CsvSource({"zhangsan,12345,12345,http://localhost:8080/login.html"})void regSuccess(String username,String password,String againpassword,String login_url) throws InterruptedException {//打开主页webDriver.get("http://localhost:8080/login.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//找到注册按钮并点击webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//输入注册的用户名,密码webDriver.findElement(By.cssSelector("#username")).sendKeys(username);webDriver.findElement(By.cssSelector("#password")).sendKeys(password);webDriver.findElement(By.cssSelector("#password2")).sendKeys(againpassword);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//点击提交webDriver.findElement(By.cssSelector("#submit")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);}
}

在这里插入图片描述

4. 博客详情页
    /*** 博客详情页校验* url* 博客标题* 页面title是“博客详情页”*/@Order(4)@ParameterizedTest@MethodSource("Generator")void BlogDetail(String expected_url, String expected_title, String expected_blog_title) {// 打开博客列表页webDriver.get("http://localhost:8080/myblog_list.html");// 找到第一篇博客对应的产看全文按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(4)")).click();// 获取当前页面urlwebDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);String cur_url = webDriver.getCurrentUrl();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 获取当前页面titleString cur_title = webDriver.getTitle();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 获取博客标题String cur_blog_title = webDriver.findElement(By.cssSelector("#title")).getText();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);Assertions.assertEquals(expected_title ,cur_title);Assertions.assertEquals(expected_blog_title, cur_blog_title);if(cur_url.contains(expected_url)) {System.out.println("测试通过");} else {System.out.println(cur_url);System.out.println("测试不通过");}}
5. 博客编辑页
    //博客编辑页@Order(5)@Testvoid EditBlog() throws InterruptedException {// 打开博客列表页webDriver.get("http://localhost:8080/myblog_list.html");// 找到写博客按钮,点击webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 通过Js进行输入((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");sleep(3000);// 点击发布webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();sleep(3000);String cur_text = webDriver.switchTo().alert().getText();String expect_text = "恭喜:添加成功!是否继续添加文章?";Assertions.assertEquals(expect_text,cur_text);}
6. 博客列表页
    /*** 校验已发布博客标题* 校验已发布博客时间* 博客列表页*/@Order(6)@Testvoid BlogInfoChecked() {webDriver.switchTo().alert().dismiss();webDriver.get("http://localhost:8080/blog_list.html");// 获取第一篇博客标题String first_blog_title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getText();// 获取第一篇博客发布时间String first_blog_time = webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/div[2]")).getText();// 校验博客标题是不是自动化测试Assertions.assertEquals("自动化测试", first_blog_title);// 如果时间是2023-5-23年发布的,测试通过if(first_blog_title.contains("2023-10")) {System.out.println("测试通过");} else {System.out.println("当前时间是:" + first_blog_time);System.out.println("测试不通过");}}
7. 个人列表页

删除功能:

    /*** 个人列表页* 删除第一篇博客*/@Order(7)@Testvoid DeleteBlog() throws InterruptedException {// 打开个人博客列表页面webDriver.get("http://localhost:8080/myblog_list.html");// 点击删除按钮webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(6)")).click();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.switchTo().alert().accept();}
8. 注销
    //注销@Order(8)@Testvoid Logout() {webDriver.switchTo().alert().accept();// 打开个人博客列表页面//点击注销webDriver.get("http://localhost:8080/myblog_list.html");webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();webDriver.switchTo().alert().accept();webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 校验url 注销后进入博客列表页String cur_url = webDriver.getCurrentUrl();Assertions.assertEquals("http://localhost:8080/blog_list.html", cur_url);webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);}

3. 测试结果

在这里插入图片描述
测试通过.其中博客详情页被忽略是因为和博客删除页有(业务逻辑)冲突.并不影响测试结果.单独测试详情页是通过的.

4. 测试项目主要特点

  1. 采用自动化测试工具和框架,编写自动化测试脚本,提高测试效率和稳定性。自动化测试可以涵盖UI测试减少人力投入,并且可以进行持续集成和持续交付。
  2. 使用参数化,保持用例的整洁,提高代码的可读性。
  3. 使用隐式等待,提高了自动化运行效率,提高了自动化的稳定性。
  4. 使用屏幕截图,方便问题的溯源以及解决。

五. 其他

除上述描述之外,一份完整的测试报告还包含以下方面等:

  1. 性能测试:如果有进行性能测试,记录测试结果并进行分析,包括测试的负载、响应时间、吞吐量等指标。
  2. 安全测试:如果有进行安全测试,记录测试结果,包括发现的安全漏洞、风险评估等。
  3. 缺陷管理:列出在测试过程中发现的缺陷,包括缺陷编号、描述、严重程度、优先级等,并注明缺陷的状态和解决情况。
  4. 测试总结:对测试的结果进行总结和评估,包括测试覆盖率、质量评估、风险评估等,提供对于软件质量的综合评价。
  5. 建议和改进:根据测试过程和结果,提出测试团队对项目或者流程的建议和改进意见。
  6. 附件:提供测试脚本、日志、截图等相关附件,以便读者进一步了解测试过程和结果。

此处我们不做过多阐述.到公司后熟悉即可.同时,在编写测试报告时,需要注意以下几点:

  1. 报告应该清晰、简洁,并且易于理解和使用。应尽可能避免使用过多技术术语和复杂的语言。
  2. 报告中应该准确记录测试过程和结果,包括测试用例的执行状况、发现的缺陷、测试数据和环境等信息。
  3. 对测试结果进行全面的分析和评估,提供对于软件质量的综合评价。
  4. 对于缺陷管理和解决情况进行详细记录,并定期更新缺陷列表,以便开发人员能够及时修复问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/99893.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【git merge/rebase】详解合并代码、解决冲突

目录 1.概述 2.merge 3.rebase 4.merge和rabase的区别 5.解决冲突 1.概述 在实际开发中&#xff0c;一个项目往往是多个人一起协作的&#xff0c;头天下班前大家把代码交到远端仓库&#xff0c;第二天工作的第一件事情都是从服务器上拉最新的代码&#xff0c;保证代码版本…

12. Java异常及异常处理处理

Java —— 异常及处理 1. 异常2. 异常体系3. 常见Exception4. 异常处理4.1 try finally catch关键字4.2 throws和throw 自定义异常4.3 finally&#xff0c;final&#xff0c;finalize三者的区别 1. 异常 异常&#xff1a;在程序执行过程中发生的意外状况&#xff0c;可能导致程…

【List-Watch】

List-Watch 一、定义二、工作机制三、调度过程 一、定义 Kubernetes 是通过 List-Watch 的机制进行每个组件的协作&#xff0c;保持数据同步的&#xff0c;每个组件之间的设计实现了解耦。 用户是通过 kubectl 根据配置文件&#xff0c;向 APIServer 发送命令&#xff0c;在 …

银河麒麟服务器x86安装ntp客户端,并配置成功可以同步时间

脚本 # 安装ntp客户端 sudo dnf install chrony # 配置 pool 2.centos.pool.ntp.org iburst给这一行加注释 sudo sed -i s/^pool 2.centos.pool.ntp.org iburst/#&/ /etc/chrony.conf # 添加3个阿里云NTP服务器 # echo -e "server ntp1.aliyun.com iburst\nserver nt…

【Solidity】智能合约案例——①食品溯源合约

目录 一、合约源码分析&#xff1a; 二、合约整体流程&#xff1a; 1.部署合约 2.管理角色 3.食品信息管理 4.食品溯源管理 一、合约源码分析&#xff1a; Producer.sol:生产者角色的管理合约&#xff0c;功能为&#xff1a;添加新的生产者地址、移除生产者地址、判断角色地址…

多线程 - 线程池

线程池 相关的背景知识 线程池存在的意义: 使用进程来实现并发编程,效率太低了,任务太重了,为了提高效率,此时就引入了线程,线程也叫做“轻量级进程”,创建线程比创建进程更高效;销毁线程比销毁进程更高效;调度线程比调度进程更高效…此时,使用多线程就可以在很多时候代替进程…

在美国如何申请批准销售儿童玩具?提交哪些相关文件?需要的认证是?

在美国如何申请批准销售儿童玩具&#xff1f;提交哪些相关文件&#xff1f;需要的认证是&#xff1f;ASTM F963-17 ​在美国销售玩具 重要&#xff1a; 如果您要在亚马逊商城销售商品&#xff0c;则必须遵守适用于这些商品和商品信息的所有联邦、州和地方法律以及亚马逊政策。…

iNet Network Scanner for Mac,轻松管理网络

iNet Network Scanner for Mac是一款强大的网络扫描工具&#xff0c;能够帮助你轻松管理和监控网络设备。 无论你是个人用户还是企业管理员&#xff0c;iNet Network Scanner都能为你提供全面而方便的网络管理体验。它可以快速扫描并识别局域网中的所有设备&#xff0c;包括电…

Rocky(centos)安装nginx并设置开机自启

一、安装nginx 1、安装依赖 yum install -y gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、去官网下载最新的稳定版nginx nginx: downloadhttp://nginx.org/en/download.html 3、将下载后的nginx上传至/usr/local下 或者执行 #2023-10-8更新 cd /usr/…

自动求导,计算图示意图及pytorch实现

pytorch实现 x1 torch.tensor(3.0, requires_gradTrue) y1 torch.tensor(2.0, requires_gradTrue) a x1 ** 2 b 3 * a c b * y1 c.backward() print(x1.grad) print(y1.grad) print(x1.grad 6 * x1 * y1) print(y1.grad 3 * (x1 ** 2))输出为&#xff1a; tensor(36.) …

MyBatis(JavaEE进阶系列4)

目录 前言&#xff1a; 1.MyBatis是什么 2.为什么要学习MyBatis框架 3.MyBatis框架的搭建 3.1添加MyBatis框架 3.2设置MyBatis配置 4.根据MyBatis写法完成数据库的操作 5.MyBatis里面的增删改查操作 5.1插入语句 5.2修改语句 5.3delete语句 5.4查询语句 5.5like查…

Pytorch笔记之回归

文章目录 前言一、导入库二、数据处理三、构建模型四、迭代训练五、结果预测总结 前言 以线性回归为例&#xff0c;记录Pytorch的基本使用方法。 一、导入库 import numpy as np import matplotlib.pyplot as plt import torch from torch.autograd import Variable # 定义求…

web基础及http协议

web基础 全称 world wide web 全球广域网也就是万维网 web1.0 只能看 web2.0 页面交互&#xff1a;静态页面和动态页面 静态页面url&#xff1a;文本文件&#xff0c;可以修改&#xff0c;一般以html .htm保存的文本文件。网站的基础。静态页面和后台数据库没有任何交互不包含…

如何下载IEEE Journal/Conference/Magazine的LaTeX/Word模板

当你准备撰写一篇学术论文或会议论文时&#xff0c;使用IEEE&#xff08;电气和电子工程师协会&#xff09;的LaTeX或Word模板是一种非常有效的方式&#xff0c;它可以帮助你确保你的文稿符合IEEE出版的要求。无论你是一名研究生生或一名资深学者&#xff0c;本教程将向你介绍如…

一站式工单系统哪家好?一站式工单系统有什么特点?

伴随着高新科技的不断发展和行业竞争的加重&#xff0c;对于一站式工单系统这一类的公司服务系统软件有着越来越多的流程规定和可靠性的要求。一个比较完善的智能化一站式工单系统包含众多的流程&#xff0c;并适用更广泛性的企业信息化&#xff0c;接下来我们将一起看看一站式…

数字孪生与GIS数据为何高度互补?二者融合后能达到什么样的效果?

山海鲸可视化作为一款数字孪生软件&#xff0c;在GIS的融合方面处于业内领先水平&#xff0c;那么为什么一款数字孪生软件要花费巨大的精力&#xff0c;去实现GIS的融合&#xff0c;实现后又能达到什么样的效果呢&#xff1f;下面就让我们来一探究竟。 一、为什么数字孪生需要…

iview表格 异步修改列数据卡顿 滚动条失效

使用表格row-key属性 将row-key属性设置为true <Table ref"table" border :row-key"true" :columns"tableColumns" :loading"loading":data"tableData"></Table>

【K8S系列】深入解析k8s 网络插件—kube-router

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记论点蓝色&#xff1a;用来标记论点 在现代容器化应用程序的世界中…

Tomcat隔离web原理和热加载热部署

Tomcat 如何打破双亲委派机制 Tomcat 的自定义类加载器 WebAppClassLoader 打破了双亲委派机制&#xff0c;它首先自己尝试去加载某个类&#xff0c;如果找不到再代理给父类加载器&#xff0c;其目的是优先加载 Web 应用自己定义的类。具体实现就是重写 ClassLoader 的两个方法…

SpringBoot全局异常处理 | Java

⭐简单说两句⭐ 作者&#xff1a;后端小知识 CSDN个人主页&#xff1a;后端小知识 &#x1f50e;GZH&#xff1a;后端小知识 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 文章目录 ✨SpringBoot全局异常处理 | Java&#x1f3a8;什么是全局…