前言
軟體測驗流程:需求分析—>測驗計劃—>測驗設計—>測驗執行—>測驗報告
一、需求分析
“不愛聽書”是一個為用戶提供創作音樂和收聽音頻的平臺,對于該專案的需求分析,提煉出相關測驗點,
基本功能需求
用戶可以進行注冊、登錄與退出賬戶——成功注冊與登錄與退出
注冊登錄之后,用戶可以進行音頻的錄制、上傳、以及查看音頻串列——音頻能成功上傳、錄制、展示
用戶可以創建屬于自己的專輯、關聯自己喜歡的音頻以及展示專輯串列——成功創建專輯,成功系結音頻,展示音頻串列
易用性需求:符合常見標準與規范,用戶操作更方便舒適
界面需求:界面控制元件正常使用,布局、排版合理
性能需求:多個用戶同時登陸時運行速度正常、記憶體正常、系統穩定;
安全需求:用戶密碼是否加密顯示,保障用戶的私人資訊不被竊取
兼容性需求:各種瀏覽器都能正常訪問;用戶資料在后臺存盤時互不影響
二、測驗計劃
| 測驗目的 | 測驗系統功能實作是否正常,是否符合用戶需求和軟體需求 |
| 測驗前提 | 系統正常運行 |
| 測驗范圍 | 整個系統 |
| 測驗方式 | 手工測驗+自動化測驗(撰寫自動化腳本 selenium) |
| 測驗環境 | Windows10系統、chrome瀏覽器、Firefox瀏覽器 |
| 測驗模塊 | 用戶模塊(注冊、登錄、退出) |
| 音頻模塊(上傳、音頻串列、在線錄制) | |
| 專輯模塊(創建專輯;專輯串列) |
三、測驗用例的設計

四、測驗執行
以專輯串列頁為例
1.手工測驗

2.單元測驗(Junit框架)
單元測驗就是針對最小的功能單元撰寫測驗代碼,Java 程式最小的功能單元是方法,因此,單元測驗就是針對Java方法的測驗,進而檢查方法的正確性,這里運用Junit框架進行測驗,匯入依賴后進行如下測驗:
1)針對UserRepo類對用戶注冊的插入元素、用戶登錄有關的取出元素方法進行了測驗
public class TestUserRepo { public String username; public String password; UserRepo userRepo = new UserRepo(); @Test public void testInsert(){ UserDO userNow = new UserDO(username, password); userNow.setUsername("hhh"); userNow.setPassword("123"); userRepo.insert(userNow); } @Test public void testselectOneByUsername() { System.out.println(userRepo.selectOneByUsername("hhh")); } }
注冊:插入一個新用戶,由于“hhh”這個用戶在資料庫中已經存在,運行失敗;
登錄:查詢用戶資訊(uid,uesername,password),運行通過,
2)針對專輯相關操作如展示專輯串列、創建專輯進行測驗
public class TestAlbumRepo { AlbumRepo albumRepo=new AlbumRepo(); @Test public void testInsert() { albumRepo.insert(10, "文章標題", "封面圖", 2); } @Test public void testSelectListByUid(){ System.out.println(albumRepo.selectListByUid(10)); } }
結果:專輯插入與展示功能正常,運行通過

關于Junit框架
1)Junit特點
a.JUnit可以靈活的選擇執行哪些測驗方法,可以一鍵執行全部測驗方法
b.JUnit可以生成全部方法的測驗報告
c.單元測驗中的某個方法測驗失敗了,不會影響其他測驗方法的測驗
d.在測驗方法上使用@Test注解:標注該方法是一個測驗方法
e.測驗方法必須是public void,即公共、無回傳資料
f.選中測驗方法,選中 “JUnit 運行”,如果 測驗良好則是綠色;如果測驗失敗,則是紅色

2)Junit常用注解(Junit4.xxx版本)
@Test:在Junit3中,所有的測驗類必須繼承Junit的測驗基類,在Junit4中,定義一個測驗方法只需要在方法前加上@Test,
@Ignore: @Ignore修飾的方法會被忽略不執行同時不計入用例數,但要注意此標注的時候不能與其它標注一起使用,否則無效,不建議使用Ignore標注,因為容易忘記更新測驗方法,造成用例遺漏等,
@BeforeClass:測驗類里所有用例運行之前,運行一次這個標注修飾的方法(只會運行一次),
@AfterClass:跟@BeforeClass對應,在測驗類里所有用例運行之后運行一次該標注修飾的方法,用于處理一些測驗后續作業,例如清理資料,恢復現場,
@Before:每個用例運行之前都運行一次該標注修飾的方法,適用于獨立的用例間,運行次數取決于用例數,
@After:每個用例運行之后都運行一次該標注修飾的方法,適用于獨立的用例間,運行次數取決于用例數,
3)自動化測驗
1)注冊的測驗(test_1register)
2)登錄是正常的登陸時的情況及專輯串列頁面的展示的測驗(test_loginBynormalAndList)
3)登錄是例外登錄時的情況及專輯串列頁面的顯示的測驗(test_loginByAbnormalAndList)
from selenium import webdriver import unittest from selenium.webdriver.common.by import By from ddt import ddt, unpack, data import time # 匯入需要的工具包 @ddt class User(unittest.TestCase): def setUp(self): print("----setUp-----") self.driver = webdriver.Chrome() self.url = "http://127.0.0.1:8080/studio/" self.driver.maximize_window() time.sleep(6) # 注冊 @data(['山山', '123'], ['', '']) # @unittest.skip("skipping") @unpack def test_1register(self, username, password): driver = self.driver url = self.url driver.get(url) time.sleep(1) driver.find_element(By.LINK_TEXT, '注冊').click() time.sleep(1) driver.find_element(By.ID, 'username').send_keys(username) time.sleep(1) driver.find_element(By.ID, 'password').send_keys(password) time.sleep(1) driver.find_element(By.ID, 'submit').click() time.sleep(2) driver.quit() # 登錄+展示專輯串列(成功登錄時的測驗) @data(['山山', '123'], ['hhh', '123']) # @unittest.skip("skipping") @unpack def test_loginBynormalAndList(self, username, password): driver = self.driver url = self.url driver.get(url) driver.implicitly_wait(10) # 智能等待 driver.find_element(By.LINK_TEXT, '登錄').click() time.sleep(6) driver.find_element(By.ID, 'username').send_keys(username) driver.find_element(By.ID, 'password').send_keys(password) time.sleep(4) driver.find_element(By.ID, "submit").click() time.sleep(5) driver.find_element(By.LINK_TEXT, '專輯串列').click() time.sleep(6) driver.quit() # 登錄+展示串列(例外登錄時的測驗) @data(['山山', '13'], ['hhh', '1234']) @unpack def test_loginByAbnormalAndList(self, user, password): driver = self.driver url = self.url driver.get(url) driver.implicitly_wait(10) # 智能等待 driver.find_element(By.LINK_TEXT, '登錄').click() time.sleep(6) driver.find_element(By.ID, 'username').send_keys(user) driver.find_element(By.ID, 'password').send_keys(password) time.sleep(4) driver.find_element(By.ID, "submit").click() time.sleep(5) url = self.url driver.get(url) time.sleep(3) driver.find_element(By.LINK_TEXT, '專輯串列').click() time.sleep(6) alert = driver.switch_to.alert # 定位彈出框操作句柄 time.sleep(3) alert.accept() # 關閉彈出框 time.sleep(5) driver.quit() def tearDown(self): print("----tearDown----") self.driver.quit() if __name__ == "__main__": unittest.main()
五、測驗報告
1.手工測驗報告
見上方??手工測驗框圖
2.自動化測驗用例報告(生成HTML測驗報告)
import HTMLTestRunner import os import sys import time import unittest def createsuite(): discovers = unittest.defaultTestLoader.discover("../testProjectListening", pattern="listeningTest.py", top_level_dir=None) # 一個類就是一個測驗套 print(discovers) return discovers if __name__ == "__main__": # 1.創建一個檔案夾 curpath = sys.path[0] # 當前工具類的一個集合/路徑集合陣列,0指的是當前檔案所在路徑 print(sys.path) print(sys.path[0]) # 2.當前路徑下resultReport檔案夾不存在時,創建 if not os.path.exists(curpath + '/resultreport'): os.mkdir(curpath + '/resultreport') # 解決重復命名問題 # 時間 時分秒 ——》名稱絕對不會重復 now = time.strftime("%Y-%m-%d %H %M %S", time.localtime(time.time())) print(now) print(time.time()) print(time.localtime(time.time())) # 3.準備HTML報告輸出的檔案 # 檔案名是路徑+檔案名稱+時間 filename = curpath + '/resultreport/' + now + 'resultreport.html' # 打開HTML檔案,wb以寫的方式輸入運行的那個結果 with open(filename, 'wb') as fp: # 括號中的引數是HTML報告中的引數 runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=u"測驗報告", description=u"用例執行情況", verbosity=2) # verbosity:結果的詳細程度 suite = createsuite() runner.run(suite)
測驗報告生成:


分析:error 是因為用戶名與密碼不對應,在資料庫中不存在;pass 是通過測驗用例,此用戶名和密碼在資料庫中
如果你覺得自己學習效率低,缺乏正確的指導,可以加入資源豐富、學習氛圍濃厚的技術社群 點我進測驗行業圈,里面有我們收集的配套教程和相關技術檔案提供和測驗媛/猿一起做一個有溫度的軟體測驗工程師,不讓測驗人孤寂的成長!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/509619.html
標籤:其他
上一篇:CPU 是如何與記憶體互動的
下一篇:二、目標檢測演算法之R-CNN
