博客目錄html
在正式發佈前,爲檢驗後端各接口功能的正確性,後端服務器對壓力的耐受程度,以及前端各頁面、功能的運行狀況,咱們對咱們的服務器及小程序進行了多種測試。除去隨開發進行的基本正確性測試外,針對上述三種情形,咱們分別進行了單元測試、壓力測試以及功能測試。前端
單元測試的主要目的,是測試後端全部接口的工做是否正常。其內容主要包含兩方面:
- 接口在正常狀況下是否能發揮預期功能
- 接口在異常狀況下是否能返回預期錯誤信息python
Beta階段的全部單元測試與Alpha階段相同,在pycharm下使用Coverage工具進行測試。通過修改後已經經過了全部單元測試。所進行的一些測試以下圖:
ios
爲保證測試的全面性,咱們針對每個接口都設計了相應的單元測試。單元測試的總數高達140個。
在運行完全部單元測試後,單元測試的代碼覆蓋率高達96%,切實確保了全部接口的正確性。
算法
單元測試中發現的bug以下:數據庫
接口 | 現象 | 緣由 | 是否解決 |
---|---|---|---|
p/<int:post_id>/modify/ |
發送正確信息時會返回錯誤3,但發送攜帶錯誤label的信息時會正常返回 | 對label的合法性判斷條件反了 | 是 |
f/processing/<str:label>/ |
發送錯誤label是仍能正常返回 | 檢驗label時調用相應檢驗函數時未將label分隔成數組傳入 | 是 |
my/<int:user_id>/apply/ |
不管發送什麼信息都會報錯 | 錯誤的調用了推薦算法 | 是 |
f/processing/ |
沒法獲取發佈信息 | 經過後臺管理界面增長數據時沒有指定發帖人,致使獲取信息時崩潰 | 是 |
f/processing/ |
history參數爲空時報錯 | 對空字符串調用split方法並不會獲得一個空列表 | 是 |
login/wechat/ |
微信登陸接口沒法獲取openid | 騰訊提供的auth.code2Session接口返回值與文檔不一致 | 是 |
login/wechat/ |
改用MySQL數據庫後含有特殊字符的微信暱稱沒法登錄 | MySQL數據庫的默認編碼問題,須要將編碼改成utf8mb4 | 是 |
p/<int:post_id>/delete/ |
刪除post後與該post相關的apply並未刪除 | 相關的apply須要手動刪除或者將對應的外鍵參數on_delete設置爲models.CASCADE | 是 |
c/post/ |
post_title字段超過20個字符時沒法建立post | 先後端約定不一致,後端限制最大長度爲20,而前端爲50 | 是 |
服務器端設置的默認圖片路徑沒法訪問 | 在Windows系統上能夠將默認圖片路徑設爲絕對路徑,但在ubuntu系統上彷佛只能用相路徑 | 是 | |
微信機器人沒法正常登錄 | 沒有將以前運行生成的wxpy.pkl刪除 | 是 |
能夠看見,大部分bug產生的緣由仍是參數的合法性問題。上述問題現已所有解決。json
對服務器來講,壓力負載能力是評價其表現的重要指標之一。所以,咱們針對服務器進行了壓力測試。
壓力測試使用基於Python的壓力測試工具locust進行。壓力測試的一些基本參數以下:ubuntu
進行壓力測試後的結果以下:
能夠看到,對於上述參數下的壓力測試,總請求數量爲5412個的狀況下,失敗請求數爲3,表現良好。
平均響應時間爲1.539s,做爲高峯期的響應時間,仍能夠接受。
吞吐率爲17.4req/s。
在壓力測試結束時,針對雲服務器端的監控以下:
在途中能夠看到,在壓力測試期間,CPU的佔用率峯值約在62%左右,仍有必定資源剩餘。可是,在監控圖的第一行外網出帶寬
中能夠看到,壓力測試期間的對外帶寬達到了最大限制1Mbps,所以,能夠發現性能的瓶頸主要在於雲服務器的帶寬限制(1Mbps)。小程序
對於前端的功能測試,仍採用與Alpha階段相同的方式,即在不一樣的機型、不一樣的操做系統下,對每一個頁面的每一個功能進行一一測試,以檢測其功能的正確性。前端功能測試的測試矩陣以下:後端
測試矩陣 | 功能測試 | 頁面顯示 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
測試機型 | 測試環境 | 登陸 | 搜索 | 查看分類標籤 | 首頁智能推薦 | 修改我的信息 | 修改簡歷 | 查看招募 | 發佈招募 | 查看個人發佈 | 採納申請 | 申請招募 | 查看個人申請 | 頁面排版 |
Mi5 | Android 8.0 wifi | 無問題 | 無問題 | 無問題 | 無推薦效果 | 後端問題致使沒法修改 | 無問題 | 無問題 | 無問題 | 無問題 | 沒法查看申請者 | 無問題 | 查看個人簡歷沒法顯示 | 無問題 |
Mi6 | Android 9.0 wifi | 無問題 | 無問題 | 無問題 | 無推薦效果 | 後端問題致使沒法修改 | 無問題 | 無問題 | 無問題 | 無問題 | 沒法查看申請者 | 無問題 | 查看個人簡歷沒法顯示 | 無問題 |
Mi9 | Android 9.0 wifi | 無問題 | 無問題 | 無問題 | 無推薦效果 | 後端問題致使沒法修改 | 無問題 | 無問題 | 無問題 | 無問題 | 沒法查看申請者 | 無問題 | 查看個人簡歷沒法顯示 | 無問題 |
iphonoe xr | ios12 | 第一次須要退出重進 | 無問題 | 無問題 | 無推薦效果 | 後端問題致使沒法修改 | 無問題 | 無問題 | 無問題 | 無問題 | 沒法查看申請者 | 無問題 | 查看個人簡歷沒法顯示 | 無問題 |
iphonoe 8 | ios12 | 第一次須要退出重進 | 無問題 | 無問題 | 無推薦效果 | 後端問題致使沒法修改 | 無問題 | 無問題 | 無問題 | 標籤選擇時偶然產生失去焦點問題 | 無問題 | 無問題 | 查看個人簡歷沒法顯示 | 無問題 |
華爲榮耀 | 安卓 8.0 | 第一次須要退出重進 | 無問題 | 無問題 | 無推薦效果 | 後端問題致使沒法修改 | 無問題 | 無問題 | 無問題 | 標籤選擇時偶然產生失去焦點問題 | 無問題 | 無問題 | 無問題 | 無問題 |
BUG | 現象 | 緣由 | 是否解決 |
---|---|---|---|
標籤頁下拉菜單顯示異常 | 輸入剛一結束,還未選擇標籤,下拉菜單頁消失 | 控件綁定函數的觸發事件有問題 | 是 |
當用戶沒有標籤時,修改發佈頁面崩潰 | 頁面沒法正常顯示信息 | 當沒有標籤的時候,標籤以前無分隔符,調用分割函數時報錯 | 是 |
我的中心個人簡歷頁面退出登錄有誤 | 退出到了一個不用的界面 | 上個版本遺漏的bug,現已經解決 | 是 |
待審覈簡歷數有誤 | 一直顯示同一個數字 | 前端設計頁面時設置的默認變量未更換 | 是 |
申請招募時,對簡歷合法性檢測出問題 | 輸入合法的簡歷信息可是沒法提交申請 | 判斷簡歷信息是否合法的信息出了問題 | 是 |
獲取頭像後沒法當即登陸 | 點擊獲取頭像之後無反應而後沒法登錄 | 獲取用戶信息與登錄功能交叉 | 否 |
無推薦效果 | 主頁頁面不會隨用戶點擊而變 | 推薦算法不完善,帖子數目太少 | 否 |
後端問題,沒法修改我的信息 | 後端檢查格式問題 | 後端檢查錯誤 | 否 |
沒法查看申請者 | 點擊查看申請者無反饋結果 | 緣由未知 | 否 |
查看個人簡歷沒法顯示 | IOS上沒法顯示簡歷 | 安卓和ios 數據不互通 | 否 |
主頁有時候加載不出來 | 加載提示結束時未顯示主頁面 | 緣由未知 | 否 |
沒法查看申請者簡歷 | 點擊申請者沒法顯示簡歷 | 緣由未知 | 否 |
對於前端的迴歸測試,咱們在測試前端功能時,對全部新舊頁面都進行了一一測試,確保了原有功能的正確性(詳情見測試矩陣)。
對於後端的迴歸測試,咱們隨着開發,更新了上一階段的單元測試,對於有改動的接口,修改了其相應的單元測試使其知足最新功能。下面給出一個原有接口的單元測試用例代碼:
class GetApplyTest(TestCase): def setUp(self): # 測試所用數據庫爲空,需手動插入數據 user = User.objects.create(account='bsh_test', password=gen_md5('admin_admin', SECRET_KEY)) # 數據庫中插入用戶 self.post2 = Post.objects.create(title="test_apply", post_detail="test_test2", request_num=4, accept_num=1, deadline="2019-5-20", if_end=False, poster=user) resume = Resume.objects.create(name='asd', sex='s', age=10, degree='dasd', phone='1234', email='1@2', city='32', edu_exp='bei', awards='das', english_skill='dasd', project_exp='dasda', self_review='dasd') self.apply_exp = Apply.objects.create(resume=resume, post=self.post2, applicant=user) self.token = create_token(user.id).decode() self.url = '/apply/' + str(self.apply_exp.id) + '/' self.post_ID = self.post2.id def test_get_apply(self): ''' 成功獲取 ''' response = self.client.get(self.url, HTTP_AUTHORIZATION=self.token) ret_data = response.json() self.assertTrue(ret_data['ret']) # self.assertEqual(ret_data['error_code'], 3) def test_get_apply_err1(self): ''' 不是 get 方法 ''' response = self.client.post(self.url, HTTP_AUTHORIZATION=self.token, content_type='application/json') ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 1) def test_get_apply_err2(self): ''' 用戶登錄已過時 ''' response = self.client.get(self.url, HTTP_AUTHORIZATION='') ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 5) def test_get_apply_err3(self): ''' 該申請不存在 ''' uuu = '/apply/666/' response = self.client.get(uuu, HTTP_AUTHORIZATION=self.token) ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 2) def test_get_apply_err4(self): ''' 當前登錄的用戶 既不是申請者 也不是發佈者 ''' user_a = User.objects.create(account='bsh_adsad', password=gen_md5('admin_admin', SECRET_KEY)) tt = create_token(user_a.id).decode() response = self.client.get(self.url, HTTP_AUTHORIZATION=tt) ret_data = response.json() self.assertFalse(ret_data['ret']) self.assertEqual(ret_data['error_code'], 3)
該單元測試類GetApplyTest
對應的接口設計規格以下:
setUp
方法:setUp
方法用於填充用於測試的數據。測試所用數據庫與實際後臺服務器數據庫是分離的,每次運行測試時,測試數據庫都爲空,所以須要先向測試數據庫中填充測試所須要的數據。此方法中還用於初始化一些其餘測試經常使用的變量,如用戶token
,訪問的後端url
等。test_get_apply
方法:
test_get_apply
方法用於測試正常獲取到該申請的狀況。在這種狀況下,返回值ret_data
的值應爲true
。
test_get_apply_error1
方法:
test_get_apply_error1
方法測試的是error_code
爲1,即前端訪問該url時,請求類型不是get
的狀況。判斷返回的ret_data
是否爲false
,返回的錯誤代碼error_code
是否爲1,做爲測試的正確性判斷。
test_get_apply_error2
方法:
test_get_apply_error2
方法測試的是error_code
爲5,即前端訪問該url時,用戶登陸已過時,未能獲取到token
的狀況。一樣判斷返回的ret_data
是否爲false
,返回的錯誤代碼error_code
是否爲5。
test_get_apply_error3
方法:
test_get_apply_error3
方法測試的是error_code
爲2,即前端訪問該url時,給出的apply_id
不存在的狀況。這種狀況返回的錯誤代碼error_code
應爲2。
test_get_apply_error4
方法:
test_get_apply_error4
方法測試的是error_code
爲3,即前端訪問該url時,當前用戶既不是該申請的發佈者或接受者,即用戶沒有權限查看該申請的狀況。返回錯誤代碼error_code
應爲3。
Beta版本主要進行的工做是頁面的從新設計以及實現,所以,出口條件設定以下: