目錄
- 答疑
- 測驗
- 測驗和開發的區別
- 除錯和測驗
- 技術
- 概念
- 需求
- BUG
- 測驗用例
- 開發模型
- 軟體測驗模型
- 基礎
- 軟體測驗流程(軟體測驗生命周期)
- 如何描述一個 BUG
- BUG 級別
- BUG 的生命周期
- 用例
- 測驗用例設計方法
- 等價類
- 邊界值
- 因果圖
- 場景法
- 錯誤猜測法
- 正交法
- 進階
- 按照開發階段劃分
- 單元測驗
- 集成測驗
- 冒煙測驗
- 系統測驗
- 回歸測驗
- 驗收測驗
- 按實施組織劃分
- α測驗
- β測驗
- 按照是否手工劃分
- 手工測驗
- 自動化測驗
- 是否運行代碼
- 靜態測驗
- 動態測驗
- 按是否查看代碼劃分
- 黑盒測驗(unittest)
- 白盒測驗(Junit)
- 按照測驗物件劃分
- 業務測驗
- 界面測驗
- 容錯性測驗
- 易用性測驗
- 兼容性
- 檔案測驗
- 性能測驗
- 安全性測驗
- 記憶體泄漏測驗
- 自動化測驗(selenium)
- webdriver 基本使用
- 定位元素的方式
- 等待
- 得到瀏覽器標題和 URL
- 瀏覽器視窗大小
- 前進后退
- 鍵盤
- 滑鼠
- 多選 (CheckBox)
- 下拉框
- 彈出框
- 上傳檔案
- 層級框架
- unittest 框架
- 測驗韌體
- 測驗套件
- 忽略測驗用例執行
- 斷言
- 截圖
- HTML
- 資料驅動
答疑
測驗
概念:驗證軟體是否滿足用戶需求
測驗和開發的區別
除錯和測驗
-
目的
測驗:檢查軟體是否實作了應該實作的功能;
除錯:是程式員檢查軟體是否實作了該代碼應該實作的功能, -
角色
開發:程式員
測驗:測驗人員和開發人員 -
階段
開發:只在開發階段除錯
測驗:在軟體開發的整個生命周期
技術
測驗:技術要求廣,但是深度低一些,要求使用各種工具和懂一些語言
開發:技術要求專一,深度高
為什么選擇軟體測驗
- 興趣
- 技能
- 抗壓能力
- 責任感
為什么不做開發,而做測驗
學習了開發知識 ==> 了解到軟體測驗 ==> 感興趣 ==> 學習開發更好地進行測驗
概念
需求
概念:滿足用戶需求或正式檔案所需的權限和技能
測驗人員在需求階段就介入了測驗
用戶需求:用戶想干什么,吃紅燒肉
軟體需求:做紅燒肉需要干什么?買肉、買佐料等
BUG
概念:當且僅當規格說明存在且合理的情況下,軟體的功能和需求規格說明不符合,說明是軟體錯誤;
當軟體規格說明不存在,用戶需求合理,軟體功能和需求規格不相符,說明軟體錯誤,
也就是說,不管規格說明存在與否,只要用戶需求合理,但是軟體功能和需求規格說明不符合,則是 bug
測驗用例
概念:向測驗系統發起的一組集合;包含:測驗環境、測驗步驟、測驗資料、預期結果、標題、測驗功能模塊、優先級、重要性等,
開發模型
瀑布模型

螺旋模型

迭代、增量模型

敏捷模型
角色:產品經理(PO)、專案經理(SM)、研發團隊(ST)
產品發布會議 ==> 迭代計劃會議 ==> 開發期間每日站會 ==> 演示會議 ==> 回顧會議
軟體測驗模型
測驗人員什么時候開始介入測驗的?
- W 模型中,在需求分析時介入;
缺點:串行執行,不支持敏捷開發;
V 模型中,在編碼后介入,
缺點:無法在需求階段介入
基礎
軟體測驗流程(軟體測驗生命周期)
需求分析 ==> 測驗計劃 ==> 測驗設計 / 開發 ==> 測驗執行 ==> 測驗報告
如何描述一個 BUG
測驗版本(系統版本) + 測驗環境(瀏覽器版本等) + 測驗步驟 + 測驗資料 + 預期結果 + 實際結果 + 附件(錯誤截圖、錯誤日志)
BUG 級別
崩潰
嚴重
一般
建議
系統新功能上線,發現用戶在使用某一個功能時崩潰了,且無法修復,這個時候測驗人員如何處理?
- 回退版本(系統穩定的版本)
- 抓緊實作修復問題
BUG 的生命周期

開發人員修復一個 BUG 后,測驗的時候任然發現 BUG 存在,可能的原因
- 開發檢查,修復代碼后是否提交新代碼;
- 測驗人員沒有重新提取測驗環境的代碼;
- 確實是開發人員沒有修改成功,
如何處理測驗人員和開發人員因為 BUG 產生沖突怎么辦?
- 檢查自身 BUG 描述是否清楚,BUG 檢查是否正確;
- 站在用戶的角度去說服開發人員;
- BUG 的定級有理有據,不要夸大其詞;
- 測驗人員不斷提高自己的水平,能夠發現 BUG 及其產生的原因,還有解決方案;
- 開三方會議(產品經理、開發人員、測驗人員)一起討論 BUG 解決方案,
用例
設計測驗用例依據
根據需求來設計測驗用例
分析需求、細化需求、從需求中提取功能點 / 測驗點,然后再用設計測驗的具體方法設計測驗用例;
黑盒測驗設計測用例方法
等價類、邊界值、因果圖、場景設計法、錯誤猜測法、正交法
測驗用例設計方法
等價類
概念:把輸入(特殊情況才考慮輸出)劃分成若干個等價類,從每一個等價類當中選取一個測驗用例進行測驗,如果這個測驗用例通過,就說明這個測驗用例代表的等價類測驗通過,
使用情況:測驗用例太多無法窮舉
有效等價類:對該功能輸入有意義的輸入(輸入合法的用戶名)
無效等價類:對該功能輸入無意義的輸入(輸入不合法的用戶名)
邊界值
概念:針對輸入的邊界進行測驗用例的設計
因果圖
使用情況:輸入有多個條件,并且輸入不同組合對應著不同輸入
邏輯關系:與 或 非 恒等
使用步驟:分析可能的輸入和輸出 ==> 找出輸入與輸出之間的優惠 ==> 畫出因果圖 ==> 將因果圖畫出判定表 ==> 根據判定表寫測驗用例
-
分析可能的輸入輸出
輸入:訂單提交、金額大于 300、有紅包
輸出:有優惠、無優惠 -
找出輸入與輸出之間的優惠

-
畫因果圖

-
畫判定表:有 3 個輸入,2 個輸出,對應的列數 2^3 = 8

場景法
概念:把系統中一個一個孤立的功能點按照一定的邏輯組合起來,形成一個場景 / 業務,針對場景進行測驗
首先確定場景中的每一個功能點,確定功能點可能的輸入和不同的輸出
錯誤猜測法
概念:根據測驗人員的直覺、經驗、知識去判斷系統某一模塊的問題,有針對性的設計測驗用例
正交法
概念:研究多因素(不同的輸入)多水平(不同輸入不同的取值)的一種測驗用例設計方法,根據正交性,選出最優的輸入組合進行試驗,分析試驗結果,用結果衡量整體試驗的結果
TCP 和 UDP 協議怎么測驗?
分別分析 TCP 與 UDP 的作用以及特點
TCP
作用:傳輸資料
特點:可靠(是否收到 ACK),三次握手(根據三次握手每次發送的信號不同進行測驗),資料流,四次揮手等UDP
作用:傳輸資料
特點:資料報、不可靠、速度快,
進階
按照開發階段劃分
單元測驗
分類:Junit 單元測驗框架(白盒)、unittest 單元測驗框架(黑盒)
依據:詳細設計檔案
集成測驗
概念:集成測驗也稱聯合測驗(聯調)、組裝測驗,將程式模塊采用適當的集成策略組裝起來,對系統的介面及集成后的功能進行正確性檢測的測驗作業,集成主要目的是檢查軟體單位之間的介面是否正確,
測驗方法:白盒測驗
冒煙測驗
冒煙測驗的物件是每一個新編譯的需要正式測驗的軟體版本,目的是確認軟體基本功能正常,可以進行后續的正式測驗作業,也就是系統測驗,冒煙測驗的執行者是版本編譯人員,
系統測驗
將軟體系統看成是一個系統的測驗,包括對功能、性能以及軟體所運行的軟硬體環境進行測驗,時間大部分在系統測驗執行階段,包括回歸測驗和冒煙測驗,
測驗方法:黑盒測驗
回歸測驗
概念:查看新引入的代碼對舊的功能是否有影響
驗收測驗
驗收測驗是部署軟體之前的最后一個測驗操作,它是技術測驗的最后一個階段,也稱為交付測驗,驗收測驗的目的是確保軟體準備就緒,按照專案合同、任務書、雙方約定的驗收依據檔案,向軟體購買都展示該軟體系統滿足原始
需求,
按實施組織劃分
α測驗
非測驗、非開發人員進行測驗
β測驗
真實用戶不分時間地點進行測驗(內測)
按照是否手工劃分
手工測驗
手工測驗就是由人去一個一個的輸入用例,然后觀察結果,和機器測驗相對應,屬于比較原始但是必須的一個,
優點:自動化無法替代探索性測驗、發散思維結果的測驗,
缺點:執行效率慢,量大易錯,
自動化測驗
撰寫自動化腳本,把設計的測驗用例進行測驗
自動化測驗無法代替手工測驗
是否運行代碼
靜態測驗
不運行代碼,分析代碼進行測驗
動態測驗
運行代碼,檢查預期結果與實際結果的異同分析差異、運行效率、正確性等
按是否查看代碼劃分
黑盒測驗(unittest)
把軟體看成一個黑色盒子,不關心軟體內部代碼的邏輯結構實作,只關心輸入輸出
白盒測驗(Junit)
測驗程式的內部邏輯、結構的實作,是否實作了相應的功能
測驗方法:陳述句覆寫、邏輯覆寫(判定覆寫 / 條件覆寫 / 判定組合 / 條件組合 / 判定和條件組合) 、路徑覆寫(if / else / try / catch)、回圈覆寫(for / while)
按照測驗物件劃分
業務測驗
概念:是測驗人員把系統各個模塊串接起來運行、模擬真實用戶實際的作業流程,滿足用戶需求定義的功能來進行測驗的
程序,
界面測驗
- 布局排盤
- 字體大小、粗細等
- 圖片是否清晰
- 頁面的控制元件(按鈕、滾動條、CheckBox 等)
容錯性測驗
概念:當系統由于外界原因發生例外時,能自我處理,不把例外直接展現給用戶,給用戶一個友好的提示
易用性測驗
易用性(Useability)是互動的適應性、功能性和有效性的集中體現,易用性屬于人體工程學的范疇,人體工程學(ergonomics)是一門將日常使用的東西設計為易于使用和實用性強的學科
兼容性
兼容性主要是指軟體之間能否很好的運做,會不會有影響、軟體和硬體之間能否發揮很好的效率作業,會不會影響導致系統的崩潰,
檔案測驗
在實際的測驗中,最常見的是用戶檔案的測驗,例如:手冊說明書等,也會有一些公司對需求檔案進行測驗,來保證需求檔案的質量,
性能測驗
檢查系統是否滿足需求規格說明書中規定的性能,
安全性測驗
安全測驗是一個相對獨立的領域,需要更多的專業知識,例如web的安全測驗,需要熟悉各種網路協議
TCP\HTTP,防火墻,CDN,熟悉各種作業系統的漏洞,熟悉路由器等,從軟體來說,熟悉各種攻擊手段,例如 SQL 注入、Xss 等,
記憶體泄漏測驗
用戶在分配了記憶體空間,沒有回收,導致占用的記憶體越來越多,
自動化測驗(selenium)
webdriver 基本使用
定位元素的方式
# 用 id 定位
輸入框 id = kw 發送 張嘉文 到輸入框
driver.find_element_by_id("kw").send_keys("張嘉文")
# 百度一下(提交搜索) click 點擊
driver.find_element_by_id("su").click()
# 用 name 定位
driver.find_element_by_name("wd").send_keys("張嘉文")
driver.find_element_by_id("su").click()
# class name 定位
driver.find_element_by_class_name("s_ipt").send_keys("張嘉文")
driver.find_element_by_class_name("bg s_btn").click()
# link text 定位
driver.find_element_by_link_text("貼吧").click()
# partial 定位
driver.find_element_by_partial_link_text("吧").click()
# tag name 定位
driver.find_element_by_tag_name("")
# xpath 定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("張嘉文")
driver.find_element_by_xpath("//*[@id='su']").click()
# css selector
driver.find_element_by_css_selector("#kw").send_keys("張嘉文")
driver.find_element_by_css_selector("#su").click()
等待
time.sleep(3)
driver.implicitly_wait(3)
異同
同:與 time.wait(10) 相同的是, 兩者如果等待 10s 都沒有找到下一個需要的元素, 那么就會拋出例外
異:time.sleep() 是固定等待;而 driver.implicotly_wait() 則是等到找到就繼續執行,而不是死等
得到瀏覽器標題和 URL
# 獲得標題
driver.title
# 獲得 URL
driver.current_url
瀏覽器視窗大小
# 設定瀏覽器視窗
driver.set_window_size(600,1000)
# 瀏覽器最大化
driver.maximize_window()
前進后退
# 前進
driver.forward()
# 后退
driver.back()
鍵盤
# 需要的包
from selenium.webdriver.common.keys import Keys
# 用法
driver.find_element_by_name("username").send_keys(Keys.CONTROL,'a')
driver.find_element_by_name("username").send_keys(Keys.CONTROL,'c')
driver.find_element_by_name("password").send_keys(Keys.ENTER)
滑鼠
# 需要的包
from selenium.webdriver.common.action_chains import ActionChains
# 右擊
name = driver.find_element_by_id("su")
ActionChains(driver).context_click(name).perform()
# 雙擊
ActionChains(driver).double_click(name1).perform()
多選 (CheckBox)
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
下拉框
# 通過 css selector 定位
driver.find_element_by_css_selector("#ShippingMethod > option:nth-child(5)").click()
# 陣列下標
options[2].click()
彈出框
driver.switch_to.alert.accept()
上傳檔案
driver.find_element_by_tag_name("input").send_keys("F:\\圖片\\0.jpg")
層級框架

從默認框架到 f2,需要先到 f1;
從 f2 到默認框架,也需要先到 f1;
unittest 框架
測驗韌體
from selenium import webdriver
import unittest
import time
import os
# unittest.TestCase 的作用:Unit 這個類繼承了 unittest.TestCase
class Unit(unittest.TestCase):
def setUp(self):
print("run setUp")
self.driver = webdriver.Chrome()
self.url = "https://www.baidu.com/"
self.driver.maximize_window()
def tearDown(self):
print("run tearDown")
self.driver.quit()
if __name__=="__main__":
unittest.main()
測驗套件
from Test import unitDemo
from Test import unitDemo1
import unittest
def createsuite():
# addTest 每次把一個測驗腳本的一個測驗用例加載到測驗套件
suite = unittest.TestSuite()
suite.addTest(unitDemo.Unit("test_Abaidu"))
suite.addTest(unitDemo.Unit("test_abaidu"))
suite.addTest(unitDemo1.Unit("test_cbaidu"))
suite.addTest(unitDemo1.Unit("test_Dbaidu"))
def createsuite1():
# 把一個測驗腳本中的所有測驗用例加載進入套件
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(unitDemo.Unit))
suite.addTest(unittest.makeSuite(unitDemo1.Unit))
return suite
def createsuite2():
# TestLoader
# 把一個測驗腳本中的所有測驗用例加載進入套件
suite1 = unittest.TestLoader().loadTestsFromTestCase(unitDemo.Unit)
suite2 = unittest.TestLoader().loadTestsFromTestCase(unitDemo1.Unit)
suite = unittest.TestSuite([suite1, suite2])
return suite
def createsutie3():
# 把一個檔案夾下所有以某種形式命名的測驗腳本全部加入到測驗套件
discover = unittest.defaultTestLoader.discover("../Test", pattern="unitDemo*.py",top_level_dir=None)
return discover
if __name__=="__main__":
suite = createsuite1()
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
忽略測驗用例執行
@unittest.skip("skipping")
# 注解:忽略測驗用例執行
def test_abaidu(self):
driver = self.driver
url = "https://www.baidu.com/"
self.driver.get(url)
driver.find_element_by_id("kw").send_keys("豬頭")
driver.find_element_by_id("su").click()
time.sleep(3)
title = driver.title
try:
self.assertEqual("豬頭_百度一下", title, msg="不相等")
except:
self.saveScreenShot(self,driver,"豬頭.png")
time.sleep(3)
斷言
作用:判斷預期結果與實際結果是否一致
# 斷言
def test_abaidu(self):
driver = self.driver
url = "https://www.baidu.com/"
self.driver.get(url)
driver.find_element_by_id("kw").send_keys("豬頭")
driver.find_element_by_id("su").click()
time.sleep(3)
title = driver.title
try:
self.assertEqual("豬頭_百度一下", title, msg="不相等")
except:
self.saveScreenShot(self,driver,"豬頭.png")
time.sleep(3)
截圖
# 運行順序 0-9 A-Z a-z
# 截圖
def test_Abaidu(self):
driver = self.driver
url = self.url
driver.get(url)
driver.find_element_by_id("kw").send_keys("是你")
driver.find_element_by_id("su").click()
time.sleep(3)
title = driver.title
print(title)
try:
self.assertEqual("123是你_百度一下",title,msg="不相等")
except:
self.saveScreenShot(driver,"是你.png")
time.sleep(3)
HTML
作用:所有結果輸出到 HTML 報告中
import os
import sys
import time
import unittest
import HTMLTestRunner
def createsuite():
discovers = unittest.defaultTestLoader.discover("../Test", pattern="unitDemo*.py", top_level_dir=None)
print(discovers)
return discovers
if __name__=="__main__":
#1,創建一個檔案夾
# 當前的路徑
curpath = sys.path[0]
# sys.path 是一個路徑集合陣列
print(sys.path)
print(sys.path[0])
# 當前路徑下resultreport檔案夾不存在的時候,就創建一個
if not os.path.exists(curpath+'/resultreport'):
os.makedirs(curpath+'/resultreport')
# 2,解決重復命名的問題
now = time.strftime("%Y-%m-%d-%H %M %S", time.localtime(time.time()))
print(time.time())
print(time.localtime(time.time()))
# 檔案名是路徑加上檔案的名稱
# 準備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)
suite = createsuite()
runner.run(suite)
資料驅動
安裝工具包:pip install ddt
from selenium import webdriver
import unittest
import time
from ddt import ddt, unpack, file_data, data
import sys, csv
def getTxt(file_name):
# ([貓, 貓_百度搜索], [狗, 狗_百度搜索], [豬, 豬_百度搜索])
rows = []
path = sys.path[0]
with open(path + '/data/' + file_name, 'rt',encoding='utf-8') as f:
readers = csv.reader(f, delimiter=',', quotechar='|')
next(readers, None)
for row in readers:
temprows=[]
# 貓, 貓_百度搜索
for i in row:
temprows.append(i)
rows.append(temprows)
return rows
def getCsv():
# 讀取 csv 檔案
values = []
with open('data/test_help_json.csv', encoding='utf-8') as f:
f_scv = csv.reader(f)
next(f_scv)
for i in f_scv:
values.append(i)
return values
@ddt
class Baidu(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(30)
self.base_url = "http://www.baidu.com/"
self.driver.maximize_window()
self.verificationErrors=[]
self.accept_next_alert=True
def tearDown(self):
self.driver.quit()
self.assertEqual([],self.verificationErrors)
# json 資料
# 一次獲取一條
@unittest.skip("skipping")
@file_data('data/test_baidu_data.json')
def test_baidu1(self, value):
driver = self.driver
driver.get(self.base_url+"/")
driver.maximize_window()
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(value)
driver.find_element_by_id("su").click()
time.sleep(3)
@unittest.skip("skipping")
@data("貓","狗","豬","pig")
# 使用 data 直接放入資料
def test_baidu2(self, value):
driver = self.driver
driver.get(self.base_url+"/")
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(value)
driver.find_element_by_id("su").click()
self.assertEqual(value,driver.title,msg="不符合")
time.sleep(3)
@data(['豬',u'豬_百度百科'],['pig',u'pig_百度百科'])
@unpack
# 使用兩個引數需要加 unpack
def test_baidu3(self, value, expected_value):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(value)
driver.find_element_by_id("su").click()
time.sleep(3)
self.assertEqual(expected_value, driver.title, msg="與預期不符合")
print(expected_value)
print(driver.title)
time.sleep(3)
# 讀取 txt 文本
@data(*getTxt('test_helpddt.txt'))
@unpack
def test_baidu4(self, value, expected_value):
driver = self.driver
driver.get(self.base_url + "/")
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(value)
driver.find_element_by_id("su").click()
time.sleep(3)
self.assertEqual(expected_value, driver.title, msg="與預期不符合")
print(expected_value)
print(driver.title)
time.sleep(3)
# 讀取 json 檔案
@data(*getCsv())
@unpack
def test_baidu5(self,value,expected_value):
driver = self.driver
driver.get(self.base_url+"/")
driver.find_element_by_id("kw").clear()
driver.find_element_by_id("kw").send_keys(value)
driver.find_element_by_id("su").click()
self.assertEqual(value,expected_value,msg="不匹配")
time.sleep(3)
if __name__=="__main__":
unittest.main()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299511.html
標籤:其他
上一篇:嵌入式系統工程化設計4
下一篇:軟體測驗介紹


