一、项目介绍
1.本书店系统采用前后端分离技术,通过封装JDBC代码实现基础数据库操作,设计前后端交互接口,编写前后端代码。使用mysql存储用户编号,用户名,用户密码,用户手机号,用户地址,书籍分类,书名,书籍编号,图书价格,发布时间,作者,出版社,书籍简介等。
2.书店系统分为七个大模块:分别是书店首页,书店简介、精品推荐,最新出版,优惠促销,用户登录,用户注册。采用的是http协议,涉及到get、post等方法,请求头类型为Content-Type: text/html;charset=UTF-8。
3.书店系统是一个线上图书售卖系统,操作步骤一般是先注册用户,再登录书店系统,登陆完毕后查看书店简介、书店首页,随后可查看精品推荐、最新出版、优惠促销等模块并在其中将中意的图书加入购物车,最后填写姓名、地址、电话等信息再提交订单。
二、测试目的和工具
2.1测试目的
本测试报告为书店系统项目的测试报告,目的在于总结测试阶段以及分析测试结果,描述系统是否符合需求。预期参考人员包括用户、测试人员、开发人员、项目管理者、其他质量管理人员。本次测试的目的在于确保系统功能测试、接口测试和自动化测试正常无误,满足系统需要。
2.2测试工具
本次测试过程中用到的工具有fiddler、postman、开发者工具、JMeter等,其中fiddler用于抓包,详细的对HTTP 请求进行分析,Postman用于模拟客户端向服务器发送请求,开发者工具用于查找页面元素及查找bug,JMeter用于接口测试及性能测试。
三、测试
3.1功能测试
3.1.1用Xmind画出思维导图
3.1.2设计测试用例
经过手动测试输入测试用例后发现,以上测试用例均通过。(由于功能测试用例过多,此处只展示了部分)
3.2接口测试
3.2.1使用postman进行接口测试
书店首页
用户注册
用户登录
书店简介
精品推荐
最新出版
优惠促销
3.2.2使用JMeter接口测试
(和postman接口测试差不多,都是断言判断响应状态码和所包含的字符串)
书店首页接口
书店简介接口
由于接口过多,其他的接口就不一一展示了,均正常通过。
3.3自动化测试
3.3.1自动化测试预览
20240813_163353
3.3.2测试环境
自动化测试环境
计算机型号:HP Pavilion Aero Laptop 13-be0xxx
操作系统:Windows10家庭版
数据库:MySQL5.7
测试工具:selenium、JUnit 5.9.1
浏览器:chrome
3.3.3自动化测试代码
首先打开书店首页,注册账号,再登录账号
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.openqa.selenium.*;
import static java.lang.Thread.sleep;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class Tests extends InitAndEndBrowser{
@Order(1)//1.打开书店首页 2.注册账号 3.登录账号
@ParameterizedTest
@CsvSource({"'http://127.0.0.1:9000/book/index/index.action','http://127.0.0.1:9000/book/index/register.action','http://127.0.0.1:9000/book/index/login.action','112233','小颜','123456'"})
void RegisterAndLogin(String url_index,String url_register,String url_login,String password,String username,String tel) throws InterruptedException {
//打开书店首页
webDriver.get(url_index);
sleep(1000);
//点击用户注册,断言判断,输入用户名,密码,电话,点击注册
webDriver.findElement(By.cssSelector("#menu > ul > li:nth-child(7) > a")).click();
sleep(1000);
String url1=webDriver.getCurrentUrl();
Assertions.assertEquals(url_register,url1);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div > form > div:nth-child(1) > input")).sendKeys(username);
sleep(1000);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div > form > div:nth-child(2) > input")).sendKeys(password);
sleep(1000);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div > form > div:nth-child(3) > input")).sendKeys(tel);
sleep(1000);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div > form > div:nth-child(4) > input")).click();
sleep(1000);
//点击用户登录,输入用户名和密码,点击登录
webDriver.findElement(By.cssSelector("#menu > ul > li:nth-child(6) > a")).click();
sleep(1000);
String url2=webDriver.getCurrentUrl();
Assertions.assertEquals(url_login,url2);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div > form > div:nth-child(1) > input")).sendKeys(username);
sleep(1000);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div > form > div:nth-child(2) > input")).sendKeys(password);
sleep(1000);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div > form > div:nth-child(4) > input")).click();
sleep(1000);
String url3=webDriver.getCurrentUrl();
Assertions.assertEquals(url_index,url3);
sleep(1000);
}
点击书店简介,再点击经典著作查看
@Test
@Order(2)//4.点击书店简介,点击经典著作
void IntroduceAndClassic() throws InterruptedException {
//点击书店简介,再点击经典著作,查看其中的书籍
webDriver.findElement(By.cssSelector("#menu > ul > li:nth-child(2) > a")).click();
sleep(1000);
String url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/about.action", url);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.right_content > div:nth-child(4) > ul > li:nth-child(1) > a")).click();
sleep(1000);
String url_category = webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/category.action?category=1", url_category);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.new_products > div:nth-child(1) > div > a > img")).click();
sleep(1000);
String url_detail = webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/detail.action?bookid=3", url_detail);
sleep(1000);
}
点击精品推荐,图书详情,选中书籍加入购物车
@Test
@Order(3)// 5.点击精品推荐,图书详情,加入购物车
void DetailAndShoppingCart() throws InterruptedException {
webDriver.findElement(By.cssSelector("#menu > ul > li:nth-child(3) > a")).click();
sleep(1000);
String url_special= webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/special.action",url_special);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div:nth-child(2) > div.prod_det_box > div.box_center > a")).click();
sleep(1000);
String url_detail=webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/detail.action?bookid=36",url_detail);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div.prod_det_box > div.box_center > div:nth-child(4) > a > img")).click();
sleep(1000);
}
点击最新出版,再点击翻页,查看下一页的最新出版的内容
@Test
@Order(4)//6.点击最新出版,点击翻页
void NewPublish() throws InterruptedException {
webDriver.findElement(By.cssSelector("#menu > ul > li:nth-child(4) > a")).click();
sleep(1000);
String new_url= webDriver.getCurrentUrl();
sleep(1000);
Assertions.assertEquals("http://127.0.0.1:9000/book/index/new.action",new_url);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.pagination > a")).click();
sleep(1000);
String pag_url=webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/new.action?page=2",pag_url);
sleep(1000);
}
点击优惠促销,查看详情,选中书籍加入购物车
@Test
@Order(5)//7.点击优惠促销,查看详情,加入购物车
void CheapSales() throws InterruptedException {
webDriver.findElement(By.cssSelector("#menu > ul > li:nth-child(5) > a")).click();
sleep(1000);
String sale_url=webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/sale.action",sale_url);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div:nth-child(2) > div.prod_det_box > div.box_center > a")).click();
sleep(1000);
String detail_url=webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/detail.action?bookid=31",detail_url);
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > div.prod_det_box > div.box_center > div:nth-child(4) > a > img")).click();
sleep(1000);
}
点击查看购物车,修改购物车中的书籍数量,然后再输入姓名、电话、地址,点击提交订单,最后查看订单
@Test
@Order(6)// 8 点击查看购物车,输入姓名电话地址,再查看我的订单
void CheckShoppingCart() throws InterruptedException {
//webDriver.get("http://127.0.0.1:9000/book/index/cart.action");
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.right_content > div.cart > a")).click();
sleep(2000);
String cart_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/cart.action", cart_url);
//点击添加数量
webDriver.findElement(By.cssSelector("#wrap > div.center_content > div.left_content > div.feat_prod_box_details > table > tbody > tr.cart_title > td:nth-child(6) > a:nth-child(1)")).click();
sleep(1000);
webDriver.findElement(By.cssSelector("#form_save_order > table > tbody > tr > td:nth-child(1) > input[type=text]")).sendKeys("小颜");
sleep(500);
webDriver.findElement(By.cssSelector("#form_save_order > table > tbody > tr > td:nth-child(2) > input[type=text]")).sendKeys("123456");
sleep(500);
webDriver.findElement(By.cssSelector("#form_save_order > table > tbody > tr > td:nth-child(3) > input[type=text]")).sendKeys("江西xxxx");
sleep(500);
webDriver.findElement(By.cssSelector("#form_save_order > a")).click();
sleep(1000);
}
在输入框中输入书名,点击查找,至此验证完了所有功能,最后注销账号
@Test
@Order(7)//9.在输入框中输入书名,点击查找,查找完毕,所有的功能均尝试过了,最后注销
void SearchAndLoginOut() throws InterruptedException {
webDriver.findElement(By.cssSelector("#form_search > input[type=text]")).sendKeys("实战Java程序设计");
sleep(1000);
webDriver.findElement(By.cssSelector("#form_search > a")).click();
sleep(1000);
String url=webDriver.getCurrentUrl();
Assertions.assertEquals("http://127.0.0.1:9000/book/index/search.action",url);
webDriver.findElement(By.cssSelector("#menu > ul > li:nth-child(7) > a")).click();
sleep(1000);
}
}
最后的运行结果如下
3.4性能测试
3.4.1弱压力测试
模拟20min内1000个用户访问服务器资源
3.4.2高并发测试
模拟100个用户访问服务器资源,要求平均响应时间在3000ms内,且错误率为0
3.4.3高频率测试
模拟2个用户以20QPS的频率访问服务器资源持续10s,要求平均响应时间在3000ms内,且错误率为0
3.4.4生成图形化报告
(以高频率测试为例)
四、测试结果
经测试,本次过程中没有出现bug,各项测试均合格。
五、总结
本次测试过程较为顺利,功能测试、接口测试、性能测试、自动化测试均满足预期要求,在性能测试方面还有待提升,JMeter的使用需要多了解熟悉,加油,继续学习!
版权归原作者 m0_72776676 所有, 如有侵权,请联系我们删除。