驅蟲師之軟體測試——全網最長篇
計算機基礎知識
-
B/S 瀏覽器和伺服器架構 廣域網,使用者廣,安全性低
-
C/S 客戶端和服務橋架構 區域網,使用者穩定,安全性高
OSI 七層結構
-
物理層
-
資料鏈路層
-
網路層
-
傳輸層
-
會話層
-
表示層
-
應用層
TCP/IP協議
-
傳輸層
-
應用層
-
網路互連層
-
網路介面層
DOS常規操作
-
arp -a ip地址與實體地址的對應關係
-
cls 清屏
-
碟符 切換到對應的盤
-
cd 切換到對應的資料夾
-
dir 顯示對應的目錄
-
cd .. 返回上一級的目錄
-
cd / 返回根目錄
-
md 建立新目錄
軟體測試理論
軟體測試流程
-
1.需求分析
-
2.測試用例(根據需求文件,摘抄測試點,編寫測試用例)
-
3.評審測試用例
-
4.搭建測試環境
-
5.等待測試包
-
6.部署測試包
-
7.冒煙測試
-
8.執行測試用例
-
9.跟蹤bug,進行迴歸測試
測試流程
-
需求評審
-
測試計劃
-
測試用例
-
用例評審
-
冒煙測試
-
測試執行
-
驗收測試
-
風險評估
-
上線\觀察
-
問題跟進
-
測試報告
-
覆盤會議
測試方法
-
按階段:單元測試、整合測試、系統測試、驗收測試
-
按手段:黑盒測試、白盒測試、灰盒測試
-
其他:冒煙測試、迴歸測試
測試用例設計方法
-
黑盒測試用例設計:等價類劃分法、邊界值分析法、錯誤推測法、因果圖法、正交試驗分析法、流程分析法
-
白盒測試:語句覆蓋、判定覆蓋、條件覆蓋、條件組合覆蓋、判定/條件覆蓋、路徑覆蓋
設計一個登入頁面的用例
-
功能測試:正確輸入、為空輸入、字元型別校驗、長度校驗、密碼是否加密顯示、大寫提示、跳轉頁面是否成功、登出後用另一個賬號登入
-
UI測試:介面佈局合理、風格統一、介面文字簡潔好理解、無錯別字
-
效能測試:開啟登入頁面需要幾秒、點選登入跳轉首頁需要幾秒、多次點選、多人點選
-
安全性:使用者名稱額密碼是否加密傳送給伺服器、錯誤登入次數限制(防止暴力破解)、一臺機器登入多個使用者、一個使用者多方登入、檢查元素能否看到密碼
-
相容性測試:不同瀏覽器、不同平臺(Windows、Mac)、移動裝置能否工作
-
易用性:輸入框可否tab鍵切換、回車能否登入等
App的相容性如何測?App的介面測試如何測?
-
系統相容(ios、安卓)、機型相容(iPhone、華為、小米、三星、vivo、OPPO)、解析度相容、軟體本身向前向後相容
-
介面測試:獲取介面文件、使用fiddler抓包工具獲取介面的請求方式、url、請求引數、返回引數、然後使用postman、jmeter進行測試
Web端測試和App端測試有何不同(常見)
-
系統結構方面
-
Web專案,b/s架構,基於瀏覽器的;Web測試只要更新了伺服器端,客戶端就會同步更新;
-
App專案,c/s結構的,必須要有客戶端;App修改了服務端,則客戶端使用者所有核心版本都需要進行迴歸測試一遍;
-
-
相容方面
-
Web專案:
-
瀏覽器(火狐、谷歌、IE等)
-
作業系統(win7、win10、Linux等)
-
-
App專案:
-
裝置系統:ios(ipad、iphone)、Android(三星、華為、聯想等)、Windows(Win7、Win8)、OSX(Mac)
-
手機裝置可根據手機型號、解析度不同
-
-
-
效能方面:
-
Web專案:需檢測 響應時間、CPU、Memory
-
App專案:除了檢測 響應時間、CPU、Memory外、還要檢測流量、電量等
-
-
相對與Web專案,App有專項測試
-
干擾測試:中斷、來電、簡訊、關機、重啟等
-
弱網路測試(模擬2g、3g、4g、wifi網路狀態以及丟包情況);網路切換測試(網路斷開重連、3g切換至4g/wifi等)
-
安裝、更新、解除安裝
-
安裝:需要考慮安裝時的中斷、弱網、安裝後刪除安裝檔案等情況
-
解除安裝:需要考慮 解除安裝後是否刪除App相關的檔案
-
更新:分強制更新、非強制更新、增量包更新、斷點續傳、弱網狀態下更新
-
-
-
介面操作:關於手機端測試,需注意手勢、橫豎屏切換、多點觸控、前後臺切換
-
安全測試:安裝包是否可反編譯程式碼、安裝包是否簽名、許可權設定、例如:訪問通訊錄等
-
邊界測試:可用儲存空間少、沒有SD卡/雙SD卡、飛航模式、系統時間有誤、第三方依賴(QQ、微信登入)等
-
許可權測試:設定某個App是否可以獲取改許可權,例如是否可以訪問通訊錄、相簿、照相機、話筒、位置等
測試常用的工具
-
需求問題跟進、測試計劃、風險評估登記、測試報告、覆盤會議:Wiki
-
測試用例:Xmind編寫、Testlink管理
-
測試執行:ELK、Xshell等
-
Bug管理:Jira、bugfree、禪道等
-
介面測試相關:Chares、Fiddler、Postman、JMeter等
-
自動化相關:Selenium、Appium、pytest、Locust、JMeter等
工具對用例進行管理
-
Testlink管理用例的一般步驟:新建計劃、新建版本、上傳xml檔案、新增測試用例到測試計劃中、分配測試用例給開發、檢視用例執行報告
-
Xmind
-
Excel:用例編號ID、測試專案(單元、模組)、測試標題、優先順序、預置條件、測試輸入、操作步驟、預期結果、【作者】、【建立時間】、【修改時間】、測試結果
使用ELK定位日誌
-
檢視產品推送是否成功。產品從A平臺推送到B平臺,根據A平臺的連結id,搜尋對應的日誌。搜尋不到,則為A平臺推送失敗。搜尋到了,檢視推送的狀態,可進一步判斷問題所在
-
使用官方文件,可以進一步瞭解ELK日誌檢視
埋點測試如何測試?使用什麼工具?資料要不要入庫?
-
使用Charles、Fiddler抓包,檢視對應的來源記錄、事件等必要引數是否正確,檢視資料庫記錄是否正確
Fiddler和Postman的區別
-
Fiddler主要是抓包,Postman主要進行介面請求
使用Postman進行多個介面請求
-
將多個介面請求歸納到一個集合裡,在集合的右上角點選展開箭頭,點選Run
日常工作中JMeter的使用
-
介面測試:通過對指定介面進行請求訪問,驗證資料出入的準確性與安全性
-
效能測試:編寫對應的測試集,通過指令碼控制執行緒數,實現逐步加壓等
軟體測試質量模型(ISO9216)
-
1.功能性
-
2.可靠性
-
3.易用性
-
4.效率
-
5.可維護性
-
6.可移植性
軟體測試質量體系(SQA)
-
1.保證計劃的進行
-
2.保證遵循步驟和需求
-
3.及時通知開發人員
-
4.高管可以接觸到軟體的內部
-
5.軟體質量需要測試工作來保證
功能測試用例基本結構規範
-
正常邏輯測試
-
正常流程
-
使用者正常的操作測試
-
-
輔助提示
-
操作成功、失敗提示——操作成功提示、操作失敗提示後返回,原始資料不清除、輸入框長度提醒等
-
-
資料去向
-
操作物件、資料庫資料值校驗——資料落地儲存、快取資料庫儲存、欄位長度等
-
-
-
容錯性測試
-
資料校驗
-
長度、型別、格式——1、姓名、年齡、手機號碼、身份證、營業執照等長度、型別、格式校驗、必要時進行正則驗證;2、涉及金額相關需要進行範圍性校驗及二次確認,在範圍外做好提示二次校驗或者禁止提交等
-
-
必錄項
-
必錄項控制校驗——必錄項 為空或null等測試
-
-
功能次序
-
混亂測試容錯性測試——1、前端介面次序混亂測試;2、介面層面次序混亂測試
-
-
功能鑑權
-
容錯性介面測試——介面欄位預設,欄位值為空,錯誤型別(int傳string)、欄位長度(超過資料庫設定)等
-
-
輔助測試
-
輸入控制提示,必錄項控制提示,系統設定提示——1、必錄項提示後保留已輸入資料;2、APP輸入手機號碼等純數字時,鍵盤跳轉至數字鍵盤。
-
-
-
資料來源
-
編碼項
-
編碼項可選來源過濾——1、前端過濾;2、介面過濾
-
-
系統許可權過濾
-
審批許可權、其他許可權等——許可權開通關閉資料庫落地,許可權變更時系統提示重新登入等
-
-
狀態、關鍵字過濾
-
敏感字、關鍵字過濾——流程性狀態過濾
-
-
-
頁面元素測試
-
頁面位置
-
每個頁面位置敘述——根據使用者習慣輸入先後順序,輸入框尺寸
-
-
查詢條件項
-
查詢條件篩選,條件資料項——模糊查詢、條件選擇性測試
-
-
列表項
-
查詢結果欄位——列表排序
-
-
詳情頁面項
-
詳情連結頁面資料項——位置合理性
-
-
分頁功能項
-
查詢結果列表分頁——分頁查詢,每頁顯示條數自由選擇或合理性判斷
-
-
頁面初始值
-
新增、修改、查詢頁面資料項的初始值——修改初始值讀取原資料
-
-
-
資料流
-
基本資料流
-
主幹資料流:業務功能的最大集合
-
-
備選資料流
-
選擇資料流:主幹條件分支
-
-
WEB功能測試——頁面控制元件模型
普通文字輸入框控制元件
-
校驗為空
-
校驗等於最大值-1長度
-
校驗等於最小值-1長度
-
校驗對齊方式
-
校驗前空格
-
校驗後空格
-
校驗中間空格
-
校驗等於最大值長度
-
校驗等於最大值+1長度
-
校驗等於最小值長度
-
校驗是否禁用HTML程式碼
-
校驗高危字敏感字過濾
-
校驗特殊字元
單選下拉選擇框控制元件
-
校驗預設選項
-
校驗重新整理頁面
-
校驗對齊
-
校驗滾動條
-
校驗為空
-
校驗內容長度
-
校驗排序
時間選擇框控制元件
-
校驗支援為空
-
校驗不支援為空
-
包裝日曆元件
-
校驗顯示格式
-
檢驗支援全形字元
-
校驗包裝日曆支援手工輸入
-
校驗預設日期
-
校驗輸入日期中帶有特殊字元
-
校驗輸入小時中帶有特殊字元
-
校驗輸入分鐘中帶有特殊字元
-
校驗輸入秒鐘中帶有特殊字元
-
校驗輸入年份中帶字母
-
校驗輸入月份中帶字母
-
校驗輸入日期中帶字母
-
校驗輸入秒鐘中帶字母
-
校驗輸入年份中帶漢字
-
校驗輸入月份中帶漢字
-
校驗輸入日期中帶漢字
-
校驗輸入小時中帶漢字
-
校驗輸入分鐘中帶漢字
-
校驗輸入秒鐘中帶漢字
-
校驗修改日期欄位正確生效
-
校驗修改小時欄位正確生效
-
校驗修改分鐘欄位正確生效
-
校驗修改秒鐘欄位正確生效
WEB功能測試——頁面動作模型
翻頁動作
-
校驗頁面內容顯示
-
校驗上翻按鈕功能
-
校驗下翻按鈕功能
-
校驗首頁按鈕功能
-
校驗末頁按鈕功能
-
校驗在首頁點選上翻按鈕
-
校驗在末頁點選下翻按鈕
-
校驗頁數輸入特殊符號
-
校驗頁數輸入字母
-
校驗頁數輸入0時處理結果
-
校驗頁數輸入漢字時處理結果
-
校驗頁數輸入大於最大頁數
-
校驗新增記錄後查詢結果顯示是否正確
-
校驗查詢的最大記錄數、顯示時間
-
翻頁後的頁面定位是新開視窗還是原頁面體跳轉
-
翻頁按鈕是否在顯眼地方,是否符合使用者習慣
-
翻頁新頁面顯示時間是否能接受
檔案上傳動作
-
校驗為空
-
校驗支援檔案型別
-
校驗不支援檔案型別
-
校驗等於檔案最大容量
-
校驗大於檔案最大容量
-
校驗支援檔案為空
-
校驗不支援為空
-
校驗檔案不存在
-
校驗重新整理頁面
-
校驗前空格
-
校驗後空格
-
校驗中間空格
-
上傳成功後,是否正確顯示上傳檔案路徑
-
上傳失敗後,是否有友好的提示資訊
-
必填項的標示是否正確
-
上傳最大大小的檔案需要的時間是否可以接受
檔案下載動作
-
校驗連結可點
-
校驗連結不可點
-
校驗下載方式
-
右鍵另存為是否正確下載檔案,是否記錄下載次數
-
工具下載是否正確,是否記錄下載次數
-
返回按鈕是否回到上一個頁面
-
下載路徑對應的硬碟空間不足時
-
後臺設定了下載許可權的檔案是否在前臺可以找到且下載
-
當前位置的提示是否顯示正確
-
下載最大大小的檔案需要的時間是否可以接受
-
按鈕文字正確性
-
必填項的標示是否正確
表單清空/提交動作
-
校驗前臺資料清空
-
校驗後臺資料清空
-
校驗重新整理頁面
-
校驗錯誤目標頁
-
校驗正確目標頁
-
校驗支援單次提交
-
校驗表單驗證
全選/反選動作
-
是否實現了全選當前頁的功能
-
全選按鈕勾選狀態變更是否正確
-
全選按鈕勾選後,其他記錄勾選變更是否正確
-
全選按鈕是否在顯眼的地方,是否符合使用者習慣
-
全選後所有記錄勾選上顯示時間是否能接受
-
是否實現了反選當前頁的功能
-
反選按鈕勾選狀態變更是否正確
-
反選後所有記錄勾選上顯示時間是否能接受
重置動作
-
預設值為空的資料項進行重置
-
預設值為已存在值的資料項進行重置
-
修改所有值資料項的值後進行重置
-
修改某個值資料項的值後進行重置,再重置
-
修改某個值資料項的值後重新整理,再重置
-
修改某個值資料項的值後進行相關的操作(查詢之類),在重置
-
修改多個值資料項的值後進行相關的操作(查詢之類),在重置
WEB功能測試——基本操作模型
單個查詢操作
-
分別對條件進行精確查詢
-
輸入長度的校驗、輸入允許的最大值進行查詢,是否支援
-
兩個查詢條件是否是2選1,來回選擇是否出現頁面錯誤
-
輸入字元
-
輸入特殊字元
-
輸入漢字
-
輸入數字
-
條件中含有空格
-
輸入超長字元
-
輸入全形字元
-
輸入單引號
-
輸入單引號引起來的資料
-
輸入雙引號
-
輸入雙引號引起來的資料
-
查詢結果按照什麼順序排序
-
查詢結果是否根據欄位顯示排序功能
-
查詢結果是否有分頁,如果有,每頁最多多少記錄
-
查詢結果是否匹配
-
查詢結果是否與資料庫一致
-
查詢結果是精確查詢還是模糊查詢
-
輸入框大小、文字大小是否合適
-
查詢處理時間是否能接受
-
資料庫存在大量資料時,查詢處理時間是否能接受
-
多個使用者同時查詢時,輸入相同或不同的條件查詢後系統響應是否及時
級聯查詢操作
-
所有條件輸入空查詢
-
只輸入一個關鍵條件查詢
-
隨機組合條件查詢
-
輸入所有關鍵條件查詢
-
所有條件都輸入查詢
-
查詢結果按什麼順序排序
-
查詢結果是否根據欄位顯示
-
查詢結果是否與資料庫一致
新增操作
-
初始化資料正確性
-
進入功能後未修改任何資料項執行新增功能
-
清空功能中所有可刪除的資料項後執行新增功能
-
錄滿功能中所有資料
-
伺服器磁碟空間不足,不能新增
-
主鍵同名,唯一性驗證
-
建立時間以伺服器的時間為準
-
是否在任何情況下,都可以取消儲存
-
如果存在重置功能,重置後是否正常儲存
-
提交成功後有返回結果,成功失敗頁面或實時重新整理列表
-
新增提交時間如果長,應出現進度顯示錶
-
新增的資料是否與資料庫一致
-
系統是否有提供資料回顯,那麼回顯資料與新增資料是一致的
-
如果新增資料後有返回到列表,則一般是新增的資料排在首頁首行
修改操作
-
修改一條記錄
-
是否支援同時修改多條記錄
-
多使用者同時修改同一記錄
-
點選“取消”或“返回”是否給予提示
-
提交成功後有返回結果,成功失敗頁面或實時重新整理列表
-
修改提交時間如果長,應出現進度顯示
-
修改的資料是否與資料庫一致
刪除操作
-
刪除一條記錄
-
是否支援同時刪除多條記錄
-
一個使用者 修改,一個使用者刪除同樣的記錄
-
無選擇記錄時刪除是否控制
-
提交成功後有返回結果,成功失敗頁面或實時重新整理列表
-
如果節點沒有被其他功能關聯,可以刪除,反之不行
-
級聯刪除是否成功
資料匯入操作
-
是否完成資料正常匯入功能
-
匯入檔案的部分資料異常進行匯入
-
匯入檔案的全部資料異常進行匯入
-
匯入檔案的關鍵欄位值在資料中不存在進行匯入
-
匯入檔案的資料格式不符合進行匯入
-
資料匯入後列表中的顯示是否正確
-
資料匯入後在資料庫中的顯示是否正確
APP與WEB測試的主要區別:
APP特有的測試場景
-
預設鍵盤(如輸入手機號碼等場景時預設呼叫數字鍵盤)
-
九宮格、全鍵盤
-
多點觸控
-
螢幕解析度
-
安裝解除安裝、覆蓋安裝、殺程序在啟動、清理快取(安卓)
-
手機許可權(如相機、圖片、本地檔案、麥克風、通訊錄、簡訊等)
-
手機自帶按鈕(如Android的後退、home鍵、IOS的home鍵)
-
機型、系統、解析度等適配
-
emoji表情輸入
-
GPS定位
-
電量、記憶體、CPU、流量等專項測試
-
呼叫其他app(如支付寶、微信支付等功能)
-
網路切換
web特有的測試場景
-
多瀏覽器登入、退出
-
瀏覽器快取(如cookie清理,表單資料快取)
-
瀏覽器前進、後退
-
瀏覽器相容性
-
瀏覽器最大化、還原、頁面自適應
-
輸入全形、半形
-
js渲染
HTML理論
標籤
<p>段落標籤</p>
</br>回車換行標籤
<em>傾斜強調標籤</em>
<del>刪除線標籤</del>
<img src=" 路徑" alt="圖片不能載入的時候顯示出來的文字">(圖片)
<a href="超連結網址" target="_blank"(開啟新的視窗)> </a>
<form(表格) action="後臺管理" method="post"(加密傳輸) get(不加密傳輸)>
<input type="型別" name="名字" id="編號" placeholder="提示的資訊"/>
</form>
CSS基礎
單選按鈕
<input type="radio" name="xb" id="nan" checked="checked"/> <label for="nan">男</label>
注意 : 新增name屬性實現單選效果
新增label標籤實現選男也可以實現單選效果,前提是for屬性與對應的單選按鈕的id屬性值一致
設定預設選中狀態,要給單選按鈕新增checked="checked"屬性
下拉選單
<select name="">
<optgroup label="鶴山">
<option>沙坪</option>
<option selected="selected">古勞</option>
</optgroup>
</select>
注意:selected="selected"預設選中狀態
文字域
<textarea width='' " height=" " placeholder=""></textarea >
注意不能用cols rows 來設定寬高,要用width,height設定 placeholder設定提醒文字
多選框
<input type="checkbox">
設定與單選框一致
按鈕
<input type="reset">重置按鈕
<input type="sumbit">提交按鈕
設定autofocus="autofocus"設定第一個文字框上,預設選中狀態
CSS基礎語法
放在head標籤之間
<style type="text/css">
標籤選擇器 p{Text-indent:2em;}
id選擇器 #id名
類選擇器 .class名(經常用,可以重用,並且可以可以新增多個樣式)
選擇器的權重 id選擇器 >類選擇器 >標籤選擇器
後代選擇器 Div span
並級選擇器 Div,span
標籤選擇器 div.類名
</style>
<div></div>大容器 (可以在一行顯示)
<span></span>小容器 ( 可以在一行顯示)
CSS的引入方式
內嵌式 電商首頁必須用
外鏈式 使用<link />(標籤) 實現程式碼分離
行內式(權重最高)
內嵌式和外鏈式權重一樣,先寫會被後寫覆蓋
CSS常用屬性
font-weight 設定字型的粗細 normal 代表不加粗 bold代表加粗
font-style 設定字型傾斜 italic 代表傾斜 normal代表不傾斜
text-decoration 設定線 none 沒有線 underline 下劃線 overline 上劃線
line-through 貫穿線 刪除線
world-break:breal-all 強制換行
:hover 代表滑鼠懸停狀態的樣式
line-height 行高
邊框屬性
Border:1px solid(實線) red; dashed(虛線) 四個方向border-left (right top right bottom )只有實線和虛線相容
CSS盒子模型
padding 內邊距 margin 外邊距
html5 新標籤 建議pc端不要用,手機段可以用
header 頭部
nav 導航
aside 側導航
article 文章塊
footer 底部
測試用例設計
開發模式
-
瀑布模式過程:需求分析——設計——編碼——實現——軟體測試——完成——維護優點:各個階段比較清晰,適用於需求比較穩定的產品,強調早期計劃和調查改良:過程中加入少量的迭代過程(重複工作 [例如再一次和產品經理等人確認需求] )
-
快速原型模型過程:快速分析——需求說明——構造原型——原型——執行原型——評價原型——修改意見優點:適合於不確定需求的系統
-
螺旋模型(瀑布模型重複進行)不建議使用
測試模型
-
V模型過程:需求分析-概要設計-詳細設計-編碼-單元測試(單一模組)-整合測試(所有模組)-系統測試(功能,效能,相容)
-驗收測試(α測試(測試人員測 許多bug) β測試(使用者測試)γ gamma測試)優點:底層測試:單元測試 高層測試:系統測試 階段清晰,便於把控
缺點:錯誤不能及時發現 線性關係,返工量大,靈活性低
改良:步驟新增少量的迭代
-
W模型
優點:開發和測試同時進行,趁早找出缺陷 分階段工作,便於專案管理
缺點:線性模型,返工量大,靈活性低 沒有文件,w基本不適用 實現難,對技術人員要求高
-
H模型基本不用
測試分類
隨機測試:以前發現重大bug,新功能,重要功能,特殊情況進行二次測試,結合迴歸測試。
測試方法
等價類劃分(黑盒測試方法)
分為:有效等價類和無效等價類(特殊情況: 中文,英文,特殊字元,空,空格 )
-
等價類的細節
-
輸入長度
-
輸入型別
-
組成規則
-
是否為空
-
是否區分大小寫
-
是否重複
-
是否去除空格
-
-
邊界值方法注意邊界二端的數值
-
因果圖輸入條件相互制約,相互依賴的情況
-
判定表(因果圖而來)組成部分:條件樁(所有條件) 動作樁(所有結果) 條件項(所有條件樁的取值) 動作樁(所有動作樁的取值)
-
場景法(冒煙測試) 流程分析法(需要上面的方法完善)根據業務流程檢測
-
錯誤推斷法根據自己的經驗
正交表、混合正交表、缺陷管理
正交表
使用:1.根據取值和控制元件選擇一個合適的正交表(沒有符合的正交表,選擇同類型正交表,並且優先選擇用例多)
n:代表列數
:代表測試用例所有的情況 m:代表取值 k:代表控制元件
2.列舉取值並進行編號,生成取值表
3.取值表與對應的正交表進行對映
混合正交表工具
適用於因素(控制元件)和水平(取值)不同的場景
1.在excel製作取值表
2.將取值表複製到文字文件(txt),將txt檔案複製到allpairs.exe所在(混合正交工具)資料夾下
3.通過cmd命令,cd命令執行allpairs.exe所在的路徑,輸入 apppairs.exe 剛建的txt檔案>執行結果的txt檔案(不需要自己建)
測試用例方法的選擇
-
要測試功能和流程,使用場景法(冒煙測試)
-
要測試輸入資料,使用等價類方法,加上邊界法
-
要測試條件組合資料,要利用因果圖構造判斷表
-
配置類軟體,組合比較多,使用正交表法
-
測試用例達到覆蓋標準,自己新增用例
-
依靠自己經驗追加測試用例(錯誤推斷法)
軟體缺陷
-
軟體未達到規格說明書表明的功能
-
軟體出現了規格說明書指明不會出現的錯誤
-
軟體功能超出了規格說明書指明的範圍
-
軟體未達到規格說明書雖未指明但應該達到的目標
-
軟體測試人員或使用者覺得不好
缺陷的表現形式
-
功能、特性沒有實現或者部分實現
-
設計不合理,功能不明確,邏輯不清楚或者矛盾
-
實際結果和期望結果不同
-
沒有達到規格說明書的效能標準
-
執行出錯,崩潰,中斷,介面混亂
-
資料不準確,精度不夠,不完整和格式不統一
缺陷的嚴重性Severity
-
blocker:即系統無法執行,崩潰,或嚴重資源不足,應用模組無法啟動或異常退出,無法測試,造成系統不穩定。常見的有嚴重花屏、記憶體洩漏、使用者資料丟失或破壞、系統崩潰/宕機/凍結、模組無法啟動或異常退出、嚴重的數值計算錯誤、功能設計與需求嚴重不符、其它導致無法測試的錯誤, 如伺服器500錯誤
-
critical:即映像系統功能或操作,主要功能存在嚴重缺陷,但不會映像到系統穩定性。常見的有:功能未實現,功能錯誤、系統重新整理錯誤、資料通訊錯誤、輕微的數值計算錯誤、影響功能及介面的錯誤字或拼寫錯誤
-
major:即介面、效能缺陷、相容性,常見的有:操作介面錯誤,邊界條件錯誤,提示資訊錯誤,長時間操作無進度提示,系統未優化,相容性問題
-
minor/trivial:即易用性及建議性問題
缺陷的優先順序Priority
-
immediate:即馬上解決
-
urgent:急需解決
-
high:高度重視,有時間要馬上解決
-
low:在系統釋出前解決,或確認可以不用解決
軟體缺陷的分類
-
系統缺陷
-
資料缺陷
-
資料庫缺陷
-
介面缺陷
-
功能缺陷
-
安全性缺陷
-
相容性缺陷
-
效能缺陷
-
介面缺陷
-
建議
缺陷報告的注意事項
-
缺陷可以重現
-
一個缺陷只寫一個缺陷報告
-
需要寫期望結果
Linux基礎
Linux基礎
/ (根資料夾)分為 root 和 home/
cd命令
cd ~ 回到家資料夾下(home的下一級資料夾)
cd .. 回到上一級資料夾
cd /home/ 從跟資料夾開始 絕對路徑
cd admin-a 相對路徑
cd - 回看功能
pwd 當前資料夾的絕對路徑
ls命令 檢視資料夾的目錄的命令
ls 檢視資料夾的目錄
ls -a 檢視資料夾的所有目錄
ls -l 檢視資料夾的目錄的詳細資訊
ls -lh 檢視資料夾的目錄的詳細資訊(變得更人性化)
ls -l === ||
ll -ha 檢視資料夾的所有目錄的詳細資訊(變得更人性化)
ll *txt 檢視以txt結尾的檔案
mkdir 建立目錄命令
mkdir a b 在當前目錄下建立兩個資料夾
mkdir /home/admin/fung/666 888 -p 在絕對路徑下建立資料夾,即使上一級目錄不存在,也 會先自動建立上一級目錄
mkdir /home/admin/fung/666/{888,168} 在絕對路徑下,建立兩個資料夾
mkdir .688 建立隱藏檔案
rm命令 刪除檔案或資料夾
rm 檔名字 或者隱藏檔案
rm 資料夾名字 -r
rm * -r
touch 建立txt檔案命令
touch 1.txt 在當前目錄下建立
gedit 1.txt 用記事本的方式開啟
許可權的表示
d rwx rwx -x d第一個字母代表資料夾,-代表txt檔案
r 讀的許可權 w 寫的許可權 x 執行的許可權 -x只有執行的許可權
第一個rwx代表使用者的許可權 第二個代表使用者組的許可權 第三個代表其他使用者的許可權
eg:chmod +x install.sh 可執行許可權
chmod +777 install.sh 所有許可權,一步到位
cp 複製檔案命令
cp 原始檔 新檔案 一般txt型別
cp 原始檔 新檔案 -r 檔案件型別
重定向命令
ls >txt檔案 ls命令輸出的結果複製到txt檔案中,會覆蓋之前的資料
ls >>txt檔案 ls命令輸出的結果複製到txt檔案中,不會覆蓋之前的資料
cat 檢視資料夾命令
cat 1.txt 把資料夾的內容顯示在螢幕上
cat 1.txt 2.txt > 3.txt 把1.txt和2.txt的內容複製到3.txt資料夾中,並且檢視資料夾
tail -f 實現實時監控動態更新的txt檔案
more 分頁檢視命令
more 1.txt 空格鍵翻頁,按b鍵回翻,q是退出
| 管道命令
ls la | more 把左邊的命令完成的結果交給右邊的命令處理
Linux技能篇
工作中常用的Linux命令
awk、sed、vim、iotop、dstat、cp、top、ifconfig、pwd、cd、ll、ls、cat、tail、grep、mv、rm、mkdir、df、du
可以幫助Linux執行Windows上傳的指令碼
-
改變編碼格式
-
vim test.sh
-
:set ff?//顯示dos的話
-
:set ff=unix:wq
Linux三劍客
-
grep命令
-
根據使用者指定的模式 pattern 對目標文字進行過濾,顯示被模式匹配到的行;
-
grep [options] pattern [file]
-
常用引數:
-
-v 顯示不被pattern匹配到的行
-
-i 忽略字元的大小寫
-
-n 顯示匹配的行號
-
-c 統計匹配的行數
-
-o 僅顯示匹配到的字串
-
-E 使用ERE,相當於egrep(可以識別更多的正則表示式式規則)
-
-
-
sed命令
-
流編輯器,用來處理一行資料。將一行資料儲存在模式空間中——>用sed命令處理——>送入螢幕——>清空空間
-
常用引數
-
-h 顯示幫助
-
-n 僅顯示script處理後的結果
-
-e 指定的指令碼來處理輸入的文字檔案
-
-f 以指定的指令碼檔案來處理
-
-
常用動作:
-
a: 新增 sed -e '4 a newline'
-
c: 取代 sed -e '2,5c No 2-5 number'
-
d: 刪除 sed -e '2,5d'
-
i: 插入 sed -ed '2i newline'
-
p: 列印 sed -n '/root/p'
-
s: 取代 sed -e 's/old/new/g'
-
g: 代表全域性
-
-
-
awk命令
-
把檔案逐行的讀入,以空格為預設分隔符將每行切片。把行作為輸入,並賦值給0——>將行切段,從1開始——>對行匹配正則/執行行動作——>列印內容
-
awk 'pattern + action' [filenames]
-
常用語法:
-
filename awk 瀏覽的檔名
-
begin 處理文字前要執行的操作
-
end 處理文字之後要執行的操作
-
fs 設定輸入域分隔符,等價於命令列-F選項
-
nf 瀏覽記錄的域的個數(列數)
-
nr 已讀的記錄數(行數)
-
-
常用引數:
-
ofs 輸出域分隔符
-
ors 輸出記錄分隔符
-
rs 控制記錄分隔符,換行標誌
-
$0 整條記錄
-
$1 第一條分隔後的記錄
-
-
定位Linux伺服器下的日誌的命令
-
如果要監控日誌,那麼使用 tail -f |grep XXX 命令,過濾需要的欄位
-
如果在完整日誌中檢視內容,使用 cat XXX.log | grep XXXXX | awk '{print $1}' 等命令過濾自己需要的內容;
簡述專案中的環境搭建和維護
-
結合自身經驗先從系統安裝開始,如常用的 CentOS 和 Ubuntu 說起,系統安裝主要是磁碟分割槽和磁碟陣列問題;
-
基礎環境依賴,如 MySQL、Redis、Jenkins、Docker、專案中用到的其他依賴環境等;
-
維護方便主要從遇到的錯誤說起,如無法遠端連線、伺服器加固等;
資料庫基礎
查詢語句
select * (欄位名) from 表名
刪除語句
deleect from 表名
更新語句
update 表名 set 欄位名=?
增加資料語句
insert into 表名 values(),()... 可以插入多個值
insert into 表名(欄位名) values (),()... 可以插入多個值
模糊查詢(like)
% (任意字元)_(一個字元) 例子: select * from student where name like '王%' 查詢姓王的所有人的資訊 select * from student where name like '王_' 查詢姓王卻只有一個字
範圍查詢(in)
in 例子 :select * from student where hometown in('北京','廣州','上海') (查詢家鄉 是北京或者是廣州或者是上海的學生的資訊) select * from student where age between 18 and 20 (查詢年齡18-20的學生的信 息) select * from student where card is not null (查詢card填寫了的學生的資訊) select *from student where card='' (查詢card沒有填寫的學生的資訊)
排序查詢(預設升序asc)
例子:select * from student order by age asc,student_NO desc(按照age的升序,student_NO 的降序查詢學生的資訊)
聚合函式
select max(age),min(age),sum(age), avg(age),count(age)(統計總數的功能) from student
分組排序
select sex count(*) from student group by sex having sex='男' (按照sex分組,having是篩選,篩選男的)
分頁查詢
select * from student limit 0,3 (從第零條開始,查詢三天資料) distinct 過濾掉重複的資料 primary key 主鍵 auto_increment 自增 unsigned (沒有定義)理解為沒有負數的定義 tinyint 一個字 節 int 四個位元組 不用限制位數,因為已經有取值範圍 decimal (5,2) 五位數,有二位是小數
資料庫基礎知識
多表查詢(可以用where進行連線)
內連線(多表的交集查詢) 語法:(連結左表)inner join(連結右表) on條件(對應的表一樣的欄位) 左連結 (不改變左表內容,對相應的表進行配對) 語法:(連結左表)left join(連結右表) on條件(對應的表一樣的欄位) 右連結 (不改變右表內容,對相應的表進行配對) 語法:(連結左表)right join(連結右表) on條件(對應的表一樣的欄位)
關鍵字查詢
any some all
自關聯(等於多表查詢)
注意需要修改表的名字
儲存過程
delimiter // 定義用上面執行語句 create procedure 儲存過程的名稱 begin sql語句 end // delimiter ; call 儲存過程名稱(調出語句)
檢視
create view 檢視名 as select語句
事務
begine; 執行語句 緩衝區 commit; rollback; (回滾最開始)
索引
create index 索引名稱 on 表名(欄位名稱(欄位長度注意欄位長度要與原欄位的長度保持一致
檢視日誌檔案
show variables like 'general%' 開啟日誌檔案 set global general_log=1(開啟) 等於0是關閉狀態 Linux 動態檢視日誌檔案 例如:網頁操作的時候動態顯示資料庫的執行情況 tail -f 日誌檔名稱
什麼時候用到資料庫
-
對於一些重要的資料(金額),看有沒有寫進資料庫裡
-
對於一些資料修改它們的狀態,方便測試
什麼時候用到Linux
-
檢視日誌 tail -f 日誌檔案
-
埋點測試(對於按鈕使用的次數,分析使用者的喜愛)
什麼時候用到fiddler
-
看重要的資料有沒有加密
-
進行斷點的時候,修改資料,看資料能否正常的執行(例如:電商專案,把價格傳送到伺服器的時候進行斷點,修改價格,能否正常傳輸)(例如:電商專案,伺服器把價格傳送到前端的時候進行斷點,修改價格,能否正常傳輸)
區分是前端還是後端的bug
-
可以通過抓包分析,設定斷點,看傳送的資料或者資訊,返回的資料或者資訊來判斷是前端還是後端的bug
MySQL常用命令大全
命令列指令
1.啟動MySQL net start mysql 2.連線與斷開伺服器 mysql -h 地址 -p 埠 -u 使用者名稱 -p 密碼
資料庫操作
1.檢視當前資料庫 select database; 2.顯示當前時間,使用者名稱,資料庫版本 select now(),user(),version(); 3.建立庫 creat database [if not exists] 資料庫名 資料庫選項 其中資料庫選項: CHARACTER SET charset_name COLLATE collation_name 4.檢視已有庫 show databases; 5.檢視當前庫資訊 show create database 資料庫名 6.修改資料庫選項資訊 alter databases 庫名 選項資訊 7.刪除庫 drop database [if exists] 資料庫名
表操作
1.建立表 create [temporary] table [if not exists] [庫名.]表名 (表結構定義)[表選項] 1).每個欄位必須有資料型別,最後一個欄位後不能有逗號 2).temporary表示臨時表,會話結束時表自動消失 3).對於欄位的定義如下: 欄位名 資料型別 [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [UNIQUE [KEY] |[PRIMARY] KEY] [COMMENT ‘string’] 4).表選項 a.字符集 CHARSET = charset_name 如果表沒有設定,則使用資料庫字符集 b.儲存引擎 ENGINE = engine_name
資料庫篇
工作中常用的SQL語法
-
create table
-
create view
-
select from where
-
insert into
-
update set values
-
delete
-
alter
-
order by
-
having
資料庫儲存過程
-
一組資料庫操作命令,當作是自己寫的一個方法,一系列步驟自己去封裝
SQL常見查詢語句編寫
-
查詢所有學生的數學成績,顯示學生姓名name,分數,由高到低
SELECT a.name,b.score FROM student a,grade b WHERE a.id = b.id AND kemu = '數學' ORDER BY score DESC;
-
統計每個學生的總成績(由於學生可能有重複名字),顯示欄位:學生id、姓名、總成績
SELECT a.id,a.name,c.sum_score from student a,(SELECT b.id,sum(b.score) as sum_score FROM grade b GROUP BY id) c WHERE a.id = c.id ORDER BY sum_score DESC;
-
列出各門課程成績最好的學生,要求顯示欄位:學號,姓名,科目,成績
SELECT c.id,a.name,c.kemu,c.score FROM grade c,student a,(SELECT b.kemu,MAX(b.score) as max_score FROM grade b GROUP BY kemu) t WHERE c.kemu = t.kemu AND c.score = t.max_score AND a.id = c.id;
計算機網路篇
輸入URL到網頁顯示出來的全過程
-
輸入網址
-
DNS解析
-
建立TCP連結
-
客戶端傳送HTTP請求
-
伺服器處理請求
-
伺服器響應請求
-
瀏覽器展示HTML
-
瀏覽器傳送請求獲取其他在HTML中的資源
HTTP和HTTPS的區別
-
HTTPS裡面是有證書的,HTTP並沒有證書。證書的作用就是證明你是這個網站的擁有者。誰去證明?最頂級的CA去幫你證明,這些頂級的CA都是瀏覽器、作業系統本身就自動幫你整合,而且自動新增到設定信任裡面去;
-
HTTPS要兼顧安全+效能的方面,由於對稱式加密雖然速度很快,但是安全性特別低,因為雙方要規定對稱式加密的鑰匙,別人都無法知道,但你怎麼能確保別人不知道你的金鑰呢,因此需要有非對稱式加密去保證安全,但非對稱式加密速度又很慢,如果客戶端和伺服器端都用非對稱式加密,網路得卡死了。所以當雙方建立好了非對稱式加密後,子啊約定一個隨機數,等大家都非對稱解密之後呢,就能拿到只有對方知道的唯一隨機數(金鑰),就可以用金鑰來進行對稱式加密和解密了
HTTP的報文結構
-
HTTP請求報文:一個HTTP請求報文由請求行、請求頭部、空行和請求資料4個部分組成
-
HTTP響應報文:HTTP響應由三個部分組成,分別是:狀態行、訊息報頭、響應正文
HTTP常見的響應狀態碼
-
200 請求以成功,請求所希望的響應頭活資料體將隨此響應返回
-
201 請求已經被實現,而且有一個新的資源已經依據請求的需要而建立,且其URI已經隨Location頭資訊返回
-
202 伺服器已經接受請求,但尚未處理
-
301 (永久移動)請求的網頁已永久移動到新位置。伺服器返回此響應(對GET或HEAD請求的響應)時,會自動將請求者轉到新位置
-
302 (臨時移動) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求
-
303 (檢視其他位置)請求者應當對不同的位置使用單獨的GET請求來檢索響應時,伺服器返回此程式碼
-
304 (未修改)自從上次請求後,請求的網頁為修改過。伺服器返回次響應時,不會返回網頁內容。
-
305 (使用代理)請求者智慧使用代理訪問請求的網頁。如果伺服器返回此響應,還表示請求者應使用代理
-
307 (臨時重定向)伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求
-
401 當前請求需要使用者驗證。如果當前請求已經包了Authorization證書,那麼401響應代表著伺服器驗證已經拒絕了那些證書
-
403 伺服器已經理解請求,但是拒絕執行它。與401響應不同的是,身份驗證並不能提供任何幫助,而且這個請求也不應該被重複提交
-
404 請求失敗,請求所希望得到的資源未被在伺服器上發現
-
500 伺服器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在伺服器的程式碼出錯時出現
-
501 伺服器不支援當前請求所需要的某個功能。當伺服器無法識別請求的方法,並且無法支援其對任何資源的請求
-
502 作為閘道器或者代理工作的伺服器長是執行請求時,從上游伺服器接到無效的響應
-
503 由於臨時的伺服器維護或者過載,伺服器當前無法處理請求。這個狀況只是臨時的,並且將在一段時間以後恢復
cookie和session機制的區別
-
cookie資料儲存在客戶端,session資料儲存在伺服器端
-
cookie可以減輕伺服器壓力,但是不安全,容易進行cookie欺騙
-
session較安全,但佔用伺服器資源
TCP和UDP的區別
-
TCP:面向連線,可靠的,速度慢,效率低
-
UDP:無連線、不可靠、速度快、效率高
TCP為什麼是三次握手和四次揮手
-
三次握手能保證資料可靠傳輸又能提高傳輸效率。若握手是兩次:如果只是兩次握手,至多隻有連線發起的其實序列號能被確認,另一方選擇的序列號則得不到確認;
-
要保證雙方都關閉了連線。因為TCP是全雙工的,就是要等到兩邊都發送fin包確認雙方都沒有資料傳輸後菜關閉;
TCP為什麼最後揮手後會有time_wait
-
為了保證可靠的斷開TCP的雙向連線,確保足夠的時間讓對方收到ACK包。若客戶端回覆的ACK丟失,server會在超時時間到來時,重傳最後一個fin包,處於TIME_WAIT狀態的client可以繼續回覆fin包,傳送ACK。
-
保證讓遲來的TCP報文段有足夠的時間被識別和丟失,避免新舊連線混淆。有些路由器會快取沒有收到的資料包,如果新的連線開啟,這些資料包可能就會和新的連線中的資料包混在一起。連線結束了,網路中的延遲報文也應該被丟棄掉,以免影響立刻建立的新連線。
簡要說明HTTP請求中的Post和Get有哪些區別
-
請求頭多了content—length和content—type欄位
-
Post 可以附加body,可以支援form、json、xml、binary等各種資料格式
-
行業通用規範
-
無狀態變化的建議使用 Get
-
資料的寫入與狀態的修改建議使用 Post
-
基於HTTP協議:都是請求返回資料,Get將請求體放在頭上,只發一次請求,Post將請求體放在內部,需要傳送兩次請求
-
GET 在瀏覽器回退時是無害的,而 POST會再次提交請求
-
GET請求會被瀏覽器主動cache,而POST不會,除非手動設定
-
GET請求只能進行URL編碼,而POST支援多種編碼方式
-
GET請求在URL中傳送的引數是有長度限制的(2048字元 IE瀏覽器 2083字元),而POST沒有
-
對引數的資料型別,GET只接受ASCII字元,而POST沒有限制
-
GET比POST更不安全,因為引數直接暴漏在URL上,所以不能用來傳遞敏感資訊
如果一個請求,返回的狀態碼是200,但是沒有內容,可能發生了什麼?
-
請求頭缺失或錯誤
-
引數length不符
Python 程式設計篇
python中類方法、類例項方法、靜態方法的區別
-
例項方法:由物件呼叫;至少一個self引數;執行普通方法時,自動將呼叫該方法的物件賦值給self;
-
類方法:由類呼叫;至少一個cls引數;執行類方法時,自動將呼叫改方法的類複製給cls;
-
靜態方法:由類呼叫;無預設引數;
dict 和tuple 及 list 的區別(這裡列的時主要區別)
-
tuple是不可變物件,list 和 dict 都是可變物件,這裡的不可變指的是指向地址不可變;
-
list 是有序的,dict 是無序的,不可存放有序集合;
-
dict 查詢速度快,不管有多少個元素時間都一樣,list 查詢速度慢,需要有序查詢;
-
dict 的key 為不可變物件,且不可重複,list 則可以重複,存放任意物件
JSON 和 dict的區別
-
JSON 是一種資料格式,純字串。dict 是一種完整的資料結構;
-
dict 是一個完整的資料結構,是對Hash Table這一資料結構的一種實現,是一套從儲存到提取都封裝好了的方案。它使用內建的雜湊函式來規劃key對應value的儲存位置,從而獲得O(1)的資料讀取速度;
-
JSON的 key 只能是字串,python的 dict 可以是任何可hash物件(不可變物件);
-
JSON的 key 可以是有序、可重複的;dict 的 key 不可重複,且無序;
-
JSON任意 key 存在預設值 ndefined,dict 認沒有預設值;
-
JSON訪問方式可以是 [],也可以是 . ,遍歷方式分 in、of ;dict的value僅可以下標訪問;
-
dict 可以巢狀 tuple, JSON裡只有陣列;
python 會不會出現記憶體洩漏
-
當物件之間互相引用的時候在刪除的時候,可能會造成無法釋放物件的情況,出現洩露;
python的同步和非同步
-
直接得到最終結果的結果,就是同步呼叫
-
不直接得到的最終的結果,就是非同步呼叫
-
同步與非同步區別在於:呼叫者是否得到了想要的最終結果
常用手撕程式碼題
-
兩個列表提取作為字典
dict(zip(list1,list2))
-
字串反轉輸出
str = '123456'print(str[::-1])
l = list(str)l.reverse()print('',join(l))
-
實現斐波那契數列
def Fibonacci(loop): if loop == 0: return '無效引數' elif loop == 1: return 0 l = [0,1] for i in range(2,loop): l.append(l[i-1] + l[i-2]) return 1
-
找出駝峰陣列的最大值
li = [1,2,10,10,2,1]print([v for v in li if v == max(li)])
-
水仙花數
sxh = []for i in range(100,1000): s = 0 for j in str(i): s += int(j)**3 if i == int(j)**3: sxh.append(i)print(sxh)
-
完全數
a = []for i in range(1,1000): s = 0 for j in range(1,i): if i % j == 0 and j < i: s += j if s == i: a.append(i)
-
冪的遞迴
def mi(a,n): if n == 0: return 1 else: return a * mi(a,n-1)
-
目錄遍歷
import os
def get_file(path,rule=''): files = [] for fpath,dirs,fs in os.walk(path): for f in fs: if os.path.join(fpath,f).endswith(rule): files.append(f) return files
自動化測試
自動化程式碼中,用到的設計模式
-
單例模式
-
工廠模式
-
PO模式
-
資料驅動模式
斷言
-
檢查一個條件,如果它為真,就不做任何事,用例通過。如果它為假,則會丟擲AssertError並且包含錯誤資訊。
UI自動化測試中,設定叢集
-
Selenium Grid ,分散式執行用例
-
Appium 使用STF管理多裝置
-
Docker+K8S 管理叢集
對含有驗證碼的功能進行自動化測試
-
萬能驗證碼
-
測試環境遮蔽驗證
-
其他操作不推薦
優化和提高 Selenium指令碼的執行速度
-
儘量使用 by_css_selector() 方法
-
by_css_selector() 方法的執行速度比 by_id() 方法的更快,因為原始碼中 by_id() 方法會被自動化轉成 by_css_selector() 方法處理;
-
使用等待時,儘量使用顯示等待,少用 sleep() , 儘量不用隱式等待;
-
儘量減少不必要的操作:可以直接訪問頁面的,不要通過點選操作訪問;
-
併發執行測試用例:同時執行多條測試用例,降低用例間的耦合;
-
有些頁面載入時間長,可以中斷載入;
介面測試能發現的問題
-
可以發現很多在頁面上操作發現不了的bug;
-
檢查系統的異常處理能力;
-
檢查系統的安全性、穩定性;
-
前端隨便變,介面測好了,後端不用變;
-
可以測試併發情況,一個賬號,同時(大於2個請求)對最後一個商品下單,或不同賬號,對最後一個商品下單;
-
可以修改請求引數,突破前端頁面輸入限制(如金額);
Selenium中隱藏元素的定位
-
如果單純的定位的話,隱藏元素和普通不隱藏元素定位沒啥區別,用正常定位方法就行了
-
元素的屬性隱藏和顯示,主要是 type = 'hidden' 和 style = 'display:none;' 屬性來控制的,接下來在元素裡面讓它隱藏,隱藏元素可以正常定位到,只是不能操作(定位元素和操作元素是兩碼事),操作元素是 click,clear,send_keys 這些方法 ;
-
JS操作隱藏元素;
判斷一個頁面上元素是否存在
-
方法一:用 try......except......
-
方法二:用 elements 定義一組元素方法,判斷元素是否存在,存在返回 True,不存在返回 False
-
方法三:結合 WebDricerWait 和 expected_conditiions 判斷(推薦)
提高指令碼的穩定性
-
不要右鍵複製 xpath(不穩定),自己寫相對路徑,多用id為節點查詢;
-
定位沒問題,第二個影響因素那就是等待了,sleep等待儘量少用(影響執行時間);
-
定位元素方法重新封裝,結合 WebDriverWait 和 expected_conditions 判斷元素方法,自己封裝一套定位元素方法;
定位動態元素
-
動態元素有2種情況,一個是屬性動態,比如 id 是動態的,定位時,那就不要用 id 定位就是了;
-
還有一種情況動態的,那就是這個元素一會在頁面上方,一會在下方,飄忽不定的動態元素,定位方法也是一樣,按F12,根據元素屬性定位(元素的tag、name的步伐屬性是不會變的,動的只是class屬性和styles屬性);
通過子元素定位父元素
-
使用element.parent方法
平常遇到的問題,解決方法
-
可以把平常遇到的元素定位的一些坑說下,然後說下為什麼沒定位到,比如動態id,有iframe、沒加等待等因素
一個元素明明定位到了,點選無效(也沒報錯),解決方法
-
使用 JS 點選,Selenium有時候點元素是會失效
測試資料存放位置
-
對於賬號密碼,這種管全域性的引數,可以用命令列引數,單獨抽出來,寫在配置檔案裡(如 ini);
-
對於一些一次性消耗的資料,比如註冊,每次註冊不一樣的數,可以用隨機函式生成;
-
對於一個介面有多組測試的引數,可以引數化,資料放YAML、Text、JSON、Excel都可以;
-
對於可以反覆使用的資料,比如訂單的各種狀態需要造資料的情況,可以放到資料庫,每次資料初始化,用完後在清理;
-
對於郵箱配置的一些引數,可以用 ini 配置檔案;
-
對於全部是獨立的介面專案,可以用資料驅動方式,用 excel / csv 管理測試的介面資料;
-
對於少量的靜態資料,比如一個介面的測試資料,也就2—3 組,可以寫到py指令碼的開頭,十年八年都不會變更的;
資料驅動,實現引數化
-
引數化的思想是程式碼用例寫好了後,不需要改程式碼,只需維護測試資料就可以了,並且根據不同的測試資料生成多個用例;
其他介面都需要登入介面的資訊,怎麼去讓這個登入的介面只在其他介面呼叫一次
-
使用單例模式
-
使用自定義快取機制
-
使用測試框架中的 setup 機制
-
pytest 中 fixture 機制
介面產生的垃圾資料如何清理
-
造資料和資料清理,需用python連資料庫,做增刪改查的操作測試用例其那隻條件,setup 做資料準備後置操作,tearDown做資料清理。
用介面案例去覆蓋業務邏輯
-
考慮不同的業務場景,一個介面走過的流程是什麼樣的,流程的邏輯是什麼樣的,什麼樣的引數會有什麼樣的結果,多場景覆蓋;
效能
效能測試指標包括:
-
最大併發使用者數,HPS(點選率)、事務響應時間、每秒事務數、每秒點選量、吞吐量、CPU使用率、實體記憶體使用、網路流量使用等
-
前端需主要關注的點:
-
響應時間:使用者從客戶端發出請求,並得到響應,以及展示出來的整個過程的時間
-
載入速度:通俗的理解為頁面內容顯示的快慢
-
流量:所消耗的網路流量
-
-
後端需主要關注的點:
-
響應時間:介面從請求到響應、返回的時間
-
併發使用者數:同一時間點請求伺服器的使用者數,支援的最大併發數
-
記憶體佔用L也就是記憶體開銷
-
吞吐量(TPS):Transaction Per Second,每秒事務數。在沒有遇到效能瓶頸時:TPS=併發使用者數*事務數/響應時間
-
錯誤率:失敗的事務數/事務總數
-
資源使用率:CPU佔用率、記憶體使用率、磁碟I/O、網路I/O
-
從效能測試分析度量的角度來看,主要可以從如下幾個大的維度來收集考察效能指標:
-
系統性能指標
-
資源效能指標
-
穩定新指標
-
-
如果一個需求沒有明確的效能指標,要如何開始進行效能測試
-
先輸出業務資料,如 pv 、pu、時間段等,計算出大概的值,然後不斷加壓測到峰值
JMeter 聚合報告內容包括:
-
請求名、執行緒數、響應時間(50 95 99 最小 最大)、錯誤率、吞吐量
如果有一個頁面特別卡頓,設想一下可能的原因
-
後臺:介面返回資料慢,查詢效能等各種問題
-
前端:使用Chorme工具除錯,判斷 JS 執行久或是其他問題
-
網路問題
JMeter 和 LoadRunner 的區別
-
相對來說LoadRunner的笨重、昂貴、閉源、理念和生態都落後,而 JMeter 是開源的、可定製化開發、功能強大易用,並且子啊網際網路大廠都已經有非常成熟的落地方案(主流的網際網路公司基本都在使用 JMeter + ELK + Grafana + Influxdb 這套架構)
反問面試官
職責
-
團隊中初級和高階人員如何平衡
-
針對員工有哪些培訓和提升計劃
技術
-
公司內部的技術棧
-
產品的架構
-
版本控制及迭代
-
伺服器管理許可權,本地計算機管理許可權
團隊
-
團隊和團隊之間如何溝通
-
遇到了分歧如何解決
-
團隊正在經歷的尚未解決的挑戰是什麼
-
績效考核是如何算的
公司
-
晉升機會
-
是否有自己的學習資源
-
假期、加班工資等
測試開發
tdp和udp都是哪一層的,有什麼應用場景ftp、dns分別用的是哪個?
-
傳輸層,ftp用tcp,dns用tcp和udp,區域傳輸用udp,當區域內的輔助dns伺服器向主dns伺服器請求資料進行更新時就是區域傳輸
和equal區別
-
判斷地址是否相同,equal判斷地址指向的記憶體空間中的值是否相同
深拷貝和淺拷貝
-
淺拷貝值增加一個新指標,指向已有的記憶體空間;
-
深拷貝增加新指標並申請新的記憶體空間
session和cookie
-
會話(Session)跟蹤時web程式中常用的技術,用來跟蹤使用者的整個會話。常用的會話跟蹤技術時Cookie與Session。
-
Cookie通過在客戶端記錄資訊確定使用者身份
-
Session通過服務端記錄資訊確定使用者身份
-
cookie不屬於HTTP協議範圍,由於HTTP協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。
-
cookie的工作原理:由伺服器產生內容,瀏覽器收到請求後儲存在本地;當瀏覽器再次訪問時,瀏覽器自動帶上cookie,這樣伺服器就能通過cookie的內容來判斷這個是“誰”了。
-
cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支援4096位元組,以及cookie本身儲存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支援更多的位元組,並且他儲存在伺服器,有較高的安全性。這就是session。問題來了,基於http協議的無狀態特徵,伺服器根本就不知道訪問者是“誰”。那麼上述的cookie就起到橋接的作用。
我們可以給每個客戶端的cookie分配一個唯一的id,這樣使用者在訪問時,通過cookie,伺服器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在伺服器上儲存一段時間的私密資料,如“賬號密碼”等等。
-
總結而言:cookie彌補了http無狀態的不足,讓伺服器知道來的人是“誰”;但是cookie以文字的形式儲存在本地,自身安全性較差;所以我們就通過cookie識別不同的使用者,對應的在session裡儲存私密的資訊以及超過4096位元組的文字。
程序與執行緒,執行緒由哪幾種模式?
三種模式:
-
繼承thread
-
實現runnable介面,實現Callable介面通過FutureTask包裝其來建立Thread執行緒
-
使用ExecutorService、Callable、Future實現由返回結果的執行緒
----- 繼承Thread類建立執行緒 ----
1】d定義Thread類的子類,並重寫該類的run()方法,該方法的方法體就是執行緒需要完成的任務,run()方法也稱為執行緒執行體。 2】建立Thread子類的例項,也就是建立了執行緒物件 3】啟動執行緒,即呼叫執行緒的start()方法
----- 實現Runnable介面建立執行緒 ----- 1】定義Runnable介面的實現類,一樣要重寫run()方法,這個run()方法和Thread中的run()方法一樣是執行緒的執行體 2】建立Runnable實現類的例項,並用這個例項作為Thread的target來建立Thread物件,這個Thread物件才是真正的執行緒物件 3】第三部依然是通過呼叫執行緒物件的start()方法來啟動執行緒
----- 使用Callable和Future建立執行緒 ----- 1】建立Callable介面的實現類,並實現call()方法,然後建立該實現類的例項(從java8開始可以直接使用Lambda表示式建立Callable物件)。 2】使用FutureTask類來包裝Callable物件,該FutureTask物件封裝了Callable物件的call()方法的返回值 3】使用FutureTask物件作為Thread物件的target建立並啟動執行緒(因為FutureTask實現了Runnable介面) 4】呼叫FutureTask物件的get()方法來獲得子執行緒執行結束後的返回值
寫sql,所有課程成績大於80分的學生名字
1 distinct:去重 select distinct name from table 2 where:語法:SELECT 列表名 FROM 表名稱 WHERE 列 運算子 值 select name from table where grade > 80 3 order by:SELECT Company,OrderNumber FROM Orders ORDER BY Company,OrderNumber
先順序排序company,然後在同樣的company之間順序排序ordernumber以逆字母順序顯示公司名稱,並以數字順序顯示順序號:
1 SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC 2 group by:SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
having和where的區別
聚簇索引和非聚簇索引
-
聚簇索引:將資料儲存與索引放到了一塊,找到索引也就找到了資料;
-
非聚簇索引:見資料儲存於索引分開結構,索引結構的葉子節點指向了資料的對應行,myisam通過key_buffer把索引先快取到記憶體中,當需要訪問資料時(通過索引訪問資料),在記憶體中直接搜尋索引,然後通過索引找到磁碟相應資料,這也就是為什麼索引不在key buffer命中時,速度慢的原因。
主鍵和唯一鍵
-
當一個屬性宣告為主鍵時,它將不接受NULL值。另一方面,當宣告為Unique額屬性時,它可以接受一個NULL值;
-
表中只能由一個主鍵,但可以有多個唯一鍵;
-
定義主鍵時自動建立聚簇索引。相反,Unique鍵生成非聚簇索引
http 與 https 區別
-
https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用
-
http時超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議
-
http和https使用的時完全不同的連線方式,用的埠也不一樣,前者是80,後者是443
-
http的連線很簡單,是無狀態的;https協議是由SSL+HTTP構建的可進行加密傳輸、身份認證的網路協議,比http協議安全
tcp/ip 三次握手
-
含義理解:TCP/IP協議不僅僅指的是TCP和IP兩個協議,而是指一個由FTP、SMTP、TCP、UDP、IP等協議構成的協議簇,只是因為在TCP/IP協議中TCP協議和IP協議最具代表性,所以被稱為TCP/IP協議
-
三次握手
-
客戶端傳送一個帶SYN標誌的TCP報文到server。這是三次握手過程中的報文1
-
server端迴應client的,這是三次握手中的第2個報文。這個報文同一時間帶ACK和SYN標誌。因此它表示對剛才clientSYN報文的迴應。同一時間又標誌SYN給client,詢問client是否準備好進行資料通訊
-
客戶必須再次迴應服務端一個ACK報文,這是第3個報文
-
連線終止協議(四次握手)
-
樂觀鎖和悲觀鎖
-
悲觀鎖:悲觀鎖原理是每次獲取資料的時候,都會擔心自己資料被修改,所以每次獲取資料的時候都會進行加鎖,確保在自己使用的過程中資料不會被別人修改,使用完成後再進行資料解鎖。由於資料進行加鎖,期間對該資料進行讀寫的其他執行緒都會進行等待。在Java中,synchronized的思想也是悲觀鎖。(如:同一個資料庫表A使用者在操作時B使用者不能進行操作)適合寫入較頻繁場景,如出現大量的讀取操作,每次讀取都會進行加鎖,這樣會增加大量的鎖的開銷,降低了系統的吞吐量。
-
樂觀鎖:適合讀取操作比較頻繁的場景,如果出現大量的寫入操作,資料發生衝突的可能性就會增大,為了保證資料的一致性,應用層需要不斷的重新獲取資料,這樣會增加大量的查詢操作,降低了系統的吞吐量。 (如:A使用者操作一個表,B使用者同時操作這個表,樂觀鎖認為不會衝突,但實際會造成衝突)
左連線、右連線和全連線
-
左連線:左邊有的,右邊沒有的為null
-
右連線:左邊沒有的,右邊有的為null
-
內連線:顯示左邊右邊共有的
資料庫中 sum 和 count 的區別及使用
-
count:統計查詢出來的資料記錄條數 select count(*) from 學生表;
-
sum:求和 select sum(garde成績) from 學生表 where name="zhangsan"
JMeter跟蹤重定向和自動重定向的區別
-
跟蹤重定向通俗的理解就是跟蹤請求執行的過程,並記錄一些資訊給開發者看到,我們一般可以在結果日誌和監控中看到
-
自動重定向是不用跟蹤請求執行過程,也不用記錄
自動化測試selenium顯示等待和隱式等待
顯示等待就是有條件的等待
隱式等待就是無條件的等待
-
顯示等待:設定等待時間WebDriverWait(driver,3,0.5)傳入三個引數第一個是瀏覽器驅動第二個是等待多少秒第三個是每隔多少秒監控一次原理指定一個等待條件和一個最長等待時間,程式回判斷在等待時間內條件是否滿足,如果滿足則返回,如果不滿足會繼續等待,超過時間就會丟擲異常
-
隱式等待browser.implicitly_wait(10)直接等待10秒鐘當查詢元素或元素並沒有立即出現的時候,隱式等待將等待一段時間在查詢DOM,預設的時間是 0
pytest如何管理測試用例
-
掌握案例規則,如以test_開頭,類以Test命名等
-
案例檔案執行單個py如何執行,多個資料夾的管理方式
軟體測試通過的標準
-
ISO90001—ISO90004標準
-
通過案例執行完成,bug驗收通過,完成功能測試,整合測試
Linux如何實現凌晨定時執行指令碼
Linux中,週期執行得任務一般由cron這個守護程序來處理。cron讀取一個或多個配置檔案,這些配置檔案中包含了命令列及其呼叫時間。cron得配置檔案稱為“crontab”,是“cron table”得簡寫。
java如何實現多執行緒?執行緒得狀態有哪些?
Java實現多執行緒得兩種方法:
-
繼承Thread類
-
實現Runnable介面
這兩種方法的共同點:
不論用哪種方法,都必須用Thread(如果是Thread子類就用它本身)產生執行緒,然後在呼叫start()方法
兩種方法得不同點:
-
繼承Thread類有一個缺點就是單繼承,而實現Runnable介面則彌補了它得缺點,可以實現多繼承
-
繼承Thread類如果產生Runnable例項物件,就必須產生多個Runnable例項物件,然後再用Thread產生多個執行緒;而實現Runnable介面,只需要建立一個實現這個類的例項,然後用這一個例項物件產生多個執行緒。即實現了資源的共享性。
執行緒共有6種狀態:
NEW 、RUNNABLE 、BLOCKED、 WAITING 、TIMED_WAITING 、TERMINATED
分別對應:
新建、執行、阻塞、等待、帶超時的等待、終止
查詢資料庫比較慢可能的原因:
-
沒有索引或者沒有用到索引(這是查詢慢最常見的問題,是程式設計的缺陷)
-
I/O吞吐量小,形成了瓶頸效應
-
沒有建立計算列導致查詢不優化
-
記憶體不足
-
網路速度慢
-
查詢出的資料量過大(可以採用多次查詢,其他的方法降低資料量)
-
鎖或者死鎖(這也是查詢慢最常見的問題,是程式設計的缺陷)
-
sp_lock,sp_who,活動的使用者檢視,原因是讀寫競爭資源
-
返回了不必要的行和列
-
查詢語句不好,沒有優化
get 和 post 的區別
1、post用於修改,get是用於資源的獲取,讀取資料
-
其實這個是最根本的區別,也是http定義get和post的基本,但是並不是絕對的,不少公司也會用post獲取資料,get提交資料,都是可行的;
2、post傳送的資料更大,get有長度限制
-
其實這裡有個誤區,會覺得get的URL會有長度限制,有的人回說是1024位元組,其實是不對的,http協議從未規定get/post的請求長度限制是多少,限制URL長度的通常是瀏覽器或者是web伺服器,而且每個瀏覽器的限制長度都不相同;
-
post請求也不是完全沒有限制,也是需要依賴於web伺服器或者是依賴的服務,比如Tomcat預設限制大小就是2M,當然可以取消這個限制,只要你對你的網路傳輸有著足夠的信心。
3、get的引數通常方式URL上,post的引數通常方式body裡
-
當然這個是常規做法,post的引數要放URL上,也是可以的,只是看服務端想怎麼取了。
4、get比post更快
-
post請求包含更多的請求頭,因為post需要在請求的body部分包含資料,所以會多了幾個資料描述部分的首部欄位(如:content-type),但這個是微乎其微的
-
post在真正接收資料之前會先將請求頭髮送給伺服器進行確認,然後才真正傳送資料。這個就需要對TCP有一定了解,說的簡單的,post會有一次伺服器返回100 Continue響應
-
get可以將資料快取起來,而post不會
-
post不能進行管道化傳輸
post 比 get 更加安全
-
post 資料不會快取,也不會儲存在伺服器日誌以及瀏覽器記錄中
-
post 能傳送更多的資料型別和各種編碼或者進行非對稱加密,而get只能傳送ASCII字元
-
post 不能進行管道化傳輸以及post在真正接收資料之前會先將請求頭髮送給伺服器進行確認
HTTP協議
-
HTTP協議是一種無狀態協議。然而當用戶訪問伺服器資源時,都需要判斷你是誰,你有沒有操作許可權,這就需要一種會話狀態維護機制,這時就設計了一套cookie、session、token用於狀態維護。
cookie
場景:會話狀態由客戶端維護
-
例如你的身份資訊(例如:賬號和密碼)存在客戶端,每次請求時一併傳送至伺服器;根據你的身份返回響應資訊。
步驟:
-
1、客戶端發起訪問請求
-
2、伺服器生成cookie,併發送給客戶端
-
3、瀏覽器儲存返回的cookie資料
-
4、下面每次請求,瀏覽器都會將cookie資料連同請求一併發向伺服器
cookie缺點
-
cookie大小不能超過4K,且受到瀏覽器本身對cookie個數限制,大約不超過50個。如果將大量使用者資料存在cookie中,尤其是賬號、銀行卡號、密碼等,存在被擷取和篡改安全隱患。為了解決這些問題,提出session機制。
Session
場景:會話狀態由服務端控制
-
session時一種服務端機制,請求時由服務端儲存會話狀態,解決了cookie中大小限制和敏感資料的安全性問題。session可以儲存在記憶體或者資料庫中。
步驟:
-
1、登入,使用者提交使用者名稱和密碼傳送HTTP請求;
-
2、服務端驗證使用者發來的使用者名稱密碼。如果正確,則生成一個session。返回一個sessionid設定到響應cookie中,例如jsessionid=222212122111;
-
3、使用者收到HTTP響應後,響應頭cookie中sessionid儲存到瀏覽器中。在此後的請求中傳送該cookie給伺服器;
-
4、服務端收到此後的HTTP請求後,首先驗證sessionid,如果通過,根據該id從伺服器中取出對應的使用者物件,執行請求的業務邏輯。
session缺點
-
因為由session的資料儲存在服務端,當大使用者併發的情況下,開銷會很大;同時如果在分散式架構下,就儲存session共享的問題,需要做好共享和控制設計開發工作。為了考慮跨應用訪問,就有了token令牌機制。
Token
token認證方式與session類似。為了防止客戶端偽造sessionid。token採用時間戳+簽名的方式一起作為token傳送到服務端,服務端驗證簽名資料,通過則可以訪問,驗證失敗,則拒絕請求。
場景:跨平臺應用(單點登入)
-
例如莫平臺整合QQ登入,登入時只需要跳轉至QQ平臺,登入QQ賬號後,將QQ對應該平臺該使用者的token值返回(有的也可以返回一些其他使用者資料,例如名稱、QQ號),平臺根據QQ返回的token和資料生成對應的賬戶。
步驟:
-
1、使用者登入請求驗證,成功後返回token給客戶端;
-
2、客戶端收到token資料後儲存在客戶端;
-
3、客戶端每次訪問請求時,一併攜帶token到伺服器端;
-
服務端校驗成功,返回請求資料。
總結
-
cookie:儲存在客戶端瀏覽器中,有大小限制,大小不能超過4k,且受到瀏覽器本身對cookie個數限制,大約不超過50個,有時效和狀態限制。
-
session:儲存在服務端中,可以儲存在記憶體或者資料,分散式、跨系統不好實現。
-
token:token儲存在客戶端任何地方,適用於分散式部署。
**此篇文章內容有些源於網路,相關版權歸原作者所有!**