功能測試
測試相關用例
開發者社區功能背景
在當今數字化時代,編程已經成為一項核心技能,越來越多的人開始學習編程,以適應快速變化的科技 環境。基于這一需求,我設計開發了一個類似博客的論壇系統,專注于方便程序員與學習編程者之間的交流和 學習,旨在創建一個開放、友好且充滿活力的社區。
測試用例思維導圖
測試頁面
以下是要測試的頁面:
頁面排版渲染與需求一致,同時按鈕能夠進行正確點擊
登錄頁面
注冊頁面
主界面
用戶個人信息
帖子詳情
短信頁面
測試用例
設置了部分基礎的測試用例,盡可能的全覆蓋,這里只展示部分用例(篇幅有限)
登錄界面
-
正確輸入用戶名和密碼
-
輸入密碼為空
注冊頁面
-
正確注冊
-
用戶名為空
-
用戶已存在
-
密碼為空
個人頁面
-
郵箱修改失敗
-
電話號碼失敗
-
密碼修改失敗
帖子頁面
-
創建帖子失敗
-
回復帖子失敗
站內信頁面
回復失敗
代碼編寫
基礎配置
先進行驅動配置以及截圖配置
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。
-
-
結論:
-
系統整體性能良好,所有請求的響應時間都在可接受范圍內,且沒有錯誤發生。
-
“獲取帖子內容”和“獲取用戶帖子”是系統中響應時間較長的操作,可能需要進一步優化。
-
網絡吞吐量和數據傳輸量在合理范圍內,沒有明顯的瓶頸。
-