软件测试面试大全
軟件測試面試大全
- 一、軟件測試基礎部分
- 1、軟件項目成員有哪些?
- 2、軟件的概念是什么?
- 3、你對軟件測試的定義是怎么的?
- 4、你對軟件Bug的概念是怎樣的?
- 5、軟件Bug級別有幾種?
- 6、軟件Bug狀態有哪些?
- 7、你對軟件質量是怎樣定義的?
- 8、軟件質量的特性有哪些?
- 9、軟件生命周期概念是什么?
- 10、軟件測試目的是什么?
- 11、軟件測試原則是什么?
- 12、測試分為哪幾個階段?
- 13、如何做好測試計劃
- 14、軟件測試流程
- 15、了解測試流程嗎?
- 16、了解 bug 處理流程嗎?
- 17、你工作中的溝通對象一般都是哪些人?
- 18、常用的測試工具有哪些?
- 19、工作效率如何?都有哪些成果?
- 20、測試執行步驟是怎么樣的?
- 21、軟件測試模型有哪些?
- 22、測試用例是怎么設計的?
- 23、測試計劃包含哪一些內容?
- 24、測試報告包含有哪些內容?
- 25、一條bug記錄包含哪些內容?
- 26、Alpha測試與Beta測試的區別?
- 27、軟件測試分類
- 28、軟件測試風險
- 29、TDD(測試驅動開發,Test Driver Developer)
- 30、各種測試名詞解釋
- 二、網絡基礎知識
- 1、linux 常用命令 — 基礎命令
- 2、http/https協議
- 3、TCP/IP協議
- 4、tcp 和 udp 的區別?
- 5、socket建立連接的過程?
- 三、自動化測試
- 1、如何分層自動化測試?
- 2、如何降低自動化維護成本
- 3、如何保證腳本的有效性?
- 4、什么是進程、線程、協程?
- 5、常見測試覆蓋類型
- 6、說一下面向對象的概念?
- 7、python 筆試題
- 1. 統計
- 2. 字符串切片
- 3. 字符串切割
- 4. 格式化輸出
- 5. 隊列
- 6. 交換
- 7. 水仙花:指一個 3 位數,它的每個位上的數字的 3次冪之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)
- 8. 完全數
- 9. 排序
- 10. sort排序
- 11. 計算n的階乘
- 12. 斐波那契數列
- 13. 漢諾塔問題
- 8、selenium面試題
- 四、性能測試
- 五、接口測試
- 1、接口測試常規面試題
- 2、接口自動化面試題
- 六、APP測試
- 1、什么是activity?
- 2、Activity生命周期?
- 3、Android四大組件
- 4、app測試和web測試有什么區別?
- 5、android和ios測試區別?
- 6、app出現ANR,是什么原因導致的?
- 7、App出現crash原因有哪些?
- 8、app對于不穩定偶然出現anr和crash時候你是怎么處理的?
- 9、app的日志如何抓取?
- 10、logcat查看日志步驟
- 11、你平常會看日志嗎, 一般會出現哪些異常
- 七、數據庫
- 1、sql查詢
- 2、sql鏈接查詢
- 3、做成函數調用
- 八、安全/滲透測試
- 九、開放性思維題
- 1、搜索輸入框測試用例設計
- 2、對電梯進行測試用例設計
- 3、對杯子進行測試用例設計
- 4、對桌子進行測試用例設計
- 5、對洗衣機進行測試用例設計
- 6、購物車功能設計測試用例
- 7、支付功能設計測試用例
一、軟件測試基礎部分
該部分主要圍繞測試基礎知識,測試理論、測試方法、測試周期等方面匯總的面試問題。
1、軟件項目成員有哪些?
2、軟件的概念是什么?
3、你對軟件測試的定義是怎么的?
- 定義:軟件質量保證的一種手段
- 概念:是軟件工程中的一個非常重要的環節,是開發項目整體的一部分。是有計劃有組織的,是伴隨軟件工程的誕生而誕生的,軟件測試不是萬能的,不可能發現全部缺陷,軟件測試是有局限性的。
- 目的:驗證被測對象是否實現用戶需求
- 弄清:實際結果與預期結果之間的差異
4、你對軟件Bug的概念是怎樣的?
1. 你怎么定義是不是Bug?
- 軟件沒有實現產品的說明書所描述的功能。
- 軟件實現了產品說明書描述不應有的功能。
- 軟件執行了產品說明書沒講的操作。
- 軟件沒有實現產品說明書沒描述但應該實現的功能(用戶體驗相關)。
- 從軟件測試員的角度來看,軟件難以理解、不易使用、運行緩慢,或者最終用戶認為不對。
2. bug的類型都有哪些?
- Bug有代碼編寫錯誤導致的功能問題
- Defect缺,實現與需求不一致
- Fault即故障,由于環境系統問題引起運行失敗
- Error即錯誤,語法錯誤,邏輯錯誤,不易發現
5、軟件Bug級別有幾種?
-
微小的==》一些小問題
如:錯字,文字排版不整齊等,對功能幾乎沒有影響,軟件產品仍可使用。 -
一般的==》不太嚴重的錯誤
如:主要功能模塊部分喪失、提示信息不夠準確、用戶界面差和操作運行時間長等。 -
嚴重的==》嚴重錯誤
指功能模塊和特性沒有實現,主要功能部分喪失,次要功能全部喪失。 -
致命的==》嚴重的致命的錯誤
造成系統崩潰,四級,或造成數據丟失、主要功能完全喪失等。
如:死機、宕機、黑白屏無法使用、完全卡死
6、軟件Bug狀態有哪些?
-
激活狀態==》問題沒解決
測試人員新報告的缺陷或者驗證后缺陷仍存在。 -
已修正狀態==》開發人員針對缺陷
修正軟件后已解決問題或已通過單元測試 。 -
關閉狀態==》測試人員經過驗證后,確認缺陷不存在之后的狀態 。
-
遺留狀態==》此次版本升級不修改,遺留到下一版本修改。
-
非錯狀態==》就是此問題不是一個Bug,開發可以直接置為關閉
7、你對軟件質量是怎樣定義的?
- 軟件質量就是“軟件與明確的和隱含的定義的需求相一致的程度”;
- 明確的需求指:軟件符合明確敘述的功能和性能需求、文檔中明確描述的開發標準;
- 隱含的需求指:所有專業開發的軟件都應具有的隱含特征的程度,比如:符合行業標準。
- 內部質量:軟件內部的設計和靜態測試是否合格
- 過程質量:關注軟件的整個生產流程是否規范是否合理
- 外部質量:關注軟件產品本身的功能和性能表現
- 使用質量:關注軟件在使用過程中易用性滿意度的表現
8、軟件質量的特性有哪些?
- 件質量的六大特性是什么?
1.功能性
定義:軟件在指定的使用環境下,滿足用戶顯性或隱性需求的能力
適合性:軟件為指定的任務和用戶目標提供一組合適功能的能力
準確性:軟件提供具有所需精確度的正確或相符的結果或效果的能力
互操作性:軟件與一個或更多個的規定系統進行交互的能力
2.可靠性
定義:軟件在指定的條件下使用,維持規定的性能級別的能力
成熟性:軟件為避免由軟件中錯誤而導致失控的能力,
容錯性:在軟件出現故障或違反指定接口的情況下,軟件維持規定性能級別的能力,
易恢復性:在失效發生的情況下軟件里重建規定的件能級別并恢復受直接影響的數據的能力
可靠性依從性:軟件遵循與可靠件相關的標準,約定以及法律法規的能力
3.效率
定義:在規定的條件下,相對于所用資源的數量,軟件提供適當性能的能力
時間特性:在規定的條件下軟件執行其功能時,提供適當的響應和處理時間以及吞吐率的能力
資源利用性:在規定的條件下軟件執行其能力時,使用合適的資源數量和類別的能力
效率依從件:軟件遵循與效率相關的標準和約定的能力
4.易用性
定義:在指定的條件下使用時,軟件被學習,理解,使用和吸引用戶的能力
易理解性:軟件的使用,用戶能理解軟件是否合適,以及如何將軟件用于特定的任務和使用環境的能力
易學習:軟件使用戶能學習其應用的能力易操作性:軟件使用用戶操作和控制它的能力
吸引性:軟件吸引用戶的能力
易用性依從性:遭循與易用性相關的標準、約定風格指南或法規的能力
5.可維護
定義:軟件可被修改的能力,修改可能包括修正、改進或軟件對環境、需求和功能規格說明變化的適應性
易分析性:軟件診斷軟件的缺陷,失效原因或識別待修改部分的能力,
易改變性:軟件指定的修改可以被實現的能力
穩定性:軟件避免由于軟件修改而造成意外結果的能力,
易測試性:軟件使已修改軟件能被確認的能力
可維護依從性:遵循與維護相關標準和約定的能力
6.可移植
定義:軟件從一種環境遷移到另一種環境的能力
適用性:軟件能適用于不同的環境的能力
易安裝性:軟件在指定環境中被安裝的能力
共存性:軟件在公共環境中同與其分享公共資源的其他獨立軟件共存的能力
易替換性:軟件在同樣的環境下,替代另一個相同用途的指定軟件產品的能力
可移植性依從性:軟件遵循可移植性相關的標準和約定的能力
9、軟件生命周期概念是什么?
需求分析 —》可行性分析 —》概要設計 —》詳細設計 —》編碼實現 —》調試和測試 —》軟件驗收與應用 —》維護升級 —》廢棄
10、軟件測試目的是什么?
測試的目的不僅僅是為了發現軟件缺陷與錯誤,而且也是對軟件質量進行度量和評估,以提高軟件的質量。
11、軟件測試原則是什么?
基于測試是為了尋找軟件的錯誤與缺陷,評估與提高軟件質量,因此我們提出了這樣的一組測試原則,如下所示。
12、測試分為哪幾個階段?
- 單元測試
- 集成測試
- 系統測試
- 驗收測試
13、如何做好測試計劃
5W原則:
14、軟件測試流程
-
第一步:
對要執行測試的產品/項目進行需求分析,確定測試策略,制定測試計劃。該計劃被審核批準后轉向第二步。測試工作啟動前一定要確定正確的測試策略和指導方針,這些是后期開展工作的基礎。只有將本次的測試目標和要求分析清楚,才能決定測試資源的投入。 -
第二步:
設計測試用例。設計測試用例要根據測試需求和測試策略來進行,進度壓力不大時,應該設計的詳細,如果進度、成本壓力較大,則應該保證測試用例覆蓋到關鍵性的測試需求。該用例被批準后轉向第三步。 -
第三步:
如果滿足“啟動準則”(EntryCriteria),那么執行測試。執行測試主要是搭建測試環境,執行測試用例。執行測試時要進行進度控制、項目協調等工作。 -
第四步:
提交缺陷。這里要進行缺陷審核和驗證等工作。 -
第五步:
消除軟件缺陷。通常情況下,開發經理需要審核缺陷,并進行缺陷分配。程序員修改自己負責的缺陷。在程序員修改完成后,進入到回歸測試階段。如果滿足“完成準則”(ExitCriteria),那么正常結束測試。 -
第六步:
撰寫測試報告。對測試進行分析,總結本次的經驗教訓,在下一次的工作中改。
軟件測試過程管理,主要包括軟件測試是什么樣的過程,如何評價一個軟件測試過程,如何進行配置管理和測試風險分析以及測試成本的管理。
15、了解測試流程嗎?
16、了解 bug 處理流程嗎?
bug分級;優先級(高中低)、嚴重程度(高中低)
bug分類:UI、系統、接口
bug狀態:新建、待修改、待驗證、已驗證、遺留、關閉
17、你工作中的溝通對象一般都是哪些人?
- 產品、開發、UED
- 市場、運維、運營
- 領導、下屬
18、常用的測試工具有哪些?
19、工作效率如何?都有哪些成果?
20、測試執行步驟是怎么樣的?
21、軟件測試模型有哪些?
-
瀑布流
計劃—>需求分析—>設計—>編碼—>測試—>運行維護
瀑布模型是最正宗最規范的流程。
特點:
1.軟件開發的各項活動嚴格按照線性方式進行。
2.當前活動接受上一項活動的工作結果。
3.當前活動的工作結果需要進行驗證。
缺點:
1.由于開發模型是線性的,增加了開發的風險。
2.早期的錯誤可能要等到開發后期的階段才能發現 -
V字形
-
W字型(雙V)
-
螺旋型
制定計劃—>風險分析—>實施工程(需求確認、軟件需求、軟件產品設計、設計確認與認證、詳細設計、開發、測試)—>客戶評估。
特點:
1.螺旋模型是將瀑布模型與快速原型模型結合起來
2.強調了其他模型所忽視的風險分析
3.每一次螺旋包括4個步驟:制定計劃、風險分析、實施工程、客戶評估 -
敏捷
特點:
1.短周期開發
2.增量開發
3.由程序員和測試人員編寫的自動化測試來監控開發進度
4.通過口頭溝通、測試和源代碼來交流系統的結構和意圖
5.編寫代碼之前先寫測試代碼,也叫做測試先行
缺點:
1.團隊的組建較難,人員素質要求較高
2.對測試員要求完全掌握各種腳本語言編程,能執行單元測試、自動化測試 -
X模型
-
H模型
-
原型模型
客戶與開發公司緊密聯系,開發周期長。開發會受到需求變更的影響
特點:
1.實現客戶與系統的交互。
2.進一步細化待開發軟件需求。
3.開發人員可以確定客戶的真正需求是什么
22、測試用例是怎么設計的?
用例設計:
測試用例都有哪些設計方法
6種黑盒測試方法,如下:
測試用例覆蓋類型:
網絡不通
2G/3G/4G網絡切換
飛行模式
23、測試計劃包含哪一些內容?
- 概述
- 測試環境
- 測試規劃
- 測試策略
- 測試進度安排
- 測試風險分析
- 風險規避
24、測試報告包含有哪些內容?
25、一條bug記錄包含哪些內容?
測試工程師、開發人員、bug日期
bug標題, bug正文, bug附件
bug優先級、bug嚴重等級
bug所屬模塊
bug狀態(新建、已修復、已驗證、遺留等)
bug處理記錄
26、Alpha測試與Beta測試的區別?
-
Alpha測試是由一個用戶在開發環境下進行的測試
-
Beta測試在用戶真實環境測試,通過后進入發布階段
27、軟件測試分類
按照開發階段劃分軟件測試:單元測試、集成測試、系統測試、驗收測試。
按照測試實施組織劃分軟件測試:開發方測試、用戶測試(alpha測試,Beta測試)、第三方測試。
按照測試技術劃分:白盒測試、灰盒測試、黑盒測試。
軟件測試方法和技術的分類與軟件開發過程相關聯,它貫穿了整個軟件生命周期。
28、軟件測試風險
軟件測試中的軟件風險分析是根據預測軟件將出現的風險,制定軟件測試計劃并排列優先等級,風險分析是對軟件中潛在的問題進行識別、估計和評價的過程。
風險也包括進度風險、質量風險、人員風險、變更風險、成本風險等
29、TDD(測試驅動開發,Test Driver Developer)
測試驅動開發的基本思想就是在開發功能代碼之前,先編寫測試用例。也就是說在明確要開發某個功能后,首先思考如何對這個功能進行測試,并完成測試代碼的編寫,然后編寫相關的代碼滿足這些測試用例。然后循環進行添加其他功能,直到完成全部功能的開發。
30、各種測試名詞解釋
- 什么是單元測試(Unit Testing)
- 什么是集成測試(Integration Test)
-
集成測試的關注點:
1.在把各個模塊連接起來時,穿越模塊接口的數據是否會丟失。
2.各個子功能組合起來,能否達到預期的要求。
3.一個模塊的功能是否會對另一個模塊的功能產生不利的影響。 -
集成測試可以劃分成3個級別:
- 什么是系統測試(System Testing)
- 系統測試范圍/策略
功能測試、性能測試、壓力測試、容量測試、安全性測試、GUI測試、安裝測試、配置測試、異常測試、備份測試、健壯性測試、文檔測試、在線幫助測試、網絡測試、穩定性測試 - 什么是驗收測試(Acceptance Test)
- 驗收測試分類:
а測試(alpha)
軟件開發公司組織內部人員模擬各類用戶行為對即將上市的產品進行測試。
?測試(beta)
軟件開發公司組織各方面的典型客戶在日常工作中實際使用,并要求用戶報告異常情況、提出改進意見,然后公司再進行完善。
有正規的測試過程,需要制定測試計劃、定義測試方案、選擇測試用例,進行測試,結果提交。著重考慮軟件是否滿足合同規定的所有功能和性能,文檔資料是否完整、準確,人機界面和其他方面。
-
靜態測試(Static Testing)
-
動態測試(Execution-Based Testing)
實際運行被測試的軟件,輸入相應的測試數據,檢查界面的輸出結果是否和預期結果相一致的過程。 -
黑盒測試(Black box)
把軟件看成一個黑盒子,不管內部邏輯和內部特性,只依據規格說明書檢查程序的功能是否符合功能說明 -
白盒測試(White box)
又稱為結構測試。著重于程序內部結構和算法,不關心功能和性能指標。 -
灰盒測試(Gray box)
介于白盒和黑盒測試之間,基于程序運行時刻的外部表現同時又結合程序內部邏輯結構來設計用例,執行程序并采集程序路徑執行信息和外部用戶接口結果的測試技術。 -
灰盒測試有啥缺點?
當然,凡事都有優點和缺點,灰盒測試自然也不例外。下面列舉它的主要缺點。
所謂的簡單系統,就是簡單到總共只有一個模塊。由于灰盒測試關注于系統內部模塊之間的交互。如果某個系統簡單到只有一個模塊,那就沒必要進行灰盒測試了。
從上面的介紹來看,灰盒測試要求測試人員清楚系統內部由哪些模塊構成,模塊之間如何協作。因此,對測試的要求就提高了。因此,會帶來一定的培訓成本。不過捏,依照俺的經驗,培訓難度不大。稍微有點基礎的測試人員,都可以在短期培訓之后勝任。
顯然,灰盒不如白盒那么深入。不過捏,考慮到灰盒測試相比白盒測試有顯著的成本優勢,該缺點不是太明顯。
-
回歸測試(Regression Testing )
對軟件的新版本測試時,重復執行上一個版本測試時使用的測試用例。防止出現“以前應用沒有的問題現在出問題了” 。 -
冒煙測試(BVT測試(Build Verification Test ))
冒煙測試的對象是每一個新編譯需要正式測試的版本,目的是確認軟件基本功能正常,可以進行后續的正式測試工作。冒煙測試,也叫預測試。 -
隨機測試(又名猴子測試,探索性測試)
測試數據是隨機產生的,在測試用例之外。只能作為一個測試的補充。 -
敏捷測試(敏捷開發引起)
首先敏捷測試(Agile testing)是測試的一種,原有測試定義中通過執行被測系統發現問題,通過測試這種活動能夠提供對被測系統提供度量等概念還是適用的。 -
TDD(測試驅動開發,Test Driver Developer)
測試驅動開發的基本思想就是在開發功能代碼之前,先編寫測試用例。也就是說在明確要開發某個功能后,首先思考如何對這個功能進行測試,并完成測試代碼的編寫,然后編寫相關的代碼滿足這些測試用例。然后循環進行添加其他功能,直到完成全部功能的開發。
二、網絡基礎知識
本篇收集了幾個被問的頻率較高的linux面試題
1、linux 常用命令 — 基礎命令
語法:cd [路徑]
功能:切換目錄
進入home目錄:cd /home
cd . :進入當前目錄
cd … :進入上一級目錄
cd - :進入上次的目錄
cd :進入當前目錄的home目錄
cd ~ :進入當前目錄的home目錄
cd / :進入到根目錄
語法:ls [選項] [路徑]
功能:顯示文件以及目錄
-a 顯示所有文件以及目錄。
-l 列出文件名稱外,還將文件形態、權限、擁有者、文件大小等詳細信息列出。
例:
1.ls:顯示當前目錄下的所有文件及目錄
2.ls /home:顯示home目錄下的所有文件及目錄
語法:cp [選項] 源文件或目錄 目標文件或目錄
功能:拷貝文件
-p:除復制文件的內容外,還把修改時間和訪問權限也復制到新文件中。
-r:若給出的源文件是一個目錄文件,此時將復制該目錄下所有的子目錄和文件。
例:cp /home/test1.txt /data
將home目錄下的test1.txt文件復制到data目錄下
語法:mkdir [文件夾名]
功能:新建一個目錄
例:mkdir /user_tool
建立一個名字為“user_tool”的文件夾
語法:rmdir [選項] [文件夾名]
功能:刪除目錄
- p 遞歸刪除目錄dirname,當子目錄刪除后其父目錄為空時,也一同被刪除。
例:rmdir /user_tool
刪除一個名字為“user_tool”的文件夾
語法:rm [選項] [文件以及文件夾]
功能:刪除檔案及目錄
-r是遞歸處理,就是一層一層的刪;將目錄及以下之檔案亦逐一刪除。
-f是強制刪除。
例:rm -r homework
刪除homework目錄及其下的所有文件及子目錄
rm -r *
刪除當前目錄下的所有文件及目錄
壓縮和解壓命令
語法:tar [選項] [文件目錄列表]
功能:對文件目錄進行打包備份
tar -cvf log.tar log2012.log 僅打包,不壓縮!
tar -zcvf log.tar.gz log2012.log 打包后,以 gzip 壓縮
tar -jcvf log.tar.bz2 log2012.log 打包后,以 bzip2 壓縮
tar –xvf file.tar 解壓 tar包
tar -xzvf file.tar.gz 解壓tar.gz
tar -xjvf file.tar.bz2 解壓 tar.bz2
tar –xZvf file.tar.Z 解壓tar.Z
修改文件或文件夾名
mv [options] 源文件或目錄 目標文件或目錄。
例:
mv test.txt wbk.txt
mv file1 file2
把當前目錄下的file1文件名改成file2,如果該目錄下有file2,則覆蓋以前的file2文件。
語法:pwd
顯示當前工作目錄的絕對路徑
語法:clear
功能:清屏
查看文件
例:
cat /proc/version
查看linux內核版本
語法格式為:chmod [who] [opt] [mode] 文件/目錄名
功能:修改文件的寫讀執行權限
參數分別表示User、Group、及Other的權限。
r=4,w=2,x=1
若要rwx屬性則4+2+1=7;
若要rw-屬性則4+2=6;
若要r-x屬性則4+1=5。
例:chmod 777 a.txt
語法:find [文件及路徑]
功能:查找指定的文件
find . -name “*.c”
將目前目錄及其子目錄下所有擴展名是c的文件列出來。
語法:vi/vim 文件名
功能:編輯文件
語法:cp [選項][文件目錄]
功能:查找文件或目錄
例:
locate /etc/my
/etc/my.cnf
搜索etc目錄下所有以my開頭的文件
語法:grep [選項] ”模式“ [文件]
功能:搜索字符串得 grep 命令
例:grep test *file
在當前目錄中,查找后綴有 file 字樣的文件中包含 test 字符串的文件
語法:ps [options] [–help]
功能:顯示當前進程 (process) 的狀態
例:ps -a
列出所有的進程
語法:kill [進程名]
功能:殺死進程
例:
kill 12345
將進程12345結束
注意:可以先用ps 或 top命令查看進程的id,然后再用kill命令殺死進程
功能:以樹狀圖列出文件目錄結構
注意:如果tree安裝包沒有安裝,請執行:sudo apt install tree
查看文件的后幾行
-n 后面接數字,表示查看幾行(也可以不加, 默認查看文件后10 行 )
例:tail -5 /etc/passwd
查看后5行內容
用于動態地監視進程活動與系統負載等信息,其格式為top,按q退出。
PID:當前運行進程的ID USER:進程屬主 PR:每個進程的優先級別
NInice:反應一個進程“優先級”狀態的值,其取值范圍是-20至19,一共40個級別。這個值越小,表示進程”優先級”越高,而值越大“優先級”越低。一般會把nice值叫做靜態優先級
VIRT:進程占用的虛擬內存
RES:進程占用的物理內存
SHR:進程使用的共享內存
S:進程的狀態。S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值為負數
%CPU:進程占用CPU的使用率 %MEM:進程使用的物理內存和總內存的百分比
TIME+:該進程啟動后占用的總的CPU時間,即占用CPU使用時間的累加值。
COMMAND:進程啟動命令名稱
total : 總計物理內存的大小。
used : 已使用多大。
free : 可用有多少。
Shared : 多個進程共享的內存總額。
Buffers/cached : 磁盤緩存的大小。
available:可用有多少。
Swap:用于臨時內存,當系統的真實內存不夠用時,可以臨時使用磁盤空間來充當內存。
2、http/https協議
瀏覽器輸入url按回車背后經歷了哪些?
(1)進行DNS解析(域名解析),獲取Web服務器的IP地址。
(2)建立TCP連接。
三次握手過程:
第一次握手:客戶端向服務器端發送請求,等待服務器確認。
第二次握手:服務器收到請求并確認,回復一個指令。
第三次握手:客戶端收到服務器的回復指令并返回確認。
(3)向Web服務器發送HTTP請求。
(4)Web服務器接收到請求并處理。
(5)Web服務器返回響應。
(6)瀏覽器對響應進行解碼,并顯示數據。
(7)頁面顯示完成后,瀏覽器發送異步請求。
(9)關閉TCP連接。
get和post的區別?
(1).GET在瀏覽器回退時是無害的,而POST會再次提交請求。
(2).GET產生的URL地址可以被Bookmark,而POST不可以。
(3).GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
(4).GET請求只能進行url編碼,而POST支持多種編碼方式。
(5).GET請求參數會被完整保留在瀏覽器歷史記錄里,而POST中的參數不會被保留。
(6).get方式提交數據的大小(一般來說1024字節),http協議并沒有硬性限制,而是與瀏覽器、服務器、操作系統有關,而POST理論上來說沒有大小限制,http協議規范也沒有進行大小限制,但實際上post所能傳遞的數據量根據取決于服務器的設置和內存大小。
(7).對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
(8).GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息。
(9).GET參數通過URL傳遞,POST放在Request body中。
cookies機制和session機制的區別
具體來說cookie機制采用的是在客戶端保持狀態的方案,而session機制采用的是在服務器端保持狀態的方案。
同時我們也看到,由于采用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的,但實際上還有其他選擇。
常見的HTTP狀態碼有哪些?
- 2xx(3種)
200 OK:表示從客戶端發送給服務器的請求被正常處理并返回;
204 No Content:表示客戶端發送給客戶端的請求得到了成功處理,但在返回的響應報文中不含實體的主體部分(沒有資源可以返回);
206 Patial Content:表示客戶端進行了范圍請求,并且服務器成功執行了這部分的GET請求,響應報文中包含由Content-Range指定范圍的實體內容。 - 3xx(5種)
301 Moved Permanently:永久性重定向,表示請求的資源被分配了新的URL,之后應使用更改的URL;
302 Found:臨時性重定向,表示請求的資源被分配了新的URL,希望本次訪問使用新的URL;
301與302的區別:前者是永久移動,后者是臨時移動(之后可能還會更改URL)
303 See Other:表示請求的資源被分配了新的URL,應使用GET方法定向獲取請求的資源;
302與303的區別:后者明確表示客戶端應當采用GET方式獲取資源
304 Not Modified:表示客戶端發送附帶條件(是指采用GET方法的請求報文中包含if-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since中任一首部)的請求時,服務器端允許訪問資源,但是請求為滿足條件的情況下返回改狀態碼;
307 Temporary Redirect:臨時重定向,與303有著相同的含義,307會遵照瀏覽器標準不會從POST變成GET;(不同瀏覽器可能會出現不同的情況); - 4xx(4種)
400 Bad Request:表示請求報文中存在語法錯誤;
401 Unauthorized:未經許可,需要通過HTTP認證;
403 Forbidden:服務器拒絕該次訪問(訪問權限出現問題)
404 Not Found:表示服務器上無法找到請求的資源,除此之外,也可以在服務器拒絕請求但不想給拒絕原因時使用; - 5xx(2種)
500 Inter Server Error:表示服務器在執行請求時發生了錯誤,也有可能是web應用存在的bug或某些臨時的錯誤時;
503 Server Unavailable:表示服務器暫時處于超負載或正在進行停機維護,無法處理請求;
http協議有哪幾種請求方式?
Get:請求指定的頁面信息,并返回實體主體
Post:向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中,post請求可能會導致新的資源的建立和/或已有資源的修改
Head:類似于get請求,只不過返回的響應中沒有具體的內容,用于獲取報頭
Options:允許客戶端查看服務器的性能
Put:從客戶端向服務器傳送的數據取代指定的文檔的內容
Delete:請求服務器刪除指定的頁面
Trace:回顯服務器收到的請求,主要用于測試或診斷
Connect:http/1.1協議中預留給能夠將連接改為管道方式的代理服務器
http和https區別?
- https協議需要到ca申請證書,一般免費證書較少,因而需要一定費用。
- http是超文本傳輸協議,信息是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
- http和https使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
- http的連接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
http報文格式是怎樣的?
http的請求報文和響應報文的格式基本一樣,主要分為三部分:
- 起始行(start line): 描述請求或響應的狀態
- 頭部字段(header): 以 key:value 的形式展示
- 數據實體(entity/ body) :實際要傳輸的數據,可以是文本,也可以是圖片、文件、視頻等二進制數據
常見的 POST 提交數據方式
- application/x-www-form-urlencoded:在發送前編碼所有字符(默認),提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。
- multipart/form-data:不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值。
- text/xml:空格轉換為 “+” 加號,但不對特殊字符編碼。使用 HTTP 作為傳輸協議,XML 作為編碼方式的遠程調用規范。
- application/json:JSON 格式支持比鍵值對復雜得多的結構化數據。
什么是DNS?
DNS是一個域名系統,是萬維網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串,DNS就是進行域名解析的服務器。。
什么是Http協議無狀態協議?怎么解決Http協議無狀態協議?
無狀態協議:
- 協議對于事務處理沒有記憶能力【事物處理】【記憶能力】
- 對同一個url請求沒有上下文關系【上下文關系】
- 每次的請求都是獨立的,它的執行情況和結果與前面的請求和之后的請求是無直接關系的,它不會受前面的請求應答情況直接影響,也不會直接影響后面的請求應答情況【無直接聯系】【受直接影響】
- 服務器中沒有保存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求服務器【狀態】
解決辦法:
加入cookie、session等機制實現有狀態的web。
3、TCP/IP協議
- 模型
- 各層釋義
應用層:
向用戶提供一組常用的應用程序,比如電子郵件、文件傳輸訪問、遠程登錄等。遠程登錄TELNET使用TELNET協議提供在網絡其它主機上注冊的接口。TELNET會話提供了基于字符的虛擬終端。文件傳輸訪問FTP使用FTP協議來提供網絡內機器間的文件拷貝功能。
傳輸層:
提供應用程序間的通信。其功能包括:一、格式化信息流;二、提供可靠傳輸。為實現后者,傳輸層協議規定接收端必須發回確認,并且假如分組丟失,必須重新發送。
網絡層 :
負責相鄰計算機之間的通信。其功能包括三方面。
一、處理來自傳輸層的分組發送請求,收到請求后,將分組裝入IP數據報,填充報頭,選擇去往信宿機的路徑,然后將數據報發往適當的網絡接口。
二、處理輸入數據報:首先檢查其合法性,然后進行尋徑–假如該數據報已到達信宿機,則去掉報頭,將剩下部分交給適當的傳輸協議;假如該數據報尚未到達信宿,則轉發該數據報。
三、處理路徑、流控、擁塞等問題。
網絡接口層:
這是TCP/IP軟件的最低層,負責接收IP數據報并通過網絡發送之,或者從網絡上接收物理幀,抽出IP數據報,交給IP層。
4、tcp 和 udp 的區別?
常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸
常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP(當對網絡通訊質量要求不高的時候,要求網絡通訊速度能盡量的快)
5、socket建立連接的過程?
- TCP的三次握手建立連接過程:
第一次握手:客戶主動(active open)去connect服務器,并且發送SYN 假設序列號為J,服務器是被動打開(passive open)
第二次握手:服務器在收到SYN后,它會發送一個SYN以及一個ACK(應答)給客戶,ACK的序列號是 J+1表示是給SYN J的應答,新發送的SYN K 序列號是K
第三次握手:客戶在收到新SYN K, ACK J+1 后,也回應ACK K+1 以表示收到了,然后兩邊就可以開始數據發送數據了 - TCP的四次揮手斷開連接過程:
第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
第二次揮手:Server收到FIN后,發送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個FIN占用一個序號),Server進入CLOSE_WAIT狀態。
第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
第四次揮手:Client收到FIN后,Client進入TIME_WAIT狀態,接著發送一個ACK給Server,確認序號為收到序號+1,Server進入CLOSED狀態,完成四次揮手。
三、自動化測試
1、如何分層自動化測試?
- UI自動化回歸
- 接口自動化
- 單元測試-白盒測試
2、如何降低自動化維護成本
在選取將用例自動化時就要注意,盡可能的選取比較穩定的接口/內容做自動化測試;
測試人員在編寫測試腳本時對腳本質量的要求,重用性,復用性,搭建高質量的測試框架;
測試工具的選取使用(比如選取專業的/商業話的測試軟件工具),以及硬件服務的配套使用;
加強提高測試人員的編碼開發實力,這樣能夠創造出更多有用的測試工具。
3、如何保證腳本的有效性?
-
元素定位有效:元素單獨封裝
-
業務流程有效:封裝獨立方法
-
測試數據有效:保證數據庫環境穩定,備份恢復,腳本靈活,實時提取數據,隨機數。
4、什么是進程、線程、協程?
進程是一個具有一定獨立功能的程序在一個數據集上的一次動態執行的過程,是操作系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。
線程是程序執行中一個單一的順序控制流程,是程序執行流的最小單元,是處理器調度和分派的基本單位。
協程是一種基于線程之上,但又比線程更加輕量級的存在,這種由程序員自己寫程序來管理的輕量級線程叫做『用戶空間線程』,具有對內核來說不可見的特性。
進程與線程的區別:
- 線程是程序執行的最小單位,而進程是操作系統分配資源的最小單位;
- 一個進程由一個或多個線程組成,線程是一個進程中代碼的不同執行路線;
- 進程之間相互獨立,但同一進程下的各個線程之間共享程序的內存空間(包括代碼段、數據集、堆等)及一些進程級的資源(如打開文件和信號),某進程內的線程在其它進程不可見;
- 調度和切換:線程上下文切換比進程上下文切換要快得多。
協程的特點:
- 線程的切換由操作系統負責調度,協程由用戶自己進行調度,因此減少了上下文切換,提高了效率。
- 線程的默認Stack大小是1M,而協程更輕量,接近1K。因此可以在相同的內存中開啟更多的協程。
- 由于在同一個線程上,因此可以避免競爭關系而使用鎖。
- 適用于被阻塞的,且需要大量并發的場景。但不適用于大量計算的多線程,遇到此種情況,更好是用線程去解決。
5、常見測試覆蓋類型
語句覆蓋:語句覆蓋就是設計若干個測試用例,運行被測試程序,使得每一條可執行語句至少執行一次。
判定覆蓋(也叫分支覆蓋):設計若干個測試用例,運行所測程序,使程序中每個判斷的取真分支和取假分支至少執行一次。
條件覆蓋:設計足夠的測試用例,運行所測程序,使程序中每個判斷的每個條件的每個可能取值至少執行一次。
判定、條件覆蓋:設計足夠的測試用例,運行所測程序,使程序中每個判斷的每個條件的每個可能取值至少執行一次,并且每個可能的判斷結果也至少執行一次。
條件組合測試:設計足夠的測試用例,運行所測程序,使程序中每個判斷的所有條件取值組合至少執行一次。
路徑測試:設計足夠的測試用例,運行所測程序,要覆蓋程序中所有可能的路徑。
6、說一下面向對象的概念?
面向對象的方法就是利用抽象、封裝等機制,借助于對象、類、繼承、消息傳遞等概念進行軟件系統構造的軟件開發方法。
對象:對象是類的一個實例,有狀態和行為。例如,一條狗是一個對象,它的狀態有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
類:類是一個模板,它描述一類對象的行為和狀態。
面向對象三大主要特征:封裝、繼承、多態
詳細解釋請查看轉載:https://blog.csdn.net/sugar_no1/article/details/86366714
7、python 筆試題
1. 統計
統計在一個隊列中的數字,有多少個正數,多少個負數,如[1,3,5,7,0,-1,-9,-4,-5,8]
a = [1,3,5,7,0,-1,-9,-4,-5,8] m = [i for i in a if i > 0] n = [i for i in a if i < 0] print("正數的個數:{}".format(len(m))) print("負數的個數:{}".format(len(n)))2. 字符串切片
字符串“axbyczdj”,如果得到結果“abcd”
a = "axbyczdj" print(a[::2])3. 字符串切割
已知一個字符串為“hello_world_yoyo”,如何得到一個隊列[“hello”,“world”,“yoyo”]
a = "hello_world_yoyo" b = a.split("_")4. 格式化輸出
已知一個數字為1,如何輸出"0001"
%和format方法大全匯總:https://www.cnblogs.com/qinchao0317/p/10699717.html
5. 隊列
已知一個隊列,如:[1,3,5,7],如何把第一個數字,放在第三個位置,得到:[3,5,1,7]
a = [1,3,5,7] a.insert(3,a[0]) print(a[1:])6. 交換
已知a=9,b=8,如何交換a和b的值,得到a的值為8,b的值為9
a = 9 b = 8 a,b = b,a print(a,b)7. 水仙花:指一個 3 位數,它的每個位上的數字的 3次冪之和等于它本身(例如:1^3 + 5^3+ 3^3 = 153)
#判斷是否是水仙花數 while True:num = input("請輸入一個數字:")num = int(num)if 100<=num<=999:a = num // 100b = num % 100 // 10c = num %10result = a**3+b**3+c**3if result == num:print("{:d}是水仙花數".format(result))else:print("{:d}不是水仙花數".format(result))else:print("輸入的非3位數的數值")8. 完全數
求出1000以內的完全數
a=[] for i in range(1,1000):sum=0for j in range(1,j):if i%j==0 and j<i:sum+=jif sum==i:a.append(i) print(a)9. 排序
用python寫個冒泡排序
def bubble_sort(alist):n = len(alist)for i in range(n-1):for j in range(n-i-1):if alist[j]>alist[j+1]:alist[j],alist[j+1] = alist[j+1],alist[j]return alist10. sort排序
已知一個隊列[1,3,6,9,7,3,4,6]
#列表排序 a = [1,3,6,9,7,3,4,6] a.sort() a.sort(reverse=True) b = list(set(a))#去重后排序 b.sort(key=a.index)#去重后不改變原順序 #字典排序 dic = {'a':1 , 'b':2 , 'c': 3} a = sorted(dic.items(),key=lambda asd:asd[0],reverse=False)#按key值排序 b = sorted(dic.items(),key=lambda asd:asd[1],reverse=False)#按value值排序11. 計算n的階乘
def digui(n):if n==1:return nelse:return n*digui(n-1) print(5)12. 斐波那契數列
a,b=0,1 list=[] maxnum=100 while a<maxnum:list.append(a)a,b=b,a+b print(list) #[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]13. 漢諾塔問題
def move(n, a, b, c):if(n == 1):print(a,"->",c)returnmove(n-1, a, c, b)move(1, a, b, c)move(n-1, b, a, c) move(3, "a", "b", "c")8、selenium面試題
如何判斷一個頁面上元素是否存在?
方法一:try-except
方法二:用elements定義一組元素方法
def is_element_exsist1(driver, locator):'''判斷元素是否存在,存在返回True,不存返回False:param locator: locator為元組類型,如("id", "yoyo"):return: bool值,True or False'''eles = driver.find_elements(*locator)if len(eles) < 1:return Falseelse:return Trueif __name__ == '__main__':loc1 = ("id", "yoyo") # 元素1print(is_element_exsist1(driver, loc1))方法三:結合WebDriverWait和expected_conditions判斷
from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait def is_element_exsist2(driver, locator):'''結合WebDriverWait和expected_conditions判斷元素是否存在,每間隔1秒判斷一次,30s超時,存在返回True,不存返回False:param locator: locator為元組類型,如("id", "yoyo"):return: bool值,True or False'''try:WebDriverWait(driver, 30, 1).until(EC.presence_of_element_located(locator))return Trueexcept:return False if __name__ == '__main__':loc1 = ("id", "yoyo") # 元素1print(is_element_exsist2(driver, loc1))如何提高腳本的穩定性?
- 使用分層結構實現業務邏輯、腳本、數據分離。
- 使用PO設計模式,將一個頁面用到的元素和操作步驟封裝在一個頁面類中。如果一個元素定位發生了改變,我們只用修改這個頁面的元素屬性。
- 對于頁面類的方法,我們盡量從客戶的正向邏輯去分析,方法中是一個獨立場景,例如:登錄到退出,而且不要想著把所有的步驟都封裝在一個方法中。
- 測試用例設計中,減少測試用例之間的耦合度。
- 元素定位時,使用穩定的相對路徑來定位,優先選擇id,避免使用絕對路徑。
如何定位動態元素?
屬性動態變化是指該element沒有固定的屬性值,所以只能通過相對位置定位
比如通過xpath的軸, parent/following-sibling/precent-sibling等
另外也可以嘗試findbyelements遍歷
如何通過子元素定位父元素?
通過獲取文本的內容進行定位向上找 (//…) 這個是上一級
如何截取某一個元素的圖片,不要截取全部圖片
#selenium截全屏 driver.get_screenshot_as_file('D:\\baidu.png') # 把截取的圖片存放在D盤 #截取某元素的圖片 #安裝pillow庫 #pip install pillow from selenium import webdriver from PIL import Image driver = webdriver.Chrome() driver.get('http://www.baidu.com/')driver.save_screenshot('button.png') element = driver.find_element_by_id("su") print(element.location) # 打印元素坐標 print(element.size) # 打印元素大小left = element.location['x'] top = element.location['y'] right = element.location['x'] + element.size['width'] bottom = element.location['y'] + element.size['height']im = Image.open('button.png') im = im.crop((left, top, right, bottom)) im.save('button.png')平常遇到過哪些問題?如何解決的
iframe、等待時間等
一個元素明明定位到了,點擊無效(也沒報錯),如果解決?
# js點擊hidden元素 js = 'document.getElementById("baidu").click()' driver.execute_script(js)selenium中隱藏元素如何定位?(hidden、display: none)
# js點擊hidden元素 js = 'document.getElementById("baidu").click()' driver.execute_script(js)四、性能測試
找到一篇比較全面的整理,工具是jmeter方向的:https://my.oschina.net/u/3519247/blog/4448738
五、接口測試
1、接口測試常規面試題
為什么要做接口測試?
- 可以發現很多在頁面上操作發現不了的bug
- 檢查系統的異常處理能力
- 檢查系統的安全性、穩定性
- 前端隨便變,接口測好了,后端不用變
- 可以測試并發情況,一個賬號,同時(大于2個請求)對最后一個商品下單,或不同賬號,對最后一個商品下單
- 可以修改請求參數,突破前端頁面輸入限制(如金額)
你平常做接口測試的過程中發現過哪些bug?
平常你是怎么測試接口的?
通過性驗證:正常的通過性測試
入參必填驗證:參數是否必填
入參格式驗證:參數的格式進行邊界值、等價類測試
入參場景驗證:正常業務功能、異常業務功能場景
接口權限驗證:繞過身份授權(接口權限、數據權限的測試)、參數是否加密
接口性能驗證:接口并發、響應時間等
平常用什么工具測接口的
postman、jmeter
webService接口是如何測試的
webService接口用SoapUI
沒有接口文檔,如果做接口測試?
1.沒有接口文檔,那就需要先跟開發溝通,然后整理接口文檔。
2.沒有接口文檔,可以抓包看接口請求參數,然后不懂的跟開發溝通。
在手工接口測試或者自動化接口測試的過程中,上下游接口有數據依賴如何處理?
用一個全局變量來處理依賴的數據,比如登錄后返回token,其它接口都需要這個token,那就用全局變量來傳token參數
依賴于第三方數據的接口如何進行測試?
mock
搭建mock服務:https://www.cnblogs.com/yoyoketang/p/9348552.html
當一個接口出現異常時候,你是如何分析異常的?
1.抓包,用fiddler工具抓包,或者瀏覽器上f12,app上的話,那就用fiddler設置代理,去看請求報文和返回報文了
2.查看后端日志,xhell連上服務器,查看日志
3.查數據庫
如何模擬弱網測試
fiddler和charles都可以模擬弱網測試,設置模擬丟包
如何分析一個bug是前端還是后端的?
抓包確認請求報文與接口文檔定義是否一致,如果有問題可能是前端發送的數據不對,如果一致則繼續確認返回報文是否與頁面表現一致,如果有問題可能是后端返回的數據不正確。
2、接口自動化面試題
json和字典dict的區別?
dict是python種的基礎數據類型之一
json本質上是字符串類型,是按key:value鍵值對的格式存儲的字符串
測試的數據你放在哪?
- 對于賬號密碼,這種管全局的參數,可以用命令行參數,單獨抽出來,寫的配置文件里(如ini)
- 對于一些一次性消耗的數據,比如注冊,每次注冊不一樣的數,可以用隨機函數生成
- 對于一個接口有多組測試的參數,可以參數化,數據放yaml,text,json,excel都可以
- 對于可以反復使用的數據,比如訂單的各種狀態需要造數據的情況,可以放到數據庫,每次數據初始化,用完后再清理
- 對于郵箱配置的一些參數,可以用ini配置文件
- 對于全部是獨立的接口項目,可以用數據驅動方式,用excel/csv管理測試的接口數據
- 對于少量的靜態數據,比如一個接口的測試數據,也就2-3組,可以寫到py腳本的開頭,十年八年都不會變更的
什么是數據驅動,如何參數化?
數化的思想是代碼用例寫好了后,不需要改代碼,只需維護測試數據就可以了,并且根據不同的測試數據生成多個用例
unittest的ddt、pytest的pytest.mark.parametrize
下個接口請求參數依賴上個接口的返回數據
存變量、添加到臨時文件、存excel、緩存等。
依賴于登錄的接口如何處理?
token登錄可以登錄后把token存到配置文件
如果是cookies登錄,使用requests.session自動關聯
依賴第三方的接口如何處理
mock
搭建mock服務:https://www.cnblogs.com/yoyoketang/p/9348552.html
不可逆的操作,如何處理,比如刪除一個訂單這種接口如何測試
造數據,直接測試環境數據庫修改或者使用python連接修改
接口產生的垃圾數據如何清理
創建的時候最好用固定命名標識一下,比如autotestXXX等明顯是測試數據標識,之后數據庫清理比較好處理。
使用setUp做數據初始化,使用setDown做數據清理,如果不允許操作數據庫可以直接掉刪除接口清理。
一個訂單的幾種狀態如何全部測到,如:未處理,處理中,處理失敗,處理成功
造數據
python如何連接數據庫操作?
# 1.安裝 pip install pymysql import pymysql try:# 1.鏈接 數據庫 鏈接對象 connection()conn = pymysql.Connect(host="localhost",port=3306,db='animal',user='root',passwd="mysql",charset='utf8')# 2. 創建 游標對象 cursor()cur = conn.cursor()# 增加一條數據 科目表--GO語言# insert_sub = 'insert into subjects values(0,"GO語言")'# result = cur.execute(insert_sub)# 修改# update_sub = 'update subjects set title="區塊鏈" where id=7'# result = cur.execute(update_sub)# 刪除# delete_sub = 'delete from stu where id=8'# result = cur.execute(delete_sub)delete_sub = 'select * from subjects where id=1'cur.execute(delete_sub)# result = cur.fetchall()result = cur.fetchone()print(result)# for res in result:## print(result)# 提交事務conn.commit()# 關閉游標cur.close()# 關閉鏈接conn.close() except Exception as e:print(e)六、APP測試
1、什么是activity?
Activity一個應用程序的組件,它提供一個屏幕來與用戶交互,以便做一些諸如打電話、發郵件和看地圖之類的事情。
2、Activity生命周期?
-
運行(Active/Running):Activity處于活動狀態,此時Activity處于棧頂,是可見狀態,可以與用戶進行交互
-
暫停(Paused):當Activity失去焦點時,或被一個新的非全面屏的Activity,或被一個透明的Activity放置在棧頂時,Activity就轉化為Paused狀態。此刻并不會被銷毀,只是失去了與用戶交互的能力,其所有的狀態信息及其成員變量都還在,只有在系統內存緊張的情況下,才有可能被系統回收掉
-
停止(Stopped):當Activity被系統完全覆蓋時,被覆蓋的Activity就會進入Stopped狀態,此時已不在可見,但是資源還是沒有被收回
-
系統回收(Killed):當Activity被系統回收掉,Activity就處于Killed狀態
3、Android四大組件
Android四大基本組件:Activity、BroadcastReceiver廣播接收器、ContentProvider內容提供者、Service服務。
-
Activity:
應用程序中,一個Activity就相當于手機屏幕,它是一種可以包含用戶界面的組件,主要用于和用戶進行交互。一個應用程序可以包含許多活動,比如事件的點擊,一般都會觸發一個新的Activity。 -
BroadcastReceiver廣播接收器:
應用可以使用它對外部事件進行過濾只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收并做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice 來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它并獲取消息。 -
ContentProvider內容提供者:
內容提供者主要用于在不同應用程序之間實現數據共享的功能,它提供了一套完整的機制,允許一個程序訪問另一個程序中的數據,同時還能保證被訪問數據的安全性。只有需要在多個應用程序間共享數據時才需要內容提供者。例如:通訊錄數據被多個應用程序使用,且必須存儲在一個內容提供者中。它的好處:統一數據訪問方式。 -
Service服務:
是Android中實現程序后臺運行的解決方案,它非常適合去執行那些不需要和用戶交互而且還要長期運行的任務(一邊打電話,后臺掛著QQ)。服務的運行不依賴于任何用戶界面,即使程序被切換到后臺,或者用戶打開了另一個應用程序,服務扔然能夠保持正常運行,不過服務并不是運行在一個獨立的進程當中,而是依賴于創建服務時所在的應用程序進程。當某個應用程序進程被殺掉后,所有依賴于該進程的服務也會停止運行(正在聽音樂,然后把音樂程序退出)。
原文:https://blog.csdn.net/m0_37989980/article/details/78681367
4、app測試和web測試有什么區別?
WEB測試和App測試從流程上來說,沒有區別。
都需要經歷測試計劃方案,用例設計,測試執行,缺陷管理,測試報告等相關活動。
從技術上來說,WEB測試和APP測試其測試類型也基本相似,都需要進行功能測試、性能測試、安全性測試、GUI測試等測試類型。
他們的主要區別在于具體測試的細節和方法有區別,比如:性能測試,在WEB測試只需要測試響應時間這個要素,在App測試中還需要考慮流量測試和耗電量測試。
-
兼容性測試:在WEB端是兼容瀏覽器,在App端兼容的是手機設備。而且相對應的兼容性測試工具也不相同,WEB因為是測試兼容瀏覽器,所以需要使用不同的瀏覽器進行兼容性測試(常見的是兼容IE6,IE8,chrome,firefox)如果是手機端,那么就需要兼容不同品牌,不同分辨率,不同android版本甚至不同操作系統的兼容。(常見的兼容方式是兼容市場占用率前N位的手機即可),有時候也可以使用到兼容性測試工具,但WEB兼容性工具多用IETester等工具,而App兼容性測試會使用Testin這樣的商業工具也可以做測試。
-
安裝測試:WEB測試基本上沒有客戶端層面的安裝測試,但是App測試是存在客戶端層面的安裝測試,那么就具備相關的測試點。
還有,App測試基于手機設備,還有一些手機設備的專項測試。如交叉事件測試,操作類型測試,網絡測試(弱網測試,網絡切換) -
交叉事件測試:就是在操作某個軟件的時候,來電話、來短信,電量不足提示等外部事件。
-
操作類型測試:如橫屏測試,手勢測試
-
網絡測試:包含弱網和網絡切換測試。需要測試弱網所造成的用戶體驗,重點要考慮回退和刷新是否會造成二次提交。弱網絡的模擬,據說可以用360wifi實現設置。
-
從系統架構的層面,WEB測試只要更新了服務器端,客戶端就會同步會更新。而且客戶端是可以保證每一個用戶的客戶端完全一致的。但是APP端是不能夠保證完全一致的,除非用戶更新客戶端。如果是APP下修改了服務器端,意味著客戶端用戶所使用的核心版本都需要進行回歸測試一遍。
-
還有升級測試:升級測試的提醒機制,升級取消是否會影響原有功能的使用,升級后用戶數據是否被清除了。
原文地址:https://www.cnblogs.com/laoluoits/p/5673291.html
5、android和ios測試區別?
App測試中ios和Android有哪些區別呢?
對于Android若有內置的應用需檢查升級之后內置文件是否匹配(如內置的輸入法)
另外:對于測試還需要注意一下幾點:
并發(中斷)測試:鬧鈴彈出框提示,另一個應用的啟動、視頻音頻的播放,來電、用戶正在輸入等,語音、錄音等的播放時強制其他正在播放的要暫停;
數據來源的測試:輸入,選擇、復制、語音輸入,安裝不同輸入法輸入等;
push(推送)測試:在開關機、待機狀態下執行推送,消息先死及其推送跳轉的正確性;
應用在開發、未打開狀態、應用啟動且在后臺運行的情況下是push顯示和跳轉否正確;
推送消息閱讀前后數字的變化是否正確;
多條推送的合集的顯示和跳轉是否正確;
分享跳轉:分享后的文案是否正確;分享后跳轉是否正確,顯示的消息來源是否正確;
觸屏測試:同時觸摸不同的位置或者同時進行不同操作,查看客戶端的處理情況,是否會crash等
原文鏈接:https://www.jianshu.com/p/91d7acfb036e
6、app出現ANR,是什么原因導致的?
那么導致ANR的根本原因是什么呢?簡單的總結有以下兩點:
細分的話,導致ANR的原因有如下幾點:
原文:https://blog.csdn.net/jaychou_maple/article/details/78782822
7、App出現crash原因有哪些?
或是內存泄露,程序運行的時間越長,所占用的內存越大,最終用盡全部內存,導致整個系統崩潰。
亦或非授權的內存位置的使用也可能會導致App crash。
e.g. app新添加一個未經測試的新功能,調用了一個已釋放的指針,運行的時候就會crash。
原文:https://blog.csdn.net/yangtuxiaojie/article/details/47123243
8、app對于不穩定偶然出現anr和crash時候你是怎么處理的?
-
方法一:app開發保存錯誤日志到本地
一般app開發在debug版本,出現anr和crash的時候會自動把日志保存到本地實際的sd卡上,去對應的app目錄取出來就可以了 -
方法二:實時抓取
當出現偶然的crash時候,這時候可以把手機拉到你們app開發那,手機連上他的開發代碼的環境,有ddms會抓日志,這時候出現crash就會記錄下來日志。
盡量重復操作讓bug復現就可以了
也可以自己開著logcat,保存日志到電腦本地,參考這篇:https://www.cnblogs.com/yoyoketang/p/9101365.html
adb logcat | find "com.sankuai.meituan" >d:\hello.txt -
方法三:第三方sdk統計工具
一般接入了第三方統計sdk,比如友盟統計,在友盟的后臺會抓到報錯的日志
9、app的日志如何抓取?
-
app本身的日志,可以用logcat抓取,參考這篇:https://www.cnblogs.com/yoyoketang/p/9101365.html
adb logcat | find "com.sankuai.meituan" >d:\hello.txt -
也可以用ddms抓取,手機連上電腦,打開ddms工具,或者在Android Studio開發工具中,打開DDMS
關于ddms更多的功能,參考這篇:https://www.cnblogs.com/gaobig/p/5029381.html
10、logcat查看日志步驟
以下操作是基于windows平臺的操作:adb logcat | find
linux平臺的操作可以把find改成grep: adb logcat | grep
windows上的dos里面是沒grep指令的
-
logcat輸出日志
1.把日志存入手機sdcard某個目錄(前提是這個目錄要是存在的)
adb logcat -f /sdcard/xx/xxx.txt
備注:-f將日志輸出到文件
上面這個指令在真機上(未root)是會報錯的,提示沒操作權限,在模擬器上可以執行
2.把日志存入電腦的某個目錄,如d:\debug
adb logcat >d:debug\yoyo.txt -
find過濾包名
1.如果直接用adb logcat抓日志的話,會把系統的一些其他無關緊要的都抓出來,如果只想抓取被測app的日志,那就根據包名過濾
adb logcat | find "com.sankuai.meituan" >d:\hello.txt -
結束logcat
1.結束logcat抓包,可以用ctr+c快捷鍵結束, 這個是通過手工的快捷鍵操作完成
2.也可以先查詢到logcat的pip,再kill掉
adb shell ps | findstr logcat
adb shell kill -9 [logcatpid]
注意:kill操作在模擬器上是可以的,真機上沒權限
11、你平常會看日志嗎, 一般會出現哪些異常
常見的幾種如下:
- NullPointerException - 空指針引用異常
- ClassCastException - 類型強制轉換異常。
- IllegalArgumentException - 傳遞非法參數異常。
- ArithmeticException - 算術運算異常
- ArrayStoreException - 向數組中存放與聲明類型不兼容對象異常
- IndexOutOfBoundsException - 下標越界異常
- NegativeArraySizeException - 創建一個大小為負數的數組錯誤異常
- NumberFormatException - 數字格式異常
- SecurityException - 安全異常
- UnsupportedOperationException - 不支持的操作異常
七、數據庫
1、sql查詢
1. 排序order by
查詢所有學生的數學成績,顯示學生姓名name, 分數, 由高到低
2. 統計總成績sum
統計每個學生的總成績,顯示字段:姓名,總成績
3. 統計總成績
統計每個學生的總成績(由于學生可能有重復名字),顯示字段:學生id,姓名,總成績
4. 統計單科最好成績
列出各門課程成績最好的學生, 要求顯示字段: 學號,姓名,科目,成績
5.各門課程成績最好的2位學生
列出各門課程成績最好的2位學生, 要求顯示字段: 學號,姓名, 科目,成績
6. 計算學生平均分數
計算每個人的平均成績, 要求顯示字段: 學號,姓名,平均成績
7. 統計各科目成績
計算每個人的成績,總分數,平均分,要求顯示:學號,姓名,語文,數學,英語,總分,平均分
使用case when 語法把科目字段分解成具體的科目:語文,數學, 英語
8. 每門課程平均成績
列出各門課程的平均成績,要求顯示字段:課程,平均成績
9. 成績排名
列出數學成績的排名, 要求顯示字段:學號,姓名,成績,排名
在查詢結果表里面添加一個變量@paiming,讓它自動加1
10. 同結果名次相同
上圖由于同一個分數的小伙伴,排名不一樣,本著公平、公正、公開的原則,同一分數名次一樣
排名相同的占個名次
SELECT obj.id, obj.score as 數學,@rownum := @rownum + 1 AS num_tmp,@incrnum := (CASE WHEN @rowtotal = obj.score THEN@incrnum WHEN @rowtotal := obj.score THEN@rownum END) AS 排名FROM (SELECT id, score FROM grade WHERE kemu = "數學" ORDER BY score DESC ) AS obj, (SELECT @rownum := 0 ,@rowtotal := NULL ,@incrnum := 0) r11. 查詢前3名
列出數學成績前3名的學生(要求顯示字段:學號,姓名, 科目,成績)
12. 查詢第2-3名記錄
查詢數學成績第2和第3名的學生
13. 查詢第3到后面所有的
查詢第3名到后面所有的學生數學成績
注意:有些資料上寫的limit 2, -1 用-1代碼最大值,這個是不對的,會報錯,解決辦法:隨便寫個非常大的整數
14. 查詢每門課都大于80 分的學生姓名
SELECT name FROM xuesheng GROUP BY name HAVING MIN(score)> 802、sql鏈接查詢
1. 內連接:a表與b表共有數據
select * from userinfo inner join score on userinfo.id=score.id;2. 左連接:如果b表的某行在a表中沒有匹配行,則將為b表返回空值左連
select * from userinfo left join score on userinfo.id=score.id;3. 右連接:如果a表的某行在b表中沒有匹配行,則將為a表返回空值右連
select * from userinfo right join score on userinfo.id=score.id;4. 內連接的三表查詢
select t1.username,t2.classname,t3.mark from(userinfo t1 inner join score t3 on t1.id=t3.id) inner join class t2 on t2.classid=t3.classid;3、做成函數調用
函數
create procedure mark_sum(in num int) begin selece t1.username,sum(t3.mark) from userinfo t1,class t2,score t3 where t1.id=t3.id and t2.classid=t3.classid group by t1.username and t1.id=num; end調用:call mark_sum(1);
八、安全/滲透測試
1.用戶訪問認證
2.傳輸數據加密
3.安全防護策略:如安全日志、入侵檢測、隔離防護、漏洞掃描
4.數據備份與恢復
5.防病毒系統
6.SQL注入、JS注入
關于安全測試最全面的介紹請參考:https://www.cnblogs.com/blogst/p/9241952.html
九、開放性思維題
1、搜索輸入框測試用例設計
2、對電梯進行測試用例設計
3、對杯子進行測試用例設計
4、對桌子進行測試用例設計
5、對洗衣機進行測試用例設計
6、購物車功能設計測試用例
7、支付功能設計測試用例
總結
- 上一篇: Linux下解压:tar、rar、7z命
- 下一篇: oracle的等保,3.Oracle 检