功能测试
测试相关用例
开发者社区功能背景
在当今数字化时代,编程已经成为一项核心技能,越来越多的人开始学习编程,以适应快速变化的科技 环境。基于这一需求,我设计开发了一个类似博客的论坛系统,专注于方便程序员与学习编程者之间的交流和 学习,旨在创建一个开放、友好且充满活力的社区。
测试用例思维导图
测试页面
以下是要测试的页面:
页面排版渲染与需求一致,同时按钮能够进行正确点击
登录页面
注册页面
主界面
用户个人信息
帖子详情
短信页面
测试用例
设置了部分基础的测试用例,尽可能的全覆盖,这里只展示部分用例(篇幅有限)
登录界面
-
正确输入用户名和密码
-
输入密码为空
注册页面
-
正确注册
-
用户名为空
-
用户已存在
-
密码为空
个人页面
-
邮箱修改失败
-
电话号码失败
-
密码修改失败
帖子页面
-
创建帖子失败
-
回复帖子失败
站内信页面
回复失败
代码编写
基础配置
先进行驱动配置以及截图配置
public class InitUtils {
public static WebDriver webDriver ;
public static WebDriver createDriver(){
if(webDriver==null){
System.setProperty("webdriver.chrome.driver", "C:\\学习使我快乐\\测试\\demo\\chromedriver-win64\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
webDriver=new ChromeDriver(options);
webDriver.manage().timeouts().implicitlyWait(Duration.ofMillis(5));
}
return webDriver;
}
public InitUtils(String url){
webDriver = createDriver();
webDriver.get(url);
}
//截图
public static void getImage(String str) throws IOException {
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HH_mm_ss_SSS");
String dirTime = sim1.format(System.currentTimeMillis());
String pngTime = sim2.format(System.currentTimeMillis());
//名字
String fileName = "./src/test/image/"+dirTime+"/"+str+"_"+pngTime+".png";
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File(fileName));
}
}
登录页面
public class LoginPageTest extends InitUtils {
public static String url = "http://127.0.0.1:58080/sign-in.html";
public LoginPageTest() {
super(url);
}
//登录成功
public void LoginSuc() throws InterruptedException, IOException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
//先找到输入框,输入正确的用户名和密码
getImage(str);//用方法名进行命名
Thread.sleep(2000);
webDriver.findElement(By.cssSelector("#username")).sendKeys("小明");
webDriver.findElement(By.cssSelector("#password")).sendKeys("123123");
webDriver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
getImage(str);
//webDriver.quit();
}
//退出登录
public void logout() throws IOException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
getImage(str);
webDriver.findElement(By.cssSelector("#index_user_logout")).click();
getImage(str);
//webDriver.quit();
}
//登录失败
public void LoginFail() throws IOException, InterruptedException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
//先找到输入框,输入错误的用户名和密码
getImage(str);
// webDriver.findElement(By.cssSelector("#username")).sendKeys("小明");
// webDriver.findElement(By.cssSelector("#password")).sendKeys("123456111");
webDriver.findElement(By.cssSelector("#username")).sendKeys("");
webDriver.findElement(By.cssSelector("#password")).sendKeys("");
webDriver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
getImage(str);
//webDriver.quit();
}
}
注册页面
public class RegisterTest extends InitUtils {
public static String url = "http://127.0.0.1:58080/sign-up.html";
public RegisterTest() {
super(url);
}
//注册成功
public void registerSuc() throws IOException, InterruptedException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
Thread.sleep(2000);
webDriver.findElement(By.cssSelector("#username")).sendKeys("小喜");
webDriver.findElement(By.cssSelector("#nickname")).sendKeys("happiness");
webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123456");
webDriver.findElement(By.cssSelector("#policy")).click();
Thread.sleep(2000);
getImage(str);
webDriver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
getImage(str);
//webDriver.quit();
}
//注册失败
public void fail() throws IOException, InterruptedException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
//webDriver.findElement(By.cssSelector("#username")).sendKeys("");//用户名为空
//webDriver.findElement(By.cssSelector("#username")).sendKeys("小明");//用户名重复
webDriver.findElement(By.cssSelector("#username")).sendKeys("明明");
webDriver.findElement(By.cssSelector("#nickname")).sendKeys("mingming");
//webDriver.findElement(By.cssSelector("#password")).sendKeys("");//密码为空
//webDriver.findElement(By.cssSelector("#password")).sendKeys("123");//密码小于6位
webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
//webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123");//两次密码输入不一样
webDriver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123456");
//不点击同意信息
//webDriver.findElement(By.cssSelector("#policy")).click();
Thread.sleep(2000);
getImage(str);
webDriver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
getImage(str);
}
}
帖子页面
public class ListPageTest extends InitUtils {
public static String url = "http://127.0.0.1:58080/index.html";
public ListPageTest() {
super(url);
}
//点击帖子
public void listDetail() throws IOException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
//因为是外部的文件 MD输入,所以一般是找不到的
webDriver.findElement(By.cssSelector("#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll")).sendKeys("这是自动化测试内容");
getImage(str);
webDriver.findElement(By.cssSelector("#details_btn_article_reply")).click();
getImage(str);
//webDriver.quit();
}
//点击板块
public void listBoard() throws IOException, InterruptedException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
webDriver.findElement(By.cssSelector("#topBoardList > li:nth-child(5) > a > span.nav-link-title")).click();
Thread.sleep(2000);
getImage(str);
webDriver.findElement(By.cssSelector("#topBoardList > li:nth-child(8) > a > span.nav-link-title")).click();
Thread.sleep(2000);
getImage(str);
webDriver.quit();
}
//发布新帖子
public void createNewText() throws IOException, InterruptedException{
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
getImage(str);
webDriver.findElement(By.cssSelector("#article_post_borad > option:nth-child(6)")).click();//选择板块
webDriver.findElement(By.cssSelector("#article_post_title")).sendKeys("自动化测试");
Thread.sleep(2000);
webDriver.findElement(By.cssSelector("#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap.CodeMirror-empty > div.CodeMirror-scroll")).sendKeys("自动化测试内容");
Thread.sleep(2000);
getImage(str);
webDriver.findElement(By.cssSelector("#article_post_submit")).click();
Thread.sleep(2000);
getImage(str);
webDriver.quit();
}
}
用户页面
public class UserTest extends InitUtils {
//用户有两个页面,所以需要进行跳转
public static String url="http://127.0.0.1:58080/index.html";
public UserTest() {
super(url);
}
//获取当前用户帖子
public void myText() throws InterruptedException, IOException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
Thread.sleep(2000);
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
webDriver.findElement(By.cssSelector("#index_user_profile")).click();
Thread.sleep(2000);
getImage(str);
//点击帖子
webDriver.findElement(By.cssSelector("#profile_article_body > li > div.card.timeline-event-card > div > div > div > div > div.text-truncate > a > strong")).click();
getImage(str);
webDriver.quit();
}
//修改个人信息成功
public void updateInfoSuc() throws IOException, InterruptedException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
Thread.sleep(2000);
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
webDriver.findElement(By.cssSelector("#index_user_settings")).click();
Thread.sleep(2000);
//修改个人信息
//修改之前要先清空
//修改头像
webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > div.row.align-items-center > div:nth-child(2) > a")).sendKeys("C:\\Users\\asus\\Desktop\\证件照压缩版.jpg");
//修改昵称
// webDriver.findElement(By.cssSelector("#setting_input_nickname")).clear();
// webDriver.findElement(By.cssSelector("#setting_input_nickname")).sendKeys("NickName");
// Thread.sleep(2000);
// webDriver.findElement(By.cssSelector("#setting_submit_nickname")).click();
//
// //修改邮箱
// webDriver.findElement(By.cssSelector("#setting_input_email")).clear();
// webDriver.findElement(By.cssSelector("#setting_input_email")).sendKeys("qweqwe123@qq.com");
// Thread.sleep(2000);
// webDriver.findElement(By.cssSelector("#setting_submit_email")).click();
//
// //修改电话号码
// webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).clear();
// webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).sendKeys("15136698733");
// Thread.sleep(2000);
// webDriver.findElement(By.cssSelector("#setting_submit_phoneNum")).click();
//
// //修改密码
// webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("123123");
// webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("1123456");
// webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("123456");
// webDriver.findElement(By.cssSelector("#settings_submit_password")).click();
//
// //修改个人简介
// webDriver.findElement(By.cssSelector("#settings_textarea_remark")).clear();
// webDriver.findElement(By.cssSelector("#settings_textarea_remark")).sendKeys("这是自动化测试");
// Thread.sleep(2000);
// webDriver.findElement(By.cssSelector("#settings_submit_remark")).click();
Thread.sleep(2000);
getImage(str);
Thread.sleep(2000);
webDriver.quit();
}
//修改个人信息失败
public void updateInfoFail()throws IOException, InterruptedException{
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
getImage(str);
Thread.sleep(2000);
webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
webDriver.findElement(By.cssSelector("#index_user_settings")).click();
Thread.sleep(2000);
//修改个人信息
//修改邮箱
// webDriver.findElement(By.cssSelector("#setting_input_email")).clear();
// webDriver.findElement(By.cssSelector("#setting_input_email")).sendKeys("qweqwe123");
// Thread.sleep(2000);
// webDriver.findElement(By.cssSelector("#setting_submit_email")).click();
// getImage(str);
// //修改电话号码
// webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).clear();
// webDriver.findElement(By.cssSelector("#setting_input_phoneNum")).sendKeys("15136698");
// Thread.sleep(2000);
// webDriver.findElement(By.cssSelector("#setting_submit_phoneNum")).click();
// getImage(str);
//修改密码
// webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("123123");
// webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("1123456");//前后密码不一致
// webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("123456");
// webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("");//没有输入旧密码
// webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("123456");
// webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("123456");
webDriver.findElement(By.cssSelector("#settings_input_oldPassword")).sendKeys("123123");
webDriver.findElement(By.cssSelector("#settings_input_newPassword")).sendKeys("123456");
webDriver.findElement(By.cssSelector("#settings_input_passwordRepeat")).sendKeys("");//没有输入确认密码
Thread.sleep(2000);
webDriver.findElement(By.cssSelector("#settings_submit_password")).click();
Thread.sleep(1000);
getImage(str);
webDriver.quit();
}
}
短信页面
public class MessageTest extends InitUtils {
public static String url = "http://127.0.0.1:58080/index.html";
public MessageTest() {
super(url);
}
//打开站内信板块,点击站内信
public void getMessage() throws InterruptedException, IOException {
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
webDriver.findElement(By.cssSelector("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a > svg")).click();
Thread.sleep(2000);
getImage(str);
webDriver.findElement(By.cssSelector("#index_div_message_list > div:nth-child(1) > div > div.col.text-truncate > a > span:nth-child(2)")).click();
Thread.sleep(2000);
getImage(str);
//webDriver.quit();
}
//回复站内信
public void responseMsg()throws InterruptedException, IOException{
String str = Thread.currentThread().getStackTrace()[1].getMethodName();
webDriver.findElement(By.cssSelector("#btn_index_message_reply")).click();
Thread.sleep(2000);
getImage(str);
webDriver.findElement(By.cssSelector("#index_message_reply_receive_content")).sendKeys("用来测试一下");
Thread.sleep(2000);
getImage(str);
webDriver.findElement(By.cssSelector("#btn_index_send_message_reply")).click();
Thread.sleep(2000);
getImage(str);
webDriver.quit();
}
}
性能测试
对部分接口进行了性能测试,设置了600个线程
总结
-
总体性能:
-
总请求数为6000,所有请求均成功执行,错误率为0.00%。
-
平均响应时间为5.20毫秒,最小响应时间为0毫秒,最大响应时间为133毫秒。
-
网络吞吐量为512.30 KiB/s,接收数据量为4521.95 KiB,发送数据量为113.35 KiB。
-
-
各请求类型的性能:
-
发起帖子:平均响应时间为10.06毫秒,最大响应时间为32毫秒。
-
点赞帖子:平均响应时间为5.10毫秒,最大响应时间为13毫秒。
-
登出:平均响应时间为1.06毫秒,是所有请求中最快的。
-
登录:平均响应时间为2.83毫秒,最大响应时间为36毫秒。
-
获取帖子内容:平均响应时间为32.46毫秒,是所有请求中最慢的,最大响应时间为63毫秒。
-
获取帖子详情:平均响应时间为5.24毫秒,最大响应时间为31毫秒。
-
获取板块:平均响应时间为2.47毫秒,最大响应时间为8毫秒。
-
获取用户帖子:平均响应时间为16.25毫秒,最大响应时间为44毫秒。
-
获取用户详情:平均响应时间为1.17毫秒,最大响应时间为6毫秒。
-
获取短信内容和获取站内信列表:平均响应时间均为4.44毫秒,最大响应时间为133毫秒。
-
获取站内信:平均响应时间为3.39毫秒,最大响应时间为14毫秒。
-
-
APDEX指数:
-
所有请求的APDEX指数均为1.000,表示所有请求的响应时间都在用户可接受的范围内(容忍阈值500毫秒,沮丧阈值1.5秒)。
-
-
网络使用情况:
-
接收数据量最大的是“获取帖子内容”和“获取用户帖子”,分别为4450.46 KiB和4290.84 KiB。
-
发送数据量最大的是“发起帖子”和“登录”,分别为21.53 KiB和15.27 KiB。
-
-
结论:
-
系统整体性能良好,所有请求的响应时间都在可接受范围内,且没有错误发生。
-
“获取帖子内容”和“获取用户帖子”是系统中响应时间较长的操作,可能需要进一步优化。
-
网络吞吐量和数据传输量在合理范围内,没有明显的瓶颈。
-