功能测试
测试相关用例
开发者社区功能背景
在当今数字化时代,编程已经成为一项核心技能,越来越多的人开始学习编程,以适应快速变化的科技 环境。基于这一需求,我设计开发了一个类似博客的论坛系统,专注于方便程序员与学习编程者之间的交流和 学习,旨在创建一个开放、友好且充满活力的社区。
测试用例思维导图
测试页面
以下是要测试的页面:
页面排版渲染与需求一致,同时按钮能够进行正确点击
登录页面
注册页面
主界面
用户个人信息
帖子详情
短信页面
测试用例
设置了部分基础的测试用例,尽可能的全覆盖,这里只展示部分用例(篇幅有限)
登录界面
正确输入用户名和密码
输入密码为空
注册页面
正确注册
用户名为空
用户已存在
密码为空
个人页面
邮箱修改失败
电话号码失败
密码修改失败
帖子页面
创建帖子失败
回复帖子失败
站内信页面
回复失败
代码编写
基础配置
先进行驱动配置以及截图配置
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。
结论:
系统整体性能良好,所有请求的响应时间都在可接受范围内,且没有错误发生。
“获取帖子内容”和“获取用户帖子”是系统中响应时间较长的操作,可能需要进一步优化。
网络吞吐量和数据传输量在合理范围内,没有明显的瓶颈。