熬夜肝出 3w 字測試開發(fā)學(xué)習(xí)路線
本文將從薪水,職業(yè)規(guī)劃,測試?yán)碚摶A(chǔ),自動化測試基礎(chǔ),常用自動化框架,計(jì)算機(jī)基礎(chǔ)及 Python 高頻面試題,測試相關(guān)高頻面試題出發(fā),詳細(xì)內(nèi)容如下,希望能對大家有所幫助。

薪水
我把它放在最前面,讓大家能有一個基本的了解。綜合下來,應(yīng)屆生在互聯(lián)網(wǎng)公司的測開崗位薪水在 22~25 之間。
前景
我咨詢身邊認(rèn)識的同學(xué)關(guān)于測開的前景。
測試的發(fā)展路線為兩條,一條是業(yè)務(wù)型測試,另一個是技術(shù)型測試。業(yè)務(wù)型測試比較好理解,更加偏向業(yè)務(wù),很可能最開始是從事測試方面的工作,后面去專門做了業(yè)務(wù),其大概路線為功能測試,業(yè)務(wù)專家,行業(yè)業(yè)務(wù)專家,行業(yè)業(yè)務(wù)發(fā)展專家等,超級遙遠(yuǎn)的路羅。
對于技術(shù)型測試,更加偏向技術(shù)。從功能測試到測試開發(fā),我遇到過一個測試,將開發(fā)的 Bug 揪出來就算了,還指導(dǎo)開發(fā)修改邏輯,哈哈哈哈哈哈,笑死我。其路線如下圖哦

左側(cè)為業(yè)務(wù)型測試,在工作中遇到一個姐姐,在銀行外包大概工作了11年,后面轉(zhuǎn)為行內(nèi)的業(yè)務(wù),甲方爸爸羅。當(dāng)然是非常不容易的,所需要的付出不亞于走技術(shù)路線,不過你的業(yè)務(wù)路線會把自己的職業(yè)選擇固定在某一個特定的領(lǐng)域。
右邊是技術(shù)路線,職業(yè)選擇還是挺廣的了,功能測試,接口測試,性能測試,安全測試等等,也是面試的考察點(diǎn),目前來看,純粹的功能測試太少太少,幾乎瀕臨淘汰羅,那么測試開發(fā)成為本文著重會說的復(fù)習(xí)內(nèi)容。
測試開發(fā)本質(zhì)
測試開發(fā)的本質(zhì)是助力業(yè)務(wù)成功。感覺很多同學(xué)一上來就是學(xué)習(xí)編程技術(shù),技術(shù)學(xué)習(xí)比較枯燥,計(jì)算機(jī)基礎(chǔ)知識不扎實(shí),很快就陷入了基礎(chǔ)知識的泥沼。
在我看來了解基礎(chǔ)理論后,學(xué)習(xí) Python,Git 等必備技巧,熟悉一門自動化框架就可以解決測試相關(guān)的面試了。
軟件測試存在的意義
通過一系列測試活動,「提前」發(fā)現(xiàn)和定位軟件產(chǎn)品質(zhì)量的薄弱環(huán)節(jié),并倒逼開發(fā)人員修正,從而保證交付的軟件質(zhì)量滿足客戶需求。
有研究表明,越早發(fā)現(xiàn)軟件中存在的問題,開發(fā)費(fèi)用就越低,軟件質(zhì)量越高,軟件發(fā)布后的維護(hù)費(fèi)用越低。因此,提前發(fā)現(xiàn)和定位問題極為重要,而在軟件開發(fā)的整個歷程中,越是新興的軟件開發(fā)模型,越重視「提前測試」。提前測試可以使得在需求分析時期就可發(fā)現(xiàn)的錯誤,不必等到開發(fā)完成才被發(fā)現(xiàn)。
測試伴隨著軟件開發(fā)模型的演進(jìn)
說到開發(fā)模型,從軟件發(fā)展來看,比較典型的有瀑布模型,V 模型和 W 模型以及 敏捷開發(fā)模型。并不是說開發(fā)模型的選擇越新越好,需要根據(jù)項(xiàng)目的具體情況而選擇。
瀑布模型
我們知道,瀑布模型的主要特征在于項(xiàng)目完全按照階段劃分,只有前一階段完成,才能開始下一階段。具體到測試活動,則只能在全部編碼完成后、發(fā)布之前執(zhí)行,在這種開發(fā)模型中,測試活動被完全后置了,測試僅僅是編碼后的一個活動階段,測試的重要性沒有被凸顯出來。

V 模型
基于此,V 模型出現(xiàn)了。V 模型在整個開發(fā)過程中,不僅相對清晰地劃分了測試活動的不同級別,還將其不同級別的測試活動與軟件開發(fā)各階段清晰地對應(yīng)起來,強(qiáng)調(diào)了測試在整個開發(fā)過程中的重要性。但在 V 模型中,測試依舊是編碼之后才開始的,測試介入時間還是太晚。比如,需求分析階段出現(xiàn)的問題,要等到系統(tǒng)測試階段才能發(fā)現(xiàn)。

W 模型
為了彌補(bǔ)這一缺點(diǎn),V 模型的進(jìn)一步深化版,即W 模型出現(xiàn)了。從 W 模型的示意圖中,可以看到,W 模型是把 V 模型左邊的每一個活動都加了一個測試設(shè)計(jì)活動,體現(xiàn)了“盡早和不斷地進(jìn)行測試”的原則。

敏捷模型
敏捷過程模型”是指基于迭代開發(fā)的軟件開發(fā)方法。敏捷方法將任務(wù)分解為較小的迭代, 或者部分不直接涉及長期計(jì)劃。在開發(fā)過程的開始就確定了項(xiàng)目范圍和要求。事先明確定義了有關(guān)迭代次數(shù), 每次迭代的持續(xù)時間和范圍的計(jì)劃。
每次迭代都被視為敏捷流程模型中的短時間”框架”, 通常持續(xù)一到四個星期。將整個項(xiàng)目分成較小的部分有助于最大程度地降低項(xiàng)目風(fēng)險(xiǎn), 并減少總體項(xiàng)目交付時間要求。每次迭代都涉及一個團(tuán)隊(duì), 在整個軟件開發(fā)生命周期中進(jìn)行工作, 包括計(jì)劃, 需求分析, 設(shè)計(jì), 編碼和測試, 然后再向客戶展示有效產(chǎn)品。
職業(yè)生涯
軟件測試開發(fā)流程
需求分析
在測試前拿到產(chǎn)品需求文檔,進(jìn)行需求分析及需求評審前先對需求文檔進(jìn)行詳細(xì)的閱讀,對有疑問的地方進(jìn)行標(biāo)注。
具體可從以下進(jìn)行:
分析產(chǎn)品功能點(diǎn)
產(chǎn)品核心競爭力
Kano模型、馬斯洛需求分析、多問幾個為什么、上下文分析法
制訂測試用例(重要)
工欲善其事,必先利其器;對測試而言,測試用例就是器,做好了才能把好關(guān)
使用思維導(dǎo)圖列舉測試大綱,盡量發(fā)散,想到什么就寫什么,;先放后收,對知識點(diǎn)進(jìn)行總結(jié)和歸納,標(biāo)記重點(diǎn)測試模塊,刪除冗余及重復(fù)測試點(diǎn)。
可使用邊界值法、等價類劃分法、錯誤推測法、因果圖法等設(shè)計(jì)案例
根據(jù)測試大綱制定測試用例,需包含模塊名、測試優(yōu)先級、操作步驟、期望結(jié)果、測試結(jié)果、備注
評審測試用例
測試作為主導(dǎo),聯(lián)合開發(fā)、項(xiàng)目經(jīng)理、PM進(jìn)行測試用例評審 ?
可先講解測試大綱,讓開發(fā)、項(xiàng)目經(jīng)理、PM心中對測試用例有個大概;后再進(jìn)行詳細(xì)測試用例講解 ?
執(zhí)行測試
根據(jù)測試用例執(zhí)行測試 ?
發(fā)現(xiàn)問題保留現(xiàn)場,記錄測試方法,通知開發(fā)解決問題 ?
覆蓋測試用例之外若有時間可進(jìn)行探索性測試 ?
提交 Bug 并推動 Bug 解決
在Bug管理工具上提交Bug,詳細(xì)記錄測試步驟
根據(jù)Bug嚴(yán)重程度劃分Bug等級:致命、嚴(yán)重、一般、提示
推動開發(fā)解決問題,記錄問題進(jìn)展,一般聊天溝通,若問題嚴(yán)重則需通過郵件推動解決
回歸測試
對已修復(fù)的 Bug 進(jìn)行驗(yàn)證
對 Bug 所在模塊進(jìn)行基本功能測試;整體進(jìn)行冒煙測試,確保不會因?yàn)樾薷?Bug 而引起其他功能出現(xiàn)問題
編寫并提交測試報(bào)告
可使用金字塔原理設(shè)計(jì)測試報(bào)告,先總后分,上級統(tǒng)領(lǐng)下級,下級推導(dǎo)出上級,環(huán)環(huán)相扣
對Bug進(jìn)行匯總,篩選出各個等級的Bug存活情況
制訂Bug發(fā)現(xiàn)及解決曲線圖,一般版本正常應(yīng)是前期多,后期收斂,存活的是級別較低的Bug
總結(jié)歸納版本情況,評估發(fā)布與否
軟件測試方法
白盒測試
概念:關(guān)注程序代碼的具體細(xì)節(jié),根據(jù)軟件內(nèi)部代碼的邏輯結(jié)構(gòu)分析來進(jìn)行測試。主要是通過閱讀程序代碼或者通過使用開發(fā)工具中的單步調(diào)試來判斷軟件質(zhì)量。關(guān)注代碼的實(shí)現(xiàn)細(xì)節(jié)。主要對程序模塊的所有獨(dú)立執(zhí)行路徑至少測試一遍、對所有的邏輯判定,取“真”或“假”的兩種情況都要測試一遍,循環(huán)邊界和運(yùn)行界限內(nèi)執(zhí)行循環(huán)體等等
測試用例設(shè)計(jì)方法:邏輯覆蓋、循環(huán)覆蓋、基本路徑覆蓋、判定覆蓋
優(yōu)點(diǎn):增大代碼的覆蓋率,提高代碼的質(zhì)量,發(fā)現(xiàn)代碼中隱藏的問題
缺點(diǎn):系統(tǒng)龐大時測試開銷很大,難以測試所有運(yùn)行路徑;測試基于代碼,只能驗(yàn)證代碼是否正確,而不曉得代碼設(shè)計(jì)是否合理,可能會遺漏某些功能需求
黑盒測試
概念:不考慮其內(nèi)部結(jié)構(gòu),即具體代碼實(shí)現(xiàn),檢測軟件的各個功能能否得以實(shí)現(xiàn),確認(rèn)軟件功能的正確性,依靠軟件說明書來判斷測試用例,關(guān)注具體的客戶需求及軟件功能。黑盒測試主要是為了發(fā)現(xiàn):1.是否有不正確的或者遺漏的功能;2.輸入是否能輸出正確的結(jié)果;3.性能上是否滿足要求
優(yōu)點(diǎn):①較為簡單,不需要了解程序內(nèi)部的代碼及實(shí)現(xiàn),與軟件內(nèi)部實(shí)現(xiàn)無關(guān);②從用戶角度出發(fā),實(shí)際考慮用戶使用的功能及可能出現(xiàn)的問題
缺點(diǎn):不可能覆蓋所有的代碼,覆蓋率較低
測試用例設(shè)計(jì)方法:邊界值分析法、等價類劃分、錯誤猜測法、因果圖法、狀態(tài)圖法、測試大綱法、隨機(jī)測試法、場景法
等價類
輸入域的各子集中,各個輸入數(shù)據(jù)對于揭露程序中的錯誤都是等效的。
等價類劃分:將全部輸入數(shù)據(jù)合理劃分成若干個等價類,在每一個等價類中取一個數(shù)據(jù)作為輸入條件,就可以用少量代表性測試數(shù)據(jù)取得較好的測試結(jié)果。分為有效等價類(合理、有意義的輸入數(shù)據(jù)構(gòu)成的集合)和無效等價類
邊界值分析法:大量錯誤是發(fā)生在輸入輸出范圍的邊界上,選定測試用例時應(yīng)該選取正好等于、剛剛大于、剛剛小于邊界值的值作為測試數(shù)據(jù),而不是選取等價類中的任意值,作為對等價類劃分的補(bǔ)充
錯誤猜測法:基于經(jīng)驗(yàn)和直覺推測,列舉出程序中所有可能有的錯誤和容易發(fā)生錯誤的特殊情況,根據(jù)這些情況選擇測試用例
因果圖法:考慮輸入條件之間的相互組合,也考慮輸出結(jié)果對輸入條件的依賴關(guān)系。原因即為輸入條件或者輸入條件的等價類,結(jié)果即為輸出條件,把因果轉(zhuǎn)換為決策表,為決策表中的每一列設(shè)計(jì)測試用例。
場景分析法:根據(jù)用戶場景來模擬用戶的操作步驟
大綱法:著眼于需求。將需求轉(zhuǎn)換為大綱的形式,大綱表示為樹狀結(jié)構(gòu),在根和葉子節(jié)點(diǎn)之間存在唯一路徑,大綱為每條路徑定義了一個特殊的輸入條件集合,用于測試用例。
隨機(jī)測試法:不考慮任何用例和需求,完全站在用戶的角度對產(chǎn)品進(jìn)行測試
灰盒測試
關(guān)注輸入輸出的準(zhǔn)確性,也關(guān)注內(nèi)部的代碼,但是沒有白盒測試那么詳細(xì)完整。
動態(tài)測試:
實(shí)際運(yùn)行被測程序,輸入相應(yīng)的測試用例,檢查運(yùn)行結(jié)果與預(yù)期結(jié)果的差異,從而驗(yàn)證程序的正確性、有效性和可靠性,并且分析系統(tǒng)運(yùn)行的效率和健壯性。
α測試:
一個用戶在開發(fā)環(huán)境下的受控測試,模擬實(shí)際操作環(huán)境
β測試
多個用戶在實(shí)際使用環(huán)境下進(jìn)行的測試,如一些軟件的公測
冒煙測試
在大規(guī)模測試之前,先對軟件的基本、核心、主要功能進(jìn)行測試,節(jié)省資源
回歸測試
開發(fā)修正完代碼后再回過頭來做測試
隨機(jī)測試
跳出思維的限制,沒有思想、沒有步驟地隨機(jī)進(jìn)行測試
探索測試
有思想,有步驟地測試一些復(fù)雜的、不常用地功能
為什么引入自動化測試
自動化測試是將自動化工具和技術(shù)應(yīng)用于軟件測試,旨在減少測試工作,更快,更經(jīng)濟(jì)地驗(yàn)證軟件質(zhì)量。有助于以更少的工作量構(gòu)建質(zhì)量更好的軟件。
許多公司多多少少都在做自動化測試,但手動測試仍然占主要的比例,因?yàn)橛行﹫F(tuán)隊(duì)不知道如何在開發(fā)過程中更好的利用自動化測試來替代手動測試。
手工測試通常是工程師仔細(xì)的執(zhí)行預(yù)定義的測試用例,將執(zhí)行結(jié)果與預(yù)期的行為進(jìn)行手工比較并記錄結(jié)果。每次源代碼更改時都會重復(fù)這些手動測試,由于都是人為參與,這個過程中很容易出錯。
在組織中引入自動化測試時,需要投入大量財(cái)力和時間。然而,一般沒有太多的財(cái)務(wù)回報(bào),至少在小規(guī)模開始時沒有。因此許多公司選擇開源測試自動化工具,特別是在開始引入自動化測試的階段。
通常,軟件公司害怕投資自動化測試,不是因?yàn)樨?fù)擔(dān)不起這個投入,而是因?yàn)樗麄儞?dān)心的回報(bào)不會像預(yù)期的那樣,或者根本不會產(chǎn)生積極的投資回報(bào)率。
1. 降低成本(特別是問題出現(xiàn)時的成本)
如前所述,開始自動化測試的初始成本并不高,比如選用免費(fèi)的開源工具。但是,一旦您的組織全面展開自動化測試,您就會希望投資更好的工具、更好的服務(wù)器,雇用人力來維護(hù)基礎(chǔ)設(shè)施等。這些成本絕對不是無關(guān)緊要的。
自動化測試不會自動生成。創(chuàng)建有價值的自動化測試需要花費(fèi)時間和精力,而且不會在一夜之間發(fā)生。
如果您想證明引入自動化測試的合理性,不能只關(guān)注財(cái)務(wù)回報(bào),而應(yīng)考慮應(yīng)用出現(xiàn)問題導(dǎo)致的隱性成本。例如一個問題在手動測試沒有發(fā)現(xiàn)而出現(xiàn)在產(chǎn)品環(huán)境中,公司會花多少錢?你是否會失去客戶?需要花多少時間、資源和資金來糾正這種情況?
如果每次對代碼進(jìn)行更改時,都重復(fù)執(zhí)行一組非常強(qiáng)大的測試套件,可以降低問題出現(xiàn)在產(chǎn)品環(huán)境的風(fēng)險(xiǎn)。自動化測試有助于在軟件開發(fā)生命周期的早期發(fā)現(xiàn)錯誤,從而降低交付故障軟件的風(fēng)險(xiǎn)。
說到底,向市場提供高質(zhì)量的產(chǎn)品重要性遠(yuǎn)大于任何其他類型的節(jié)省。
2. 節(jié)省時間
雖然初期建立自動化測試需要花費(fèi)大量的時間和人力,但是一旦自動化測試建立了,您就可以重用這些測試。自動化測試的執(zhí)行速度明顯快于手動測試,不易出錯,且節(jié)省人力。
在日常的代碼修改過程中,您可以在每次提交時執(zhí)行自動化測試,而不必通過設(shè)置環(huán)境或記住執(zhí)行每個測試的步驟來持續(xù)執(zhí)行手動步驟。一切都是自動完成的。
只要首次設(shè)置完成后,就可以重復(fù)運(yùn)行你的自動化測試,從而將重復(fù)的手動測試時間從數(shù)周縮短至數(shù)小時。
同樣一旦編寫好,測試可以執(zhí)行任意次。與手動測試儀不同,測試也可全天候,無人值守的執(zhí)行。
在軟件開發(fā)團(tuán)隊(duì)中,通常的做法是每天多次(通常是每次提交)運(yùn)行基本單元測試,并且每天在下班后執(zhí)行耗時的集成測試和UI測試。
3. CI和DevOps
自動化測試構(gòu)成任何持續(xù)集成或DevOps設(shè)置的基礎(chǔ)。從本質(zhì)上講,CI(持續(xù)集成)和DevOps都依賴于“Fail fast, Fail early”的理念。對代碼庫的每次提交都將自動進(jìn)行測試,并將結(jié)果報(bào)告給開發(fā)人員。開發(fā)人員優(yōu)先修復(fù)任何導(dǎo)致構(gòu)建失敗或?qū)е轮饕獪y試失敗的錯誤,確保主線代碼始終按預(yù)期工作。
4. 準(zhǔn)確性和可靠性
由于運(yùn)行每個測試涉及多個先決條件,手動測試容易出錯。另外每個測試可能需要不同的執(zhí)行順序。
畢竟手動測試人員是人類,人有不善于執(zhí)行重復(fù)枯燥工作的特點(diǎn),因此可以預(yù)料手動測試不會精確并有一定的幾率出錯。這會導(dǎo)致不準(zhǔn)確的結(jié)果反饋到開發(fā)團(tuán)隊(duì)。
自動化測試每次都執(zhí)行相同的步驟,不僅精確,而且結(jié)果可在最短的時間內(nèi)提供給所有相關(guān)人員。
可靠性的另一個方面是在不同服務(wù)器上重新執(zhí)行相同的測試。這使得能夠快速驗(yàn)證測試是否在所有服務(wù)器上按預(yù)期運(yùn)行,從而排除了服務(wù)器配置問題的可能性。
4. 性能測試
性能負(fù)載測試可確保您的應(yīng)用程序可以處理預(yù)期和意外的用戶負(fù)載。
如果您當(dāng)前只在項(xiàng)目中使用手動測試方法,則負(fù)載測試可能會推遲到開發(fā)周期結(jié)束。按照敏捷方法和持續(xù)集成理念,應(yīng)及早地進(jìn)行性能測試,但現(xiàn)實(shí)是很大一部分項(xiàng)目團(tuán)隊(duì)執(zhí)行做這個測試的時間太晚,最終導(dǎo)致產(chǎn)品發(fā)布推遲。
自動化性能測試能夠同時運(yùn)行數(shù)千個測試,模擬數(shù)百萬用戶,所有這些用戶手動測試幾乎都是不可能的。
5. 增加對軟件的信心
敏捷方法建議使用sprint,即短周期的迭代。每個sprint通常2-3周。這需要一種新的方式來組織測試工作并要求更高的效率。
每個sprint都專注于開發(fā)一組小功能,但必須在其結(jié)束的時候提供較完整的新功能特性,還包括之前sprint的所有功能特性。如果沒有適當(dāng)?shù)臏y試,在不破壞之前正常工作的功能特性的情況下提供全功能系統(tǒng)的風(fēng)險(xiǎn)很高。在每個sprint中反復(fù)手動測試所有功能會效率低下。
這也是自動化測試最大的好處。自動化測試并能夠在每個sprint中快速重復(fù)測試,可以確保所有事情都按預(yù)期工作。
6. 衡量質(zhì)量指標(biāo)
可用于自動化測試的擴(kuò)展和工具提供了測量許多代碼質(zhì)量指標(biāo)的功能,例如代碼覆蓋率(即實(shí)際測試的代碼百分比),技術(shù)債,代碼語義檢查等。
通常,當(dāng)測試作為持續(xù)集成或DevOps工作流程的一部分執(zhí)行時,可同時獲取這些方面的測量數(shù)據(jù)。
之所以能夠測量這些指標(biāo),是因?yàn)樽詣踊瘻y試代碼本身與產(chǎn)品代碼共存,通過在自動構(gòu)建階段解析源代碼,能提供在幾分鐘內(nèi)測量巨大代碼庫質(zhì)量的機(jī)會。這在手動測試中根本不可能。
小結(jié)
如果您的產(chǎn)品質(zhì)量是您的首要目標(biāo),我強(qiáng)烈建議您使用自動化測試作為日常開發(fā)實(shí)踐的一部分。它將確保您的應(yīng)用程序得到正確測試,并為研發(fā)、管理人員和客戶提供信心。
自動化測試需要前期投入,并且需要花時間進(jìn)行開發(fā)。這些投入會得到長期的回報(bào):可以減少工作量,消除手動測試的錯誤,提高準(zhǔn)確性,最終節(jié)省成本和時間。
總的來說,自動化測試是一種比手動測試更快獲得故障反饋的方法,符合“快速失敗,早期失敗”的原則。它有助于實(shí)現(xiàn)手動測試無法提供的質(zhì)量。在自動化測試中,
行為驅(qū)動的自動化測試
現(xiàn)已廣泛為研發(fā)團(tuán)隊(duì)所接受,基于行為驅(qū)動(BDD)的測試腳本具有上手快、易維護(hù)、方便所有stakeholders溝通等特點(diǎn)。
如果您還沒有一款合適的自動化測試工具來確保軟件質(zhì)量,您可以了解
自動化測試框架包含哪些模塊
一個比較成熟的測試框架通常會包含 4 個部分,分別為基礎(chǔ)模塊,管理模塊,統(tǒng)計(jì)模塊和運(yùn)行模塊。
基礎(chǔ)模塊
造房子要穩(wěn)固需要良好的地基。如果把自動化測試框架比作一輛汽車,那么自動化測試基礎(chǔ)模塊就是那四只輪胎,沒有它們,這輛汽車寸步難行,它們一般包括如下部分。
可重用的組件
一般來說用來降低開發(fā)成本,常見有日志模塊,時間模塊等
配置文件
通常會包含測試環(huán)境的配置和應(yīng)用程序的配置。其中測試環(huán)境配置用來減少環(huán)境版本切換,從開發(fā)到上線
管理模塊
管理模塊就仿佛是車中的內(nèi)飾,它對測試框架的使用操作體驗(yàn)有著直接的影響,分為測試數(shù)據(jù)管理和測試文件管理
測試數(shù)據(jù)管理
測試數(shù)據(jù)一般是測試用例用到的各種測試數(shù)據(jù),他們是為了驗(yàn)證業(yè)務(wù)正確性而構(gòu)造,每一組的測試案例通常會對應(yīng)一對或多對測試數(shù)據(jù)。測試數(shù)據(jù)的創(chuàng)建又分為實(shí)時創(chuàng)建和事先創(chuàng)建,
實(shí)時創(chuàng)建是測試代碼運(yùn)行的時候才生成測試數(shù)據(jù)。好處是測試數(shù)據(jù)和測試代碼解耦合,測試人員不用關(guān)心創(chuàng)建過程和業(yè)務(wù)調(diào)用鏈,通常用在測試的公用功能上。
事先創(chuàng)建,是指測試代碼運(yùn)行前就準(zhǔn)備好的數(shù)據(jù)文件,其好處是數(shù)據(jù)拿來即用,幾乎不耗費(fèi)時間,由于沒有業(yè)務(wù)調(diào)用,所以這在一定程度上減少了調(diào)用失敗的風(fēng)險(xiǎn);壞處則是數(shù)據(jù)文件本身需要維護(hù),以保持可用性和正確性。
測試文件管理
測試文件管理就仿佛是車子的外觀,給人第一印象。一個測試用例通常需要包含三個文件,分別是Page類文件,測試類文件和對象庫文件。
這三個文件共同描述一個完整的測試用例。測試文件的結(jié)構(gòu)清晰有助于他人理解測試框架的設(shè)計(jì)思想
運(yùn)行模塊
運(yùn)行模塊為測試框架的發(fā)送機(jī),用于測試用例的組織和運(yùn)行,通常包含下面幾個部分
測試用例調(diào)度,驅(qū)動機(jī)制
錯誤恢復(fù)機(jī)制
測試框架應(yīng)該具有一定的錯誤恢復(fù)機(jī)制,測試案例執(zhí)行過程中,可能出現(xiàn)代碼運(yùn)行錯誤或環(huán)境導(dǎo)致的錯誤。
持續(xù)集成支持
測試框架應(yīng)該能夠和 CI 系統(tǒng)低成本集成,包括通過用戶輸入?yún)?shù)指定運(yùn)行環(huán)境、測試結(jié)束后自動生成測試報(bào)告等。
統(tǒng)計(jì)模塊
統(tǒng)計(jì)模塊相當(dāng)于車子的品質(zhì)和口碑。一個完整的統(tǒng)計(jì)模塊,可以告訴你當(dāng)前測試有沒有 Bug,還能分析軟件質(zhì)量的變化情況,統(tǒng)計(jì)模塊一般包含下面幾個模塊
測試報(bào)告
測試報(bào)告應(yīng)該全面,包括測試用例條數(shù)統(tǒng)計(jì)、測試用例成功/失敗百分比、測試用例總執(zhí)行時間等總體信息。其中,對于單條測試用例,還應(yīng)該包括測試用例 ID、測試用例運(yùn)行結(jié)果、測試用例運(yùn)行時間、測試用例所屬模塊、測試失敗時刻系統(tǒng)截圖、測試的日志等信息。
日志模塊
測試框架應(yīng)該包括完善的日志文件,方便出錯時進(jìn)行排查和定位。
常用的測試框架類型
有的時候,面試官可能也會用你知道哪些測試框架,測試框架分為這樣幾種
模塊化測試框架
模塊化測試框架是利用 OOP 思想和 PO 模式改造而來的框架。
模塊化測試框架把整個測試分為多個模塊,模塊化有以下幾個特征:
我們將一個業(yè)務(wù)或者一個頁面成為一個 Page 對象;
這個 Page 對象,我們以一個 Page 類來表示它;
這個 Page 類里存放有所有這個 Page所屬的頁面對象、元素操作;
頁面對象和元素操作組成一個個的測試類方法,供測試用例層調(diào)用。
簡單來說,使用了 PO 模式的框架就可以叫作模塊化測試框架。
模塊化測試框架的好處在于方便維護(hù),你的測試用例可以由不同模塊的不同對象組成;
壞處在于你需要非常了解你的系統(tǒng)及這些模塊是如何劃分的,才能在測試腳本里自如地使用,否則你就會陷入重復(fù)定義模塊對象的循環(huán)里。
數(shù)據(jù)驅(qū)動框架
數(shù)據(jù)驅(qū)動框架主要是解決測試數(shù)據(jù)問題。
在測試中,我們常常需要為同一個測試邏輯,構(gòu)造不同的測試數(shù)據(jù)以滿足業(yè)務(wù)需求,這些測試數(shù)據(jù)可以保存在測試代碼里,也可以保存在外部文件里(包括 Excel、File、DB)。
數(shù)據(jù)驅(qū)動框架的精髓在于,輸入 M 組數(shù)據(jù),框架會自動構(gòu)造出 M 個測試用例,并在測試結(jié)果中把每一個測試用例的運(yùn)行結(jié)果獨(dú)立展示出來。
在 Python 架構(gòu)里,最出名的數(shù)據(jù)驅(qū)動框架就是 DDT。
關(guān)鍵字驅(qū)動框架
當(dāng)把一系列代碼封裝為要給關(guān)鍵字,在測試的過程中,通過組合關(guān)鍵字的方式來生成測試用例,而不關(guān)心關(guān)鍵字如何運(yùn)作的,這種為關(guān)鍵字驅(qū)動框架。
混合模型
并不一定要選擇上面的三種框架之一,需要根據(jù)需求靈活的選擇測試框架,在工作中可能經(jīng)常需要糅合不同的框架模型,這樣的模型就叫做混合模型。
測試框架設(shè)計(jì)原則
首先是清晰明了,學(xué)習(xí)成本低
其中包含代碼規(guī)范和模塊清晰明確。
通用性強(qiáng),可維護(hù),可擴(kuò)展
對錯誤的處理能力強(qiáng)
錯誤處理機(jī)制,能高效解決。系統(tǒng)日志清晰,方便調(diào)試。
運(yùn)行效率高且功能強(qiáng)大
支持測試環(huán)境切換,支持外部數(shù)據(jù)驅(qū)動,支持順序并發(fā),遠(yuǎn)程運(yùn)行,報(bào)告完備詳盡。
支持版本控制和持續(xù)集成
版本控制回溯復(fù)盤,持續(xù)集成全局出發(fā)
如何設(shè)計(jì)一個不錯的測試案例
「好的」測試用例一定是一個完備的集合,它能夠覆蓋所有等價類以及各種邊界值,而跟能否發(fā)現(xiàn)缺陷無關(guān)。
一個“好的”測試用例,必須具備以下三個特征 ? 。
整體完備性 ? :「好的」測試用例一定是一個完備的整體,是有效測試用例組成的集合,能夠完全覆蓋測試需求。
等價類劃分的準(zhǔn)確性 ? :指的是對于每個等價類都能保證只要其中一個輸入測試通過,其他輸入也一定測試通過。
等價類集合的完備性 ? :需要保證所有可能的邊界值和邊界條件都已經(jīng)正確識別。
三種最常用的測試用例設(shè)計(jì)方法:等價類劃分法、邊界值分析法、錯誤推測方法。
第一,等價類劃分法
我們只要從每個等價類中任意選取一個值進(jìn)行測試,就可以用少量具有代表性的測試輸入取得較好的測試覆蓋結(jié)果。現(xiàn)在,我給你看一個具體的例子:學(xué)生信息系統(tǒng)中有一個考試成績的輸入項(xiàng),成績的取值范圍是 0~100 之間的整數(shù),考試成績及格的分?jǐn)?shù)線是 60。為了測試這個輸入項(xiàng),顯然不可能用 0~100 的每一個數(shù)去測試。通過需求描述可以知道,輸入 0~59 之間的任意整數(shù),以及輸入 60~100 之間的任意整數(shù),去驗(yàn)證和揭露輸入框的潛在缺陷可以看做是等價的。那么這就可以在 0~59 和 60~100 之間各隨機(jī)抽取一個整數(shù)來進(jìn)行驗(yàn)證。這樣的設(shè)計(jì)就構(gòu)成了所謂的“有效等價類”。
你不要覺得進(jìn)行到這里,已經(jīng)完成了等價類劃分的工作,因?yàn)榈葍r類劃分方法的另一個關(guān)鍵點(diǎn)是要找出所有「無效等價類」 。顯然,如果輸入的成績是負(fù)數(shù),或者是大于100的數(shù)等都構(gòu)成了“無效等價類”。
在考慮了無效等價類后,最終設(shè)計(jì)的測試用例為:
有效等價類1:0~59之間的任意整數(shù);
有效等價類2:59~100之間的任意整數(shù);
無效等價類1:小于0的負(fù)數(shù);
無效等價類2:大于100的整數(shù);
無效等價類3:0~100之間的任何浮點(diǎn)數(shù);
無效等價類4:其他任意非數(shù)字字符。
第二,邊界值分析方法 ? ? ? ? ? ?
邊界值分析是對等價類劃分的補(bǔ)充,你從工程實(shí)踐經(jīng)驗(yàn)中可以發(fā)現(xiàn),大量的錯誤發(fā)生在輸入輸出的邊界值上,所以需要對邊界值進(jìn)行重點(diǎn)測試,通常選取正好等于、剛剛大于或剛剛小于邊界的值作為測試數(shù)據(jù)。我們繼續(xù)看學(xué)生信息系統(tǒng)中“考試成績”的例子,選取的邊界值數(shù)據(jù)應(yīng)該包括:-1,0,1,59,60,61,99,100,101。
第三,錯誤推測方法 ?
錯誤推測方法是指基于對被測試軟件系統(tǒng)設(shè)計(jì)的理解、過往經(jīng)驗(yàn)以及個人直覺,推測出軟件可能存在的缺陷,從而有針對性地設(shè)計(jì)測試用例的方法。** ? ? 這個方法強(qiáng)調(diào)的是對被測試軟件的需求理解以及設(shè)計(jì)實(shí)現(xiàn)的細(xì)節(jié)把握,當(dāng)然還有個人的能力。
錯誤推測法和目前非常流行的“探索式測試方法”的基本思想和理念是不謀而合的,這類方法在目前的敏捷開發(fā)模式下的投入產(chǎn)出比很高,因此被廣泛應(yīng)用。但是,這個方法的缺點(diǎn)也顯而易見,那就是難以系統(tǒng)化,并且過度依賴個人能力。
總結(jié):在我看來,深入理解被測軟件需求的最好方法是,測試工程師在需求分析和設(shè)計(jì)階段就開始介入,因?yàn)檫@個階段是理解和掌握軟件的原始業(yè)務(wù)需求的最好時機(jī)。
計(jì)算機(jī)基礎(chǔ)
計(jì)算機(jī)基礎(chǔ)部分,如果時間緊張,可以直接看計(jì)算機(jī)網(wǎng)絡(luò)和數(shù)據(jù)庫的面試總結(jié)。如果想要更加精細(xì)的去學(xué)習(xí)相關(guān)的內(nèi)容,可以參考我之前寫的那篇2021C++學(xué)習(xí)路線,其中的計(jì)算機(jī)基礎(chǔ)部分是通用內(nèi)容。到
Python基礎(chǔ)
這里推薦大家看看《python入門到實(shí)踐》這本書,看完基本上就能使用 Python 了。
我們需要了解什么是 Python,它和 Java/C++有什么不一樣,基本數(shù)據(jù)類型有哪些,Python 控制流(for,while)怎么用。
Python 中 包管理,函數(shù),模塊之間的關(guān)系等等。當(dāng)了解了基礎(chǔ)知識以后,就可以去看看匿名函數(shù)(lambda)如何使用,自省和反射是什么意思,閉包的基本概念,如何實(shí)現(xiàn)要給裝飾器等等。這里總結(jié)了一部分題目,可以參考,如果不明白或不清楚或覺得不對的地方,大家一定要記的去查閱哦。
什么是Python的命名空間?
在Python中,所有的名字都存在于一個空間中,它們在該空間中存在和被操作——這就是命名空間。它就好像一個盒子,每一個變量名字都對應(yīng)裝著一個對象。當(dāng)查詢變量的時候,會從該盒子里面尋找相應(yīng)的對象。
主(main)函數(shù)的作用
作為整個程序文件的入口。
調(diào)試代碼的時候,在if name__ == ‘__main’中加入一些我們的調(diào)試代碼,我們可以讓外部模塊調(diào)用的時候不執(zhí)行我們的調(diào)試代碼,但是如果我們想排查問題的時候,直接執(zhí)行該模塊文件,調(diào)試代碼能夠正常運(yùn)行!
cookie和session的關(guān)系和區(qū)別
由于 HTTP 協(xié)議是無狀態(tài)的協(xié)議,所以服務(wù)端需要記錄用戶的狀態(tài)時,就需要用某種機(jī)制來識具體的用戶,這個機(jī)制就是 Session.典型的場景比如購物車,當(dāng)你點(diǎn)擊下單按鈕時,由于 HTTP 協(xié)議無狀態(tài),所以并不知道是哪個用戶操作的,所以服務(wù)端要為特定的用戶創(chuàng)建了特定的 Session,用于標(biāo)識這個用戶,并且跟蹤用戶,這樣才知道購物車?yán)锩嬗袔妆緯_@個 Session 是保存在服務(wù)端的,有一個唯一標(biāo)識。在服務(wù)端保存 Session 的方法很多,內(nèi)存、數(shù)據(jù)庫、文件都有。集群的時候也要考慮 Session 的轉(zhuǎn)移,在大型的網(wǎng)站,一般會有專門的 Session 服務(wù)器集群,用來保存用戶會話,這個時候 Session 信息都是放在內(nèi)存的,使用一些緩存服務(wù)比如 Memcached 之類的來放 Session。
思考一下服務(wù)端如何識別特定的客戶?這個時候 Cookie 就登場了。每次HTTP請求的時候,客戶端都會發(fā)送相應(yīng)的Cookie信息到服務(wù)端。實(shí)際上大多數(shù)的應(yīng)用都是用 Cookie 來實(shí)現(xiàn) Session 跟蹤的,第一次創(chuàng)建 Session 的時候,服務(wù)端會在HTTP協(xié)議中告訴客戶端,需要在 Cookie 里面記錄一個 Session ID,以后每次請求把這個會話 ID 發(fā)送到服務(wù)器,我就知道你是誰了。
有人問,如果客戶端的瀏覽器禁用了 Cookie 怎么辦?一般這種情況下,會使用一種叫做 URL 重寫的技術(shù)來進(jìn)行會話跟蹤,即每次 HTTP 交互,URL 后面都會被附加上一個諸如 sid=xxxxx 這樣的參數(shù),服務(wù)端據(jù)此來識別用戶。
Cookie 其實(shí)還可以用在一些方便用戶的場景下,設(shè)想你某次登陸過一個網(wǎng)站,下次登錄的時候不想再次輸入賬號了,怎么辦?這個信息可以寫到 Cookie 里面,訪問網(wǎng)站的時候,網(wǎng)站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是 Cookie 名稱的由來,給用戶的一點(diǎn)甜頭。
所以,總結(jié)一下:
Session是在服務(wù)端保存的一個數(shù)據(jù)結(jié)構(gòu),用來跟蹤用戶的狀態(tài),這個數(shù)據(jù)可以保存在集群、數(shù)據(jù)庫、文件中;
Cookie是客戶端保存用戶信息的一種機(jī)制,用來記錄用戶的一些信息,也是實(shí)現(xiàn)Session的一種方式。
new 和 init 的區(qū)別
new:創(chuàng)建對象時調(diào)用,會返回當(dāng)前對象的一個實(shí)例
init:創(chuàng)建完對象后調(diào)用,對當(dāng)前對象的一些實(shí)例初始化,無返回值
調(diào)用順序:先調(diào)用new__生成一個實(shí)例再調(diào)用__init方法對實(shí)例進(jìn)行初始化,比如添加屬性。
參數(shù)傳遞機(jī)制
如果實(shí)際參數(shù)的數(shù)據(jù)類型是可變對象(列表、字典),則函數(shù)參數(shù)的傳遞方式將采用引用傳遞方式。如果是不可變的,比如字符串、數(shù)值、元組,他們就是按值傳遞。
迭代器
迭代器是訪問集合元素的一種方式,他的對象從集合的第一個元素開始訪問,直到所有元素被訪問完結(jié)束,用iter()創(chuàng)建迭代器,調(diào)用next()函數(shù)獲取對象(迭代只能往前不能后退)。
兩者區(qū)別:
創(chuàng)建/生成,生成器創(chuàng)建一個函數(shù),用關(guān)鍵字yield生成/返回對象;迭代器用內(nèi)置函數(shù)iter()和next()
生成器中yield語句的數(shù)目可以自己在使用時定義,迭代器不能超過對象數(shù)目
生成器yield暫停循環(huán)時,生成器會保存本地變量的狀態(tài);迭代器不會使用局部變量,更節(jié)省內(nèi)存
PYTHONPATH變量是什么
Python中的環(huán)境變量,用于在導(dǎo)入模塊的時候搜索路徑。因此它必須包含Python源庫目錄以及含有Python源代碼的目錄。
模塊和包
模塊:python中包含并有組織的代碼片段,xxx.py的xxx就是模塊名
包:模塊之上的有層次的目錄結(jié)構(gòu),定義了由很多模塊或很多子包組成的應(yīng)用程序執(zhí)行環(huán)境。包是一個包含init.py文件和若干模塊文件的文件夾。
庫:具有相關(guān)功能模塊的集合,python有很多標(biāo)準(zhǔn)庫、第三方庫…
yield
保存當(dāng)前運(yùn)行狀態(tài)(斷點(diǎn)),然后暫停執(zhí)行,即將函數(shù)掛起
將yeild關(guān)鍵字后面表達(dá)式的值作為返回值返回,此時可以理解為起到了return的作用,當(dāng)使用next()、send()函數(shù)讓函數(shù)從斷點(diǎn)處繼續(xù)執(zhí)行,即喚醒函數(shù)。
args和*kwargs的含義
不知道向函數(shù)傳遞多少參數(shù)時,比如傳遞一個列表或元組,就使用*args
def?func(*args):…?
????Func(1,2,3,4,5)?
不知道該傳遞多少關(guān)鍵字參數(shù)時,使用 **kwargs 來收集關(guān)鍵字參數(shù)(keyword argument)
python
def func(**kwargs):…
Func(a=1,b=2,c=3)
Python垃圾回收機(jī)制
(自動處理分配回收內(nèi)存的問題,沒用了內(nèi)存泄漏的隱患),以引用計(jì)數(shù)機(jī)制為主,標(biāo)記-清楚和分代收集兩種機(jī)制為輔
計(jì)數(shù)機(jī)制就是 Python 中的每一個對象都有一個引用計(jì)數(shù)的值,當(dāng)有引用的時候,這個值會增加,引用他的對象被刪除時,這個值減小,引用計(jì)數(shù)的值為0時,該對象生命結(jié)束,Python 會把這段內(nèi)存自動回收。(缺點(diǎn),循環(huán)引用,如果 l1 和 l2 相互引用,沒用其他的對象引用他們,這兩段內(nèi)存永遠(yuǎn)無法被回收)
Python如何內(nèi)存管理
引用計(jì)數(shù):python內(nèi)部使用引用計(jì)數(shù),來保持追蹤內(nèi)存中的對象,Python內(nèi)部記錄了對象有多少個引用,即引用計(jì)數(shù),當(dāng)對象被創(chuàng)建時就創(chuàng)建了一個引用計(jì)數(shù),當(dāng)對象不再需要時,這個對象的引用計(jì)數(shù)為0時,它被垃圾回收。
垃圾回收:python會檢查引用計(jì)數(shù)為0的對象,清除其在內(nèi)存占的空間;循環(huán)引用對象則用一個循環(huán)垃圾回收器來回收
內(nèi)存池機(jī)制:在Python中,許多時候申請的內(nèi)存都是小塊的內(nèi)存,這些小塊內(nèi)存在申請后,很快又會被釋放,由于這些內(nèi)存的申請并不是為了創(chuàng)建對象,所以并沒有對象一級的內(nèi)存池機(jī)制。這就意味著Python在運(yùn)行期間會大量地執(zhí)行 malloc 和 free 的操作,頻繁地在用戶態(tài)和核心態(tài)之間進(jìn)行切換,這將嚴(yán)重影響Python的執(zhí)行效率。為了加速Python的執(zhí)行效率,Python引入了一個內(nèi)存池機(jī)制,用于管理對小塊內(nèi)存的申請和釋放。
Python 提供了對內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。
Python 中所有小于 256 個字節(jié)的對象都使用 pymalloc 實(shí)現(xiàn)的分配器,而大的對象則使用系統(tǒng)的 malloc。另外 Python 對象,如整數(shù),浮點(diǎn)數(shù)和List,都有其獨(dú)立的私有內(nèi)存池,對象間不共享他們的內(nèi)存池。也就是說如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)。
深拷貝、淺拷貝和等號賦值
深拷貝:新建一個對象,把原來對象的內(nèi)存完全復(fù)制過來,改變復(fù)制后的對象,不會改動原來內(nèi)存的內(nèi)容。(兩個對象在復(fù)制之后是完全獨(dú)立的對象)
等號賦值:相當(dāng)于為原來的對象打一個新的標(biāo)簽,兩個引用指向同一個對象,修改其中的一個,另一個也會產(chǎn)生變化
淺拷貝:兩種情況,1. 淺拷貝的值是不可變對象(數(shù)值、字符、元組)時,和等于賦值一樣,對象的id值和淺拷貝原來的值相同;2. 如果是可變對象(列表、字典等),a. 一個簡單的沒有嵌套的對象,復(fù)制前后的對象相互之間不會影響,b. 對象中有復(fù)雜子對象,如列表嵌套,如果改變原來的對象中復(fù)雜子對象的值,淺拷貝的值也會受影響,因?yàn)樵跍\拷貝時只復(fù)制了子對象的引用(只拷貝父對象)。
Python有什么優(yōu)勢
解釋型,語法簡單易懂,可讀性強(qiáng)
有很多庫可以用,可以讓我們站在巨人的肩膀上簡單的實(shí)現(xiàn)想要的功能
可擴(kuò)展,和其他編程語言或其他軟件有可連接的接口
免費(fèi)開源、可移植
自動內(nèi)存管理,讓程序員可以專注于代碼的實(shí)現(xiàn)
Python 缺點(diǎn)
他的可解釋特征使其運(yùn)行速度變慢
動態(tài)語言的特點(diǎn)可能會增加運(yùn)行時錯誤。
面向?qū)ο蠛兔嫦蜻^程的區(qū)別
面向?qū)ο笫前褬?gòu)成問題的事務(wù)分解成各個對象,建立對象來描述某個事務(wù)在解決問題的步驟中的行為;
面向過程是分析出解決問題所需要的步驟,然后用一些函數(shù)把這些步驟一步步實(shí)現(xiàn),使用的時候依次調(diào)用函數(shù)就行了。
寫一個裝飾器
import??functools
import?time
def?print_run_time(func):
[email protected](func)?def?wrapper(*args,**kw):
????????local_time=time.time()
????????func(*args,**kw)
????????t=time.time()-local_time
????????print(t)
????return?wrapper
@print_run_time
def?test(x):
????for?i?in?range(1000):
????????print(x,end='')
????print('\n')
????return?x
test(1)?
python 裝飾器@staticmethod和@classmethod區(qū)別和使用
@classmethod:類方法,類方法是給類用的,類在使用時會將類本身當(dāng)做參數(shù)傳給類方法的第一個參數(shù),python為我們內(nèi)置了函數(shù)classmethod來把類中的函數(shù)定義成類方法。
@staticmethod:靜態(tài)方法
用上面兩個裝飾器就可以不用在實(shí)用類前對類進(jìn)行實(shí)例化了,
@property:將一個實(shí)例方法提升為屬性,便于訪問
Git
如果說功能測試工程師的日常工作是被測試用例文檔包圍,那么測試工程師則從代碼提交說起。
在當(dāng)前高度協(xié)作的今天,測試開發(fā)的任務(wù)也是各個負(fù)責(zé)相應(yīng)的模塊,每個模塊不同人負(fù)責(zé),那么可能就出現(xiàn)下面這些問題
你和別人負(fù)責(zé)不同的模塊,代碼都提交后入俄整合
如果你在修改一份公共代碼,別人也在修改,如何提交和保存
如果想看人家提交的歷史記錄,如何回滾
說白了,我們需要一個版本控制系統(tǒng)來跟蹤我們的代碼,從而更好地解決沖突。
為啥大家都用 Git呢
高效的數(shù)據(jù)存儲方式
和其他的版本控制軟件不同的是,Git并不以文件表更列表的方式存儲信息,而是采用了快照流的方式對信息進(jìn)行存儲。
在 Git 提交更新的時候,Git會對項(xiàng)目全部文件創(chuàng)建一個快照并保存這個快照的索引。當(dāng)再次提交,更新的時候,如果存在沒有修改的文件,那么 Git 只保留一個鏈接指向之前存儲的文件,而不再重新存儲該文件,這樣就提高了存儲效率。
幾乎所有操作在本地執(zhí)行
在 Git 中,絕大部分的操作訪問本地文件和資源都無需聯(lián)網(wǎng)。
具備數(shù)據(jù)完整性保障
在 Git 中,任何操作在被操作前都需要使用 SHA-1 散列計(jì)算校驗(yàn)來保障數(shù)據(jù)的完整性。
Git 的工作流程
在 Git 中,項(xiàng)目文件可能處于這樣三種形態(tài)
已修改:表示修改了文件但還沒有保存到數(shù)據(jù)庫
已暫存:表示對一個已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中
已提交:表示數(shù)據(jù)已經(jīng)安全地保存在本地?cái)?shù)據(jù)庫中
Git 項(xiàng)目的三個節(jié)點(diǎn)
對應(yīng)上面三種狀態(tài),會有三個階段,為工作區(qū),暫存區(qū)和 Git 目錄。
工作區(qū)
工作區(qū)是從 Git 倉庫提取出來的數(shù)據(jù),也就是我們本地看到的代碼目錄,這里改動的代碼都在已修改狀態(tài)。
暫存區(qū)
暫存區(qū)是一個文件,保存了下次將要提交的文件列表信息,一般在 Git 倉庫目錄中。當(dāng)處于已修改狀態(tài)的文件被放入暫存區(qū)(Git Add)時,這些文件則會變?yōu)橐褧捍鏍顟B(tài)。
Git 目錄
Git 倉庫目錄是 Git 用來保存項(xiàng)目的元數(shù)據(jù)和對象數(shù)據(jù)庫的地方。從其他計(jì)算機(jī)克隆倉庫時,復(fù)制的就是這里的數(shù)據(jù)。當(dāng)暫存區(qū)的文件被提交(Git Commit),則這些文件屬于已提交狀態(tài)。

Git 實(shí)踐
通過上方的內(nèi)容了解 Git 以后,最好動手實(shí)踐一波。
安裝 Git
Git ?基本設(shè)置
流程
在公司中,通常都通過 Github 企業(yè)版或 GitLab 進(jìn)行托管,那么測試開發(fā)使用 Git 流程大概如下

通常在本地 Feature 分支進(jìn)行開發(fā),隨后提交測試,本地測試完成則 pull request方式提交代碼,測試驗(yàn)證,驗(yàn)證完成后 Github 會根據(jù)條件自動出發(fā)測試驗(yàn)證流程,代碼 Merge,通過后 Merge 到 Master。
如果是新項(xiàng)目,如何初始化 Git 項(xiàng)目呢
首先通過 Git init 初始化項(xiàng)目,此時 Git 倉庫為空的,那我們就新建一個文件叫做 lanlan.py,寫完以后通過 git ?add 的方式提交到暫存區(qū)。
如果想刪除這個文件,那么可以通過 git rm 來刪除某個文件。
如果你想要查看當(dāng)前版本庫的狀態(tài),可以使用 git status,它將列出文件夾在工作區(qū)和暫存區(qū)的狀態(tài)。
如果想要將暫存區(qū)的改動提交到本地版本庫,那就可使用 git commit -m,這里的 -m 后面一定要記得些提交的注釋喲。
如果想要本地的這份代碼提交到遠(yuǎn)程進(jìn)行協(xié)作開發(fā),就需要使用下面的語句
#如下語法用來添加一個遠(yuǎn)程倉庫
$?git?remote?add?[shortname]?[url]
#將本地倉庫lagouTest和遠(yuǎn)程倉庫建立連接
$?git?remote?add?origin?https://github.com/yourCompany/lagouTest.git
既然是團(tuán)隊(duì)開發(fā)了,那么就先把本地版本代碼傳到遠(yuǎn)程庫,這樣其他的開發(fā)人員就可以拉取最新的代碼
git?push?-u?origin?master
想要獲取最新的代碼,就需要使用 git clone 拉去最新代碼。
可是通常不會在 master 上進(jìn)行開發(fā),而是需要切換分支,使用 git checkout -b name 的方式切換分支。
使用 Git 的時候,可能遇到哪些問題呢
如何查看提交的歷史
如果想要查看某個文件的提交歷史,可以使用 git log filename 或 git log lanlan.py 的方式查看
如果本地正在開發(fā),遠(yuǎn)程的 master 已經(jīng)更新了,如何更到本地分支
#?假設(shè)本地feature分支為newFeature
#?首先需要提交本地分支newFeature的改動至代碼倉庫
$?git?add?.
$?git?commit?-m?"本地分支修改comments"
#?然后,執(zhí)行g(shù)it?merge
$?git?merge?master
#?最后,再次提交
$?git?add?.
$?git?commit?-m?"merge?master?分支"
提交的時候出現(xiàn)沖突怎么辦
當(dāng)多人更改同一文件的時候就會出現(xiàn)沖突,此時 git 會列舉出沖突的內(nèi)容,可以通過手動的方式保留哪個版本,然后 git add 和 git commit 的方式再次提交
當(dāng)你正在進(jìn)行分支開發(fā)時,接到一個緊急任務(wù),如何將當(dāng)前的改動保留和后續(xù)恢復(fù)?
當(dāng)你的 feature 分支開發(fā)了一半,然后接到了緊急任務(wù)需要支持,但是你又不想把功能不完善的代碼提交到代碼倉庫,此時可以使用 git stash 命令。
#?如果你要切換新分支但是有未保存的更改使用git checkout -b會報(bào)錯。此#?時可以通過git stash將所有未提交的修改(工作區(qū)和暫存區(qū))保存至堆棧#?#?中,可用于后續(xù)恢復(fù).
$?git?stash
#?等你想恢復(fù)你保存的改動時,執(zhí)行g(shù)it stash pop。?它將緩存堆棧中的第一個stash刪除,并將對應(yīng)修改應(yīng)用到當(dāng)前的工作目錄下。
$?git?stash?pop
本地提交已提交到暫存區(qū),但是不想要了怎么辦?
假設(shè)你的某次改動已經(jīng)提交到暫存區(qū),還沒有 push,但是你想丟棄這個改動,可以采用如下辦法:
$?git?reset?--hard?HEAD
上線后有問題,代碼需要回退怎么辦?
$?git?revert?HEAD
$?git?push?origin?master

Linux
之前那一篇 3w 字的 Linux總結(jié)看完就差不多了哦,鏈接在此,在星球中同樣是有 PDF。



Docker
Docker基礎(chǔ)部分在之前的文章也給出了,大家可以花時間去學(xué)習(xí)一波。
Docker容器圈簡介

第二趴---Docker基本操作

數(shù)據(jù)庫
數(shù)據(jù)庫計(jì)劃的是三個部分,第一部分?jǐn)?shù)據(jù)庫基礎(chǔ)之前也完成了,不少小伙伴也打卡學(xué)習(xí)完了基礎(chǔ)部分,下個周會給出數(shù)據(jù)庫索引的面試題,一起加油哦。
操作系統(tǒng)
CICD
持續(xù)集成
持續(xù)集成(Continuous integration,簡稱CI),簡單來說持續(xù)集成就是頻繁地(一天多次)將代碼集成到主干。
每次集成都通過自動化的構(gòu)建(包括編譯、發(fā)布、自動化測試)來驗(yàn)證,從而盡快地發(fā)現(xiàn)集成錯誤。

持續(xù)集成強(qiáng)調(diào)開發(fā)人員提交了新代碼之后,立刻進(jìn)行構(gòu)建、(單元)測試。根據(jù)測試結(jié)果,可以確定新代碼和原有代碼能否正確地集成在一起。
持續(xù)集成的好處:
快速發(fā)現(xiàn)錯誤,每完成一點(diǎn)更新,就集成到主干,可以快速發(fā)現(xiàn)錯誤,定位錯誤也比較容易;
防止分支大幅偏離主干,如果不經(jīng)常集成,主干又在不斷更新,會導(dǎo)致以后集成的難度變大,甚至難以集成。
持續(xù)集成的目的
讓產(chǎn)品可以快速迭代,同時還能保持高質(zhì)量。它的核心措施是,代碼集成到主干之前,必須通過自動化測試。只要有一個測試用例失敗,就不能集成。
持續(xù)集成并不能消除 Bug,而是讓它們非常容易的發(fā)現(xiàn)和改正。

持續(xù)集成強(qiáng)調(diào)開發(fā)人員提交了新代碼之后,立刻進(jìn)行構(gòu)建、(單元)測試。根據(jù)測試結(jié)果,我們可以確定新代碼和原有代碼能否正確地集成在一起。
持續(xù)交付
持續(xù)交付(Continuous delivery)指的是:頻繁地將軟件的新版本,交付給質(zhì)量團(tuán)隊(duì)或者用戶,以供評審。如果評審?fù)ㄟ^,代碼就進(jìn)入生產(chǎn)階段

持續(xù)交付可以看作持續(xù)集成的下一步。它強(qiáng)調(diào)的是,不管怎么更新,軟件是隨時隨地可以交付的。
持續(xù)部署
持續(xù)部署(Continuous deployment)是持續(xù)交付的下一步,指的是代碼通過評審以后,自動部署到生產(chǎn)環(huán)境。

持續(xù)部署則是在持續(xù)交付的基礎(chǔ)上,把部署到生產(chǎn)環(huán)境的過程自動化。
持續(xù)部署的目標(biāo)是:代碼在任何時候都是可以部署的,可以進(jìn)入生產(chǎn)階段,持續(xù)部署的前提是能自動化完成測試、構(gòu)建、部署等步驟。
Selenium面試題
之前給星球的小伙伴修改簡歷,發(fā)現(xiàn)想要面試自動化測試相關(guān)的崗位,然而基本上沒有這方面的復(fù)習(xí)準(zhǔn)備,項(xiàng)目經(jīng)驗(yàn)也沒有。如果大家需要相關(guān)的項(xiàng)目,也可以找我拿羅,我都放在星球了。
什么是Selenium?
Selenium是一個開源的web自動化測試框架,主要是基于web uI的自動化測試。現(xiàn)在的版本,逐步增加了對移動端的自動化測試。Selenium支持多種語言進(jìn)行開發(fā)自動化測試腳本,有Java,python,C#,Javascript等等。Selenium支持跨瀏覽器平臺測試。
Selenium是否支持桌面應(yīng)用軟件的自動化測試。
Selenium不支持桌面軟件的自動化測試,Selenium是根據(jù)網(wǎng)頁元素的屬性才定位元素,而其他桌面軟件自動化測試工具是根據(jù)桌面元素的位置來定位元素,當(dāng)然現(xiàn)在也有根據(jù)桌面元素的屬性來定位的。
Selenium是否支持用例的執(zhí)行的引擎。
引擎好比就是一個發(fā)動機(jī)。Selenium是沒有關(guān)于測試用例和測試套件管理和執(zhí)行的模塊。我們需要借助第三方單元測試框架來實(shí)現(xiàn)用例管理和用例的執(zhí)行。例如Java中有Junit或者testNG,Python中有unittest單元測試框架。
Seleinum是否有讀取excel文件的庫
沒有,這里需要用到第三方工具。例如Apache POI插件。
Selenium有哪些組件?
最早的有Selenium IDE,IDE只支持安裝在fiefox上一個插件,支持錄制自動化腳本。還有
remote RC,和Grid 和webdriver。我們一般最重要的就是使用webdriver。
Selenium有什么限制或者缺陷
除了基于web的軟件和mobile的程序,selenium不支持桌面軟件自動化測試。軟件測試報(bào)告,和用例管理只能
依賴第三方插件,例如Junit/TestNG和unittest。由于它是免費(fèi)的軟件,所以沒有供應(yīng)商去提供支持和服務(wù),有問題,只能求助selenium社區(qū)。還有一個就是,selenium入門門檻可能有點(diǎn)高,需要具備一定編程語言基礎(chǔ)的才能玩轉(zhuǎn)。
在selenium中,有哪些不同定位元素方法
ID/className/Name/LinkText/PartialLinkText/Xpath/CSS selector
什么是imlicitlyWait
imlicitlyWait是隱式等待,一般在查找元素的時候使用。例如,我設(shè)置一個查找元素最大時間為10秒,使用了
imlicitlyWait后,如果第一次沒有找到元素,會在10秒之內(nèi)不斷循環(huán)去找元素,知道超過10秒,報(bào)超時錯誤。
什么是expliciteWait
這個是顯式等待,就是不管如何都是要等10秒,如果你設(shè)置了10秒超時,這個是selenium2的功能
在selenium3中,我暫時沒有找到這個接口。
什么是線程等待
有時候,我們需要強(qiáng)制設(shè)置線程等待,Thread.sleep(2000),driver這個實(shí)例,就是當(dāng)前的線程。
什么是pollingEvery
這個是設(shè)置個一段時間就去做一件事,例如下面設(shè)置隔一秒就去查找元素一次。
WebDriverWait?wait?=?new?WebDriverWait(driver,30);
wait.pollingEvery(1,?TimeUnit.SECONDS);
driver.findElement(By.xpath("xxxx"));
你能解釋下Selenium這個框架嗎?
這個問題在面試中被問到的概率還是比較高的,同樣類似的問題有,selenium 的原理是什么?首先不要被這個問題嚇到,我們主要圍繞 selenium 的歷史版本演化和基本的組件去展開描述就好,最后回到 webdriver 這個組件上面,我們基本上都是在使用webdriver提供的API。所以這個題目的最好的答案就是把圖畫出來,然后自己解釋幾句就可以。早期 Selenium1.0 是有 Selenium Grid,Selenium RC, Selenium IDE, Webdriver 四部分組成,后來 Selenium RC 和 Webdriver 合并之后,就是 Selenium2,當(dāng)前我們在使用 Selenium3。
Selenium Grid:它是selenium框架的一部分,主要是專門用來把測試用例并行地在不同瀏覽器,不同操作系統(tǒng),不同機(jī)器上運(yùn)行。一般我們寫腳本,調(diào)試都在單機(jī)上線性地一個測試用例接著一個測試用例執(zhí)行下去。如果有人問題如何提高測試用例執(zhí)行效率,告訴他Selenium Grid可以實(shí)現(xiàn)。Selenium IDE: 這個算Selenium里面最簡單的一個組建,只支持在火狐瀏覽器上安裝這個擴(kuò)展程序,支持錄制web ui腳本,然后導(dǎo)出不同語言的腳本,例如java c#等。這個功能算雞肋,因?yàn)楹芏鄷r候?qū)С瞿_本debug的時間還不如自己代碼重新寫來的快。
Selenium RC: RC是remote control的縮寫,主要的功能就是讓你不管使用什么語言(Selenium支持的這幾種語言之一)來寫測試腳本,只要是這個瀏覽器支持java script,那么寫一遍測試腳本,都能在這些不同瀏覽器運(yùn)行腳本。
Webdriver:這個是用來替代Selenium RC,就是一個網(wǎng)頁自動化工具,支持在不同瀏覽器上運(yùn)行測試腳本,運(yùn)行速度比Selenium RC要快很多。據(jù)說(我也記得不清楚),webdriver最早是google內(nèi)部開發(fā)的一個工具,用來捐給selenium了,變成開源了。
目前,我們做的 web ui 的自動化測試,大部分都是在使用 webdriver 提供的 API來模擬手動測試過程中的一系列動作和行為。基本上通過這個方式來回答這個問題,那就沒問題了。
你寫的測試腳本能在不同瀏覽器上運(yùn)行嗎,支持跨瀏覽器平臺嗎
這里出現(xiàn)了跨瀏覽器平臺的概念,就是寫一個測試用例,可以在主流的幾個瀏覽器跑起來。
是的,我寫的測試用例能在IE,火狐和谷歌這三種瀏覽器上運(yùn)行。主要是在windows平臺上運(yùn)行腳本,所以mac的safari瀏覽器暫時沒有寫過。主要實(shí)現(xiàn)這個跨瀏覽器的思想就是,把瀏覽器類型寫到配置文件,代碼里寫if語句去判斷配置文件的瀏覽器的類型,來決定用什么瀏覽器去執(zhí)行測試用例。
什么是POM,為什么要使用它
POM 是 Page Object Model 的簡稱,它是一種設(shè)計(jì)思想,而不是框架。大概的意思是,把一個一個頁面,當(dāng)做一個對象,頁面的元素和元素之間操作方法就是頁面對象的屬性和行為,所以自然而然就用了類的思想來組織我們的頁面。一般一個頁面寫一個類文件,這個類文件包含該頁面的元素定位和業(yè)務(wù)操作方法。
為了我們測試用例寫的簡單,清晰,我們很多時候在頁面對象會封裝很多業(yè)務(wù)操作方法,測試腳本只需要調(diào)用相關(guān)方法就可以。
還有一個可能和這個問題相關(guān)的面試題,如果頁面元素經(jīng)常發(fā)生需求變化,你是如何做,答案就是采用 POM 思想。好處就是只要該一個頁面,我就去修改這個頁面對象的元素定位和相關(guān)方法,腳本不需要修改。
在你做自動化過程中,遇到了什么問題嗎?舉例下
這個問題,不管是自動化還是任何工作,都會被問到。主要想知道你是如何解決問題的,從而推斷你問題分析和解決的能力。
當(dāng)然有遇到問題和挑戰(zhàn),主要有以下幾點(diǎn):
頻繁地變更UI,經(jīng)常要修改頁面對象里面代碼,運(yùn)行用例報(bào)錯和處理,例如元素不可見,元素找不到這樣異常,測試腳本復(fù)用,盡可能多代碼復(fù)用,一些新框架產(chǎn)生的頁面元素定位問題,例如ck編輯器,動態(tài)表格等,這個遇到的難點(diǎn)完全取決寫腳本人的代碼能力。回答三個左右就差不多,記得既然拋出了難點(diǎn)問題,一定要記得處理這個問題的方法。
舉例一下你遇到過那些異常,在selenium自動化測試過程中
通過這個問題,大概知道你寫過多少腳本。寫腳本過程最常見的異常就是,這個元素?zé)o法找到。常見的selenium有以下這些:
ElementNotSelectableException :元素不能選擇異常
ElementNotVisibleException :元素不可見異常
NoSuchAttributeException :沒有這樣屬性異常
NoSuchElementException:沒有該元素異常
NoSuchFrameException :沒有該frame異常
TimeoutException :超時異常
Element not visible at this point :在當(dāng)前點(diǎn)元素不可見
如何處理 alert 彈窗
我們常見的alert彈窗有兩種:基于windows彈窗和基于web頁面彈窗
我們知道,webdriver是能夠處理alert彈窗的,Selenium提供了Alert這個接口。相關(guān)操作代碼如下:
?//?切換到Alert
Alert?alert?=?driver.switchTo().alert();
//?點(diǎn)擊彈窗上確定按鈕
alert.accept();
//?點(diǎn)擊彈窗的取消按鈕
alert.dismiss()
//?獲取彈窗上線上的文本文字內(nèi)容
alert.getText();
//?有些彈窗還支持文本輸入,這個可以把要輸入字符通過sendkeys方法輸入
alert.sendkeys();
在selenium中如何處理多窗口?
這個多窗口之間跳轉(zhuǎn)處理,在實(shí)際selenium自動化測試經(jīng)常遇到。就是,你點(diǎn)擊一個鏈接,這個鏈接會在一個新的tab打開,然后你接下來要查找元素在新tab打開的頁面,所以這里需要用到swithTo方法。
需要獲取當(dāng)前瀏覽器多窗口句柄,然后根據(jù)判斷跳轉(zhuǎn)新句柄還是舊句柄
你查找元素遇到過在Frame里面嗎?你是如何處理Frame里面元素定位的?
有時候我們知道元素定位表達(dá)式?jīng)]有問題,但是還是提示 no such element,那么我們就需要考慮這個元素是否在frame中。如果在,我們就需要從 topwindow,通過 swithcTo.Frame() 方法來切換到目標(biāo) frame 中,可以通過 frame 的 name 和 id和索引三種方法來定位 frame。
怎么驗(yàn)證勾選框是enable/disabled/ checked/Unchecked/ displayed/ not displayed?
通過以下方法來驗(yàn)證元素是enable 還是disable
boolean?enabled?=?driver.findElement(By.xpath("元素定位表達(dá)式")).isEnabled();
通過以下方法來驗(yàn)證元素是select/check
boolean?checked?=?driver.findElement(By.xpath("元素定位表達(dá)式")).isSelected();
通過以下方法來驗(yàn)證元素是dispalyed還是not?display
boolean?displayed?=?driver.findElement(By.xpath("元素定位表達(dá)式")).isDisplayed();
關(guān)閉瀏覽器中quit和close的區(qū)別
簡單來說,兩個都可以實(shí)現(xiàn)退出瀏覽器session功能,close是關(guān)閉你當(dāng)前聚焦的tab頁面,而quit是關(guān)閉全部瀏覽器tab頁面,并退出瀏覽器session。知道這兩個區(qū)別,我們就知道quit一般用在結(jié)束測試之前的操作,close用在執(zhí)行用例過程中關(guān)閉某一個頁面的操作。
什么是頁面加載超時
Selenium中有一個 Page Load wait的方法,有時候,我們執(zhí)行腳本的速度太快,但是網(wǎng)頁程序還有一部分頁面沒有完全加載出來,就會遇到元素不可見或者元素找不到的異常。為了解決問題,讓腳本流暢的運(yùn)行,我們可以通過設(shè)置頁面加載超時時間。具體代碼是這個:
driver.manage().timeouts().pageLoadTimeout(10,TimeUnit.SECONDS);
這行作用就是,如果頁面加載超過10秒還沒有完成,就拋出頁面加載超時的異常。
在Selenium中如何實(shí)現(xiàn)截圖,如何實(shí)現(xiàn)用例執(zhí)行失敗才截圖
在Selenium中提供了一個TakeScreenShot這么一個接口,這個接口提供了一個getScreenshotAs()方法可以實(shí)現(xiàn)全屏截圖。然后我們通過java中的FileUtils來實(shí)現(xiàn)把這個截圖拷貝到保存截圖的路徑。
代碼舉例:
File?src=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try?{
//?拷貝到我們實(shí)際保存圖片的路徑
????FileUtils.copyFile(src,new?File("C:/selenium/error.png"));
}catch?(IOException?e)
{
????System.out.println(e.getMessage());
}
如果要實(shí)現(xiàn)執(zhí)行用例發(fā)現(xiàn)失敗就自動截圖,那么我們需要把這個截圖方法進(jìn)行封裝。然后在測試代碼中的catch代碼塊去調(diào)用這個截圖方法。這個我們在POM的框架中一般是把截圖方法封裝到BasePage這個文件中。
在Selenium中如何實(shí)現(xiàn)拖拽滾動條?
在Selenium中通過元素定位會自動幫你拖拽到對應(yīng)位置,所以是沒有自帶的scoll方法。但是這個是有限制,例如當(dāng)前頁面高度太長,默認(rèn)是頁上半部分,你定位的元素在頁尾,這個時候可能就會報(bào)元素不可見的異常。我們就需要利用javaScript來實(shí)現(xiàn)拖拽頁面滾動條。
我們一般可以兩個方法去拖拽,一個是根據(jù)拖拽的坐標(biāo)(像素單位),另外一個是根據(jù)拖拽到一個參考元素附件。
如何實(shí)現(xiàn)文件上傳?
我們在 web 頁面實(shí)現(xiàn)文件上傳過程中,可以直接把文件在磁盤完整路徑,通過sendKeys 方法實(shí)現(xiàn)上傳。如果這種方法不能實(shí)現(xiàn)上傳,我們就可能需要借助第三方工具,我用過一個第三方工具叫 autoIT.
你是如何管理你的測試用例并執(zhí)行?
寫用例和管理并執(zhí)行用例,我們都需要借助單元測試框架來實(shí)現(xiàn),如果是Java語言一般有junit和TestNG,如果是python,常見的有unittest。
就你實(shí)際情況,說一下。例如我使用TestNG比較多,需要配置testng.xml文件來實(shí)現(xiàn)測試用例的執(zhí)行。有時候需要配置多個testng.xml去實(shí)現(xiàn)不同的任務(wù)場景。再展開,可能問你一下testng框架的知識點(diǎn)。例如,方法依賴,用例執(zhí)行優(yōu)先級,數(shù)據(jù)源驅(qū)動等。
關(guān)于自動化測試報(bào)告生成?
我個人一般用TestNG原生的測試報(bào)告,也有第三方叫reportNG的插件,不過我沒有實(shí)際使用過。
Python下報(bào)告生成一般使用HTMLTestRunner.py
哪些自動化測試工具
Appium
官網(wǎng):Appium
AppUI自動化測試
Appium 是一個移動端自動化測試開源工具,支持iOS 和Android 平臺,支持Python、Java 等語言,即同一套Java Python 腳本可以同時運(yùn)行在iOS 和Android平臺,Appium 是一個C/S 架構(gòu), 核心是一個 Web 服務(wù)器,它提供了一套 REST 的接口。當(dāng)收到[客戶端]()的連接后,就會監(jiān)聽到命令,然后在移動設(shè)備上執(zhí)行這些命令,最后將執(zhí)行結(jié)果放在 HTTP 響應(yīng)中返還給[客戶端]()。
License:免費(fèi)
Selenium
官網(wǎng):Selenium
WebUI自動化測試
Selenium是一個用于Web應(yīng)用程序測試的工具,Selenium已經(jīng)成為 Web 自動化測試工程師能包括:測試與瀏覽器的兼容性——測試你的應(yīng)用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上。測試系統(tǒng)功能——創(chuàng)建回歸測試檢驗(yàn)軟件功能和用戶需求。支持自動錄制動作和自動生成 .Net、Java、Perl等不同語言的測試腳本。Selenium 是 ThoughtWorks 專門為 Web 應(yīng)用程序編寫的一個驗(yàn)收測試工具。其升級版本為Webdriver。
License:免費(fèi)
Postman
官網(wǎng):Postman
接口測試
Postman 提供功能強(qiáng)大的 Web API 和 HTTP 請求的調(diào)試,它能夠發(fā)送任何類型的HTTP 請求 (GET, POST, PUT, DELETE…),并且能附帶任何數(shù)量的參數(shù)和 Headers。不僅如此,它還提供測試數(shù)據(jù)和環(huán)境配置數(shù)據(jù)的導(dǎo)入導(dǎo)出,付費(fèi)的 Post Cloud 用戶還能夠創(chuàng)建自己的 Team Library 用來團(tuán)隊(duì)協(xié)作式的測試,并能夠?qū)⒆约旱臏y試收藏夾和用例數(shù)據(jù)分享給團(tuán)隊(duì)。
License:免費(fèi)
Jmeter
官網(wǎng):Jmeter
接口測試,性能測試
JMeter是Apache組織的開放源代碼[項(xiàng)目](),它是功能和性能測試的工具,100%的用java實(shí)現(xiàn);
JMeter可以用于測試靜態(tài)或者動態(tài)資源的性能(文件、Servlets、Perl腳本、java對象、數(shù)據(jù)庫和查詢、ftp服務(wù)器或者其他的資源)。JMeter用于模擬在服務(wù)器、網(wǎng)絡(luò)或者其他對象上附加高負(fù)載以測試他們提供服務(wù)的受壓能力,或者分析他們提供的服務(wù)在不同負(fù)載條件下的總性能情況。你可以用JMeter提供的圖形化界面分析性能指標(biāo)或者在高負(fù)載情況下測試服務(wù)器/腳本/對象的行為。
使用Jmeter做接口測試需要注意一點(diǎn),小心使用“用戶定義變量”,Jmeter組件有優(yōu)先級的,如果多個線程同時執(zhí)行的時候,“用戶定義變量”組件定義的變量可能會亂套。
License:免費(fèi)
Loadrunner
官網(wǎng):Loadrunner
性能測試
LoadRunner,是一種預(yù)測系統(tǒng)行為和性能的負(fù)載測試工具。通過以模擬上千萬用戶實(shí)施并發(fā)負(fù)載及實(shí)時性能監(jiān)測的方式來確認(rèn)和查找問題,LoadRunner能夠?qū)φ麄€企業(yè)架構(gòu)進(jìn)行測試。企業(yè)使用LoadRunner能最大限度地縮短測試時間,優(yōu)化性能和加速應(yīng)用系統(tǒng)的發(fā)布周期。LoadRunner可適用于各種體系架構(gòu)的自動負(fù)載測試,能預(yù)測系統(tǒng)行為并評估系統(tǒng)性能。
License:商業(yè)
Jenkins
官網(wǎng):https://jenkins.io
持續(xù)集成
自動化構(gòu)建 編譯,部署,任務(wù)執(zhí)行,測試報(bào)告,郵件通知等。
License:免費(fèi)
智力題
Q:跳臺階問題
Q:4分鐘沙漏和7分鐘沙漏怎么漏出9分鐘
Q:兩個粗細(xì)不同的香,燃盡時間都是1個小時,怎么用這個2根香計(jì)算15分鐘的時間
Q:賽馬
Q:10堆蘋果,每堆10個,9堆每個50g,1堆每個40g,有一個稱,求只稱一次,找出這個輕的一堆
Q:飛機(jī)加油問題
Q:邏輯:四個開關(guān)四個燈泡
Q:地球弧形
測試面試真題
登陸測試
以用戶登錄為例,一般的小白可能只能夠想到一些功能性測試(如下)。
現(xiàn)在,針對“用戶登錄”功能,基于等價類劃分和邊界值分析方法,我們設(shè)計(jì)的測試用例包括: ? ?
輸入已注冊的用戶名和正確的密碼,驗(yàn)證是否登錄成功;? ?
輸入已注冊的用戶名和不正確的密碼,驗(yàn)證是否登錄失敗,并且提示信息正確;? ?
輸入未注冊的用戶名和任意密碼,驗(yàn)證是否登錄失敗,并且提示信息正確;? ?
用戶名和密碼兩者都為空,驗(yàn)證是否登錄失敗,并且提示信息正確;? ?
用戶名和密碼兩者之一為空,驗(yàn)證是否登錄失敗,并且提示信息正確;? ?
如果登錄功能啟用了驗(yàn)證碼功能,在用戶名和密碼正確的前提下,輸入正確的驗(yàn)證碼,驗(yàn)證是否登錄成功;? ?
如果登錄功能啟用了驗(yàn)證碼功能,在用戶名和密碼正確的前提下,輸入錯誤的驗(yàn)證碼,驗(yàn)證是否登錄失敗,并且提示信息正確。? ?
乍一看,感覺測試案例已經(jīng)夠多了,不過對于一個稍微有點(diǎn)經(jīng)驗(yàn)的工程師,可能會加上下面部分
用戶名和密碼是否大小寫敏感;? ?
頁面上的密碼框是否加密顯示;? ?
后臺系統(tǒng)創(chuàng)建的用戶第一次登錄成功時,是否提示修改密碼;? ?
忘記用戶名和忘記密碼的功能是否可用;? ?
[前端]()頁面是否根據(jù)設(shè)計(jì)要求限制用戶名和密碼長度;? ?
如果登錄功能需要驗(yàn)證碼,點(diǎn)擊驗(yàn)證碼圖片是否可以更換驗(yàn)證碼,更換后的驗(yàn)證碼是否可用;? ?
刷新頁面是否會刷新驗(yàn)證碼;? ?
如果驗(yàn)證碼具有時效性,需要分別驗(yàn)證時效內(nèi)和時效外驗(yàn)證碼的有效性;? ?
用戶登錄成功但是會話超時后,繼續(xù)操作是否會重定向到用戶登錄界面;? ?
不同級別的用戶,比如管理員用戶和普通用戶,登錄系統(tǒng)后的權(quán)限是否正確;? ?
頁面默認(rèn)焦點(diǎn)是否定位在用戶名的輸入框中;? ?
快捷鍵Tab 和Enter等,是否可以正常使用。? ?
上述還僅僅只是功能測試,你還可以從其他的角度比如安全性、性能以及兼容性三大方面。在上面所有的測試用例設(shè)計(jì)中,我們完全沒有考慮對非功能性需求的測試,但這些往往是決定軟件質(zhì)量的關(guān)鍵因素。>
安全性測試用例包括
用戶密碼后臺存儲是否加密;? ?
用戶密碼在網(wǎng)絡(luò)傳輸過程中是否加密;? ?
密碼是否具有有效期,密碼有效期到期后,是否提示需要修改密碼;? ?
不登錄的情況下,在瀏覽器中直接輸入登錄后的URL地址,驗(yàn)證是否會重新定向到用戶登錄界面;? ?
密碼輸入框是否不支持復(fù)制和粘貼;? ?
密碼輸入框內(nèi)輸入的密碼是否都可以在頁面[源碼]()模式下被查看;? ?
用戶名和密碼的輸入框中分別輸入典型的“SQL注入攻擊”字符串,驗(yàn)證系統(tǒng)的返回頁面;? ?
用戶名和密碼的輸入框中分別輸入典型的“XSS跨站腳本攻擊”字符串,驗(yàn)證系統(tǒng)行為是否被篡改;? ?
連續(xù)多次登錄失敗情況下,系統(tǒng)是否會阻止后續(xù)的嘗試以應(yīng)對暴力破解;? ?
同一用戶在同一終端的多種瀏覽器上登錄,驗(yàn)證登錄功能的互斥性是否符合設(shè)計(jì)預(yù)期;? ?
同一用戶先后在多臺終端的瀏覽器上登錄,驗(yàn)證登錄是否具有互斥性。? ?
性能壓力測試用例包括: ? ?
單用戶登錄的響應(yīng)時間是否小于3秒;? ?
單用戶登錄時,后臺請求數(shù)量是否過多;? ?
高并發(fā)場景下用戶登錄的響應(yīng)時間是否小于5秒;? ?
高并發(fā)場景下服務(wù)端的監(jiān)控指標(biāo)是否符合預(yù)期;? ?
高集合點(diǎn)并發(fā)場景下,是否存在資源死鎖和不合理的資源等待;? ?
長時間大量用戶連續(xù)登錄和登出,服務(wù)器端是否存在內(nèi)存泄漏。? ?
兼容性測試用例包括: ? ?
不同瀏覽器下,驗(yàn)證登錄頁面的顯示以及功能正確性;? ?
相同瀏覽器的不同版本下,驗(yàn)證登錄頁面的顯示以及功能正確性;? ?
不同移動設(shè)備終端的不同瀏覽器下,驗(yàn)證登錄頁面的顯示以及功能正確性;? ?
不同分辨率的界面下,驗(yàn)證登錄頁面的顯示以及功能正確性。? ?
微信紅包測試
單個紅包: ? ?
紅包金額為空、0、0.01、200.00、200.01、199.99、200 ? ?
留言輸入數(shù)字、字母、漢字、特殊字符 ? ?
留言長度 ? ?
留言復(fù)制粘貼 ? ?
表情選擇收藏表情、其他表情 ? ?
刪除表情、重新選擇表情 ? ?
選擇支付方式 零錢、銀行卡、添加新卡支付。其中錢數(shù)<紅包錢數(shù)、其中錢數(shù)=紅包錢數(shù)、其中錢數(shù)>紅包錢數(shù) ? ?
使用指紋確認(rèn)付款(正確的、錯誤的指紋) ? ?
使用密碼確認(rèn)付款(正確的、錯誤的密碼) ? ?
紅包成功發(fā)送后 相應(yīng)支付方式中錢數(shù)減少(減少金額與紅包金額一致) ? ?
接受者能看到紅包具體信息,紅包金額、留言、表情均能正確顯示 ? ?
紅包被拆開后顯示已領(lǐng)取,領(lǐng)取者零錢中增加正確金額,再次領(lǐng)取只能查看紅包信息 ? ?
發(fā)紅包者自己領(lǐng)紅包 ? ?
紅包24小時未被領(lǐng)取提示紅包被退回,相應(yīng)支付方式中錢數(shù)增加(增加金額與紅包金額一致),對方不能領(lǐng)紅包 ? ?
群發(fā)紅包-普通紅包:(只寫了與單個紅包不同的地方)
紅包個數(shù) 為空、0、001、100、99、101 ? ?
紅包拆開每個金額一樣 均為發(fā)紅包時設(shè)置的單個金額對應(yīng)的錢數(shù) ? ?
紅包被拆時,有相應(yīng)提示 ? ?
發(fā)紅包者自己領(lǐng)紅包 ? ?
紅包24小時內(nèi)未被拆完,剩余錢被退回,相應(yīng)支付方式中錢數(shù)增加 ? ?
群發(fā)紅包-拼手氣紅包: ? ?
紅包每個人拆開金額不同,總金額與發(fā)紅包設(shè)置的總額一致 ? ?
紅包24小時內(nèi)拆完后顯示最佳手氣 ? ?
紅包24小時內(nèi)未被拆完不顯示最佳手氣
兼容性測試
兼容性: ? ? 安卓、蘋果 不同型號版本手機(jī)
UI測試: ? ? 界面無錯別字,風(fēng)格統(tǒng)一
中斷測試: ? ? 不同應(yīng)用之間切換、斷網(wǎng)、來電、短信、低電量、手機(jī)沒電
網(wǎng)絡(luò)測試: ? ? 2g/3g/4g WiFi 移動聯(lián)通電信 弱網(wǎng) 無網(wǎng)
微信朋友圈測試用例
朋友圈發(fā)送功能
只發(fā)送文本 ? ?
a、考慮文本長度:1-1500字符(該數(shù)據(jù)為[百度]()數(shù)據(jù))、超出最大字符長度
b、文本是否支持復(fù)制粘貼
c、為空驗(yàn)證
只發(fā)送圖片 ? ?
a、本地相冊選擇/拍攝
b、圖片數(shù)量驗(yàn)證:1-9張圖片、超出9張
c、為空驗(yàn)證
只發(fā)送視頻 ? ?
a、本地相冊選擇/拍攝
b、視頻秒數(shù)驗(yàn)證:1-10s,超出10s
c、視頻個數(shù)驗(yàn)證:1個,超出1個
d、視頻格式驗(yàn)證:支持的視頻格式,例mp4、不支持的視頻格式
e、視頻大小驗(yàn)證:蘋果400kb以內(nèi)、Android200-300kb(此為[百度]()數(shù)據(jù))、超出規(guī)定大小
f、視頻預(yù)覽增刪改操作
g、為空驗(yàn)證
發(fā)送文本+圖片:輸入滿足要求的文本、圖片進(jìn)行一次驗(yàn)證 ? ?
發(fā)送圖片+視頻:不支持發(fā)送 ? ?
朋友圈發(fā)送內(nèi)容是否有限制,例如涉及黃賭毒等敏感字 ? ?
所在位置 ? ?
a、不顯示位置:發(fā)送到朋友圈動態(tài)不顯示位置
b、選擇對應(yīng)位置:搜索支持、自動定位、手動編輯
C、點(diǎn)擊取消,返回上一級頁面
誰可以看 ? ?
a、設(shè)置公開:所有朋友可見
b、設(shè)置私密(僅自己可見):自己查看朋友圈-可見、好友查看朋友圈-不可見
c、設(shè)置部分可見(部分朋友可見):選擇的部分好友-可見、不被選擇的好友-不可見、是否有人數(shù)上限
d、設(shè)置不給誰看(選中的朋友不可見):不被選中的朋友-可見、被選中的朋友-不可見、是否有人數(shù)上限
e、點(diǎn)擊取消,返回發(fā)送頁面
提醒誰看 ? ?
a、提醒單人/提醒多人:被提醒的朋友-收到消息提醒、未被提醒-未有消息提醒
b、是否有人數(shù)上限
c、點(diǎn)擊取消,返回發(fā)送頁面
同步QQ空間:默認(rèn)不同步、同步到QQ空間
取消發(fā)送朋友圈操作
a、選擇相機(jī),點(diǎn)擊取消,返回朋友圈頁面
b、進(jìn)入朋友圈發(fā)送頁面,選擇文本圖片,點(diǎn)擊取消
13)朋友圈當(dāng)天發(fā)送次數(shù)是否有上限限制
朋友圈瀏覽功能
文本查看:? ?
a、過長文本內(nèi)容是否隱藏,并支持查看全文
b、右鍵選擇復(fù)制、收藏、翻譯
c、url鏈接是否支持點(diǎn)擊跳轉(zhuǎn)網(wǎng)頁
圖片查看 ? ?
a、小圖右鍵支持收藏/編輯
b、點(diǎn)擊支持大圖瀏覽
c、選擇發(fā)送給朋友、收藏、保存圖片、編輯
d、多張圖片支持左右滑動瀏覽
視頻查看 ? ?
a、右鍵視頻支持靜音播放/搜藏
b、點(diǎn)擊視頻播放按鍵支持播放視頻
c、選擇發(fā)送給朋友、收藏、保存視頻、編輯
分享動態(tài)瀏覽:QQ空間/公眾號文章/非[騰訊]()產(chǎn)品分享后朋友圈是否正常顯示
贊:點(diǎn)贊、取消點(diǎn)贊
評論
a、評論長度:評論字?jǐn)?shù)合理長度、評論超過字?jǐn)?shù)上限
b、評論類型:純中文、純數(shù)字、純字母、純字符、純表情(微信表情/手機(jī)自帶表情)、混合類型、包含url鏈接;
c、評論是否支持復(fù)制粘貼
d、為空驗(yàn)證
e、發(fā)表評論后刪除
f、評論回復(fù)操作
刪除朋友圈動態(tài)
更換相冊封面
刷新是否正常獲取新動態(tài)
上滑是否加載更多
界面/易用性測試 ? ?
1、技術(shù)人員角度:頁面布局設(shè)計(jì)是否跟產(chǎn)品原型圖/ui效果圖一致
2、但除了考慮1之外,我們同樣要考慮到用戶使用:功能操作是否簡便,頁面布局排版風(fēng)格是否美觀合理,提示語相關(guān)信息是否易于理解
中斷測試 ? ?
1、主要考慮:a)核心功能 b)當(dāng)前功能存在實(shí)時數(shù)據(jù)交換,例發(fā)朋友圈、瀏覽朋友圈進(jìn)行中斷,是否容易出現(xiàn)崩潰
2、中斷包括:前后臺切換、鎖屏解鎖、斷網(wǎng)重連、app切換、來電話/來短信中斷、插拔耳機(jī)線/數(shù)據(jù)線
網(wǎng)絡(luò)測試 ? ?
1、三大運(yùn)營商不同網(wǎng)絡(luò)制式測試
2、網(wǎng)絡(luò)切換測試:WIFI/4G/3G/2G
3、無網(wǎng)測試:對于緩存在本地的數(shù)據(jù),部分朋友圈信息是否支持瀏覽
4、弱網(wǎng)測試:
a、延時:頁面響應(yīng)時間是否可接受、不同網(wǎng)絡(luò)制式是否區(qū)分超時時長、出現(xiàn)請求超時,是否給予相應(yīng)的提示
b、丟包:有無超時重連機(jī)制、如果未響應(yīng),是否給予相應(yīng)提示
c、頁面呈現(xiàn)的完整性驗(yàn)證
兼容性測試 ? ?
1、Android手機(jī)端、蘋果手機(jī)端、pad版(主流)功能界面顯示是否正常
2、各平臺朋友圈展示數(shù)據(jù)是否一致
安全測試 ? ?
發(fā)送朋友圈時,文本輸入腳本代碼,是否出現(xiàn)異常
性能測試 ? ?
1、服務(wù)器性能測試
可通過loadrunner/jmeter工具實(shí)現(xiàn),主要關(guān)注TPS、響應(yīng)時間、吞吐量、CPU、內(nèi)存等
2、app客戶端性能測試
可通過GT工具實(shí)現(xiàn),運(yùn)行時關(guān)注cpu、內(nèi)存、流量、電量等占用率
3、app壓力穩(wěn)定性測試
通過monkey工具實(shí)現(xiàn),頻繁發(fā)送朋友圈,瀏覽朋友圈請求,是否容易發(fā)生崩潰
測試一個輸入框(計(jì)數(shù))
相信不少朋友在筆試的時候都遇到過測試用例設(shè)計(jì)的筆試題。通常是一個登陸頁面,上面有用戶名,密碼的輸入框,再多一點(diǎn)的有個驗(yàn)證碼。
不過要是你見到的是以下的這道測試用例設(shè)計(jì)筆試題,不用問,面試官一定是看過《Google軟件測試之道》的。(也腦補(bǔ)一下,萬一面試官是看過CC先生的簡書呢…… 嗯嗯,夢想還是要有的)
出題時間: ? ?
在一個Web測試頁面上,有一個輸入框,一個計(jì)數(shù)器(count)按鈕,用于計(jì)算一個文本字符串中字母a出現(xiàn)的個數(shù)。這里的問題是,請?jiān)O(shè)計(jì)一系列測試用例用以測試這個Web頁面。
很多朋友可能拿到這道題的時候已經(jīng)開始寫下1.2.3.了,不過根據(jù)經(jīng)驗(yàn)上來說,追求數(shù)量而非質(zhì)量的傾向,是一種低效的工作方式。(特別在有面試官在旁邊看到你答題的時候,請保持沉思者狀保持10-15秒)
能夠針對題目提出一些問題來的候選者會被認(rèn)為更有潛質(zhì)來做測試人員,比如大寫還是小寫?只是英語嗎?計(jì)算完成后文本會被清除嗎?多次按下按鈕會發(fā)生什么事情?諸如此類。
通常說來,我們考慮一個測試對象的時候至少從以下六方面來考慮。
功能性
易用性
可靠性
性能
安全
兼容性
如果你是一個測試菜鳥,從功能性出發(fā),你可能會列出以下一個典型的列表:
“banana”:3(一個合法的英文字)。
“A” 和“a”:1(一個簡單有正常結(jié)果的合法輸入)。
“”:0(一個簡單的結(jié)果為0的合法輸入)。
Null:0(簡單的錯誤輸入)。
“AA” 和“aa”:2(個數(shù)大于1并且所有字符都為a/A的輸入)。
“b”:0(一個簡單的非空合法輸入,結(jié)果為0)。
“aba”:2(目標(biāo)字符出現(xiàn)在開頭和結(jié)尾,以尋找循環(huán)邊界錯誤)。
“bab”:1(目標(biāo)字符出現(xiàn)在中間)。
space/tabs:N(空白字符與N個a的混合)。
不包含a的長字符串:N(N大于0)。
包含a的長字符串:N(N是a的倍數(shù),試試龍媽的名字)。
{java/C/HTML/[JavaScript]()}:N是a出現(xiàn)的個數(shù)(可執(zhí)行字符,或錯誤,或代碼解釋)。
更優(yōu)秀的測試工程師,會開始考慮后面五個方面,設(shè)計(jì)以下用例。
質(zhì)疑界面的外觀、調(diào)色板和對比度(這與相關(guān)應(yīng)用風(fēng)格一致么?)
文本框太小了,建議加長以便顯示更長的輸入字符串
這個應(yīng)用能否在同一臺服務(wù)器上運(yùn)行多個實(shí)例,多個用戶同時使用是否會有問題。
是否會根據(jù)用戶的輸入自動匹配內(nèi)容?
建議使用真實(shí)的數(shù)據(jù),如從詞典或書中選擇輸入內(nèi)容。
提出疑問:“輸入的數(shù)據(jù)是否會被保存”,輸入字符串可能包含地址或其他身份信息。
輸入HTML和JavaScrip,看是否會破壞頁面渲染。
嘗試復(fù)制/粘貼字符串。
提出疑問:“計(jì)算足夠快么?在大并發(fā)下使用”。
提出疑問:“用戶怎么找到該頁面?”
提出疑問:“有快捷鍵的設(shè)置么?比如輸完字符后敲入回車鍵而不是點(diǎn)擊提交按鈕”
還有一些測試點(diǎn),只有經(jīng)驗(yàn)豐富的測試工程師才會想到。
意識到計(jì)算會通過URL-encodedHTTP GET請求傳遞到服務(wù)器,字符串可能會在網(wǎng)絡(luò)傳輸時被截?cái)啵虼耍瑹o法保證支持多長的URL。
建議將此功能參數(shù)化,為什么只對字母a計(jì)算呢?
考慮計(jì)算其它語言中的a(α,Alpha)。
考慮到該應(yīng)用是否應(yīng)該國際化。
考慮到輸入法全角輸入和半角輸入是否相同。
考慮編寫腳本或者手工采樣來探知字符串長度的上限,然后確保在此區(qū)間內(nèi)功能正常。
考慮背后的實(shí)現(xiàn)和代碼。也許已經(jīng)有一個計(jì)數(shù)器遍歷該字符串。
提出疑問:“HTTP POST方法和參數(shù)會被黑掉碼?也許有安全漏洞?”
用腳本創(chuàng)建各種有趣的排列組合和字符串特性,如長度、a的個數(shù)等,自動生成測試輸入和驗(yàn)證。
測試百度搜索
我們可以從以下幾個角度進(jìn)行測試。
功能測試:
輸入搜索信息,點(diǎn)擊搜索按鈕是否能獲取搜索結(jié)果,跳到結(jié)果界面;?搜索結(jié)果界面彈出的信息是不是符合我輸入的信息 , 沒有輸入信息,按搜索看會有什么結(jié)果 ,對輸入框能輸入的最大字符數(shù)進(jìn)行邊界測試,(假設(shè)限制是30個字符),那么分別輸入20,30,31個字符的文本進(jìn)行測試,測試超出輸入限制會出現(xiàn)的結(jié)果
測試輸入敏感詞時的搜索結(jié)果,輸入不同國家語言的搜索結(jié)果 ,查詢不到搜索結(jié)果的情況顯示的結(jié)果,從搜索結(jié)果界面返回的按鈕能不能正常返回
點(diǎn)擊[百度]()的標(biāo)簽?zāi)懿荒芴较嚓P(guān)的熱搜界面
測試[百度]()的圖片搜索能不能正常使用
圖片拖曳和上傳的功能是否均能實(shí)現(xiàn),粘貼圖片網(wǎng)址能不能用
如果粘貼的圖片網(wǎng)址不存在是否能給出正確的提示反饋
輸入特別大的圖會發(fā)生什么現(xiàn)象
性能測試:
測試搜索時的響應(yīng)時間能否符合需求
網(wǎng)速慢的條件下還能不能正常搜索
多用戶同時訪問,或者一個時間點(diǎn)訪問量突然增大的情況,對這些特殊情況進(jìn)行模擬,測試還能不能進(jìn)行正常搜索
易用性測試:
使用操作是否簡單,是不是輸入查詢信息之后點(diǎn)擊搜索按鈕就行了;
在輸入框輸入搜索詞的過程中下拉框能否彈出相關(guān)的[聯(lián)想]()搜索(你可能要搜)
輸入框有沒有保存最近搜索的信息的記錄
除了點(diǎn)擊搜索按鈕進(jìn)行搜索,測試按回車進(jìn)行檢索的功能
兼容性測試:
多種系統(tǒng)下的多種不同的瀏覽器下是否能正常顯示、正常使用;
在不同的手機(jī)瀏覽器中打開是否能正常顯示、正常使用;
各種語言平臺下是否都能正常使用
安全性測試:
能不能防止搜索時對數(shù)據(jù)庫的惡意攻擊的情況,如SQL注入
UI
界面設(shè)計(jì)是否簡介,是否符合用戶審美
圖標(biāo)能不能正常顯示,界面有無錯別字
BUG描述、評級
對bug的描述盡量簡短但要求清晰,對bug出現(xiàn)的條件進(jìn)行詳細(xì)的描述,包括輸入的測試用例、使用的環(huán)境、有沒有和其他軟件同時運(yùn)行,以及需要寫清bug出現(xiàn)的位置,幫助開發(fā)更好定位。
按照用戶體驗(yàn)(bug是否很嚴(yán)重的影響用戶體驗(yàn))、影響系統(tǒng)的程度進(jìn)行評級
一條bug記錄的組成
bug內(nèi)容
bug發(fā)現(xiàn)時間
測試條件(系統(tǒng)配置信息、環(huán)境、軟件版本、瀏覽器版本…)
預(yù)期結(jié)果和實(shí)際結(jié)果的對比,相關(guān)的分析
如何重現(xiàn)這個bug的步驟
這個bug的嚴(yán)重性(會多大程度的影響系統(tǒng)或用戶使用)
bug發(fā)生的位置
QPS和TPS的區(qū)別
TPS:Transactions Per Second(每秒傳輸?shù)氖挛锾幚韨€數(shù)),即服務(wù)器每秒處理的事務(wù)數(shù)。TPS包括一條消息入和一條消息出,加上一次用戶數(shù)據(jù)庫訪問。
QPS:每秒查詢率QPS是對一個特定的查詢服務(wù)器在規(guī)定時間內(nèi)所處理流量多少的衡量標(biāo)準(zhǔn)
用來衡量服務(wù)器的機(jī)器性能。
是軟件測試結(jié)果的測量單位。
并發(fā)用戶數(shù)和在線用戶數(shù)的區(qū)別
在線用戶數(shù):用戶同時在一定時間段的在線數(shù)量
并發(fā)用戶數(shù):某一時刻同時向服務(wù)器發(fā)送請求的用戶數(shù)
(在線用戶只要在線就好了,并發(fā)用戶計(jì)算的是和服務(wù)器有交流的用戶,一般比例5%-20%)
試的階段
測試應(yīng)該盡早進(jìn)行。越早就可以花越少的消耗得到越大的回報(bào)。
書籍
《測試工程師全棧技術(shù)進(jìn)階與實(shí)踐》 茹炳晟
《Google測試之道》
測開高頻手撕代碼
測試開發(fā)崗面試時對代碼能力要求不太高,刷熟劍指offer就可以大膽地去面試?yán)瞺
下面是我總結(jié)的百度美團(tuán)京東等大廠常見的代碼題
1.將一個只含有-1和1的亂序數(shù)組變成-1全在1前面的數(shù)組
2.合并區(qū)間
3.最小覆蓋子串
4.最長不含重復(fù)字符的字符串
5.翻轉(zhuǎn)單詞順序
6.判斷回文串
7.兩數(shù)之和
8.最長回文子串
9.和為K的子數(shù)組
10.合并兩個有序數(shù)組
11.合并兩個有序鏈表
12.判斷鏈表有環(huán)、環(huán)的位置、環(huán)的長度
13.翻轉(zhuǎn)鏈表
14.奇偶鏈表
15.合并n個有序鏈表
16.去除駝峰字符串
17.統(tǒng)計(jì)一個數(shù)字在排序數(shù)組中的出現(xiàn)次數(shù)
18.輸入YYYY-MM-DAY 判斷是當(dāng)年的第多少天
19.括號匹配
20.判斷是否為合法字符
21,冒泡排序歸并排序 快速排序
22.最長連續(xù)數(shù)列
23.給出數(shù)組的所有子集
24.兩個棧實(shí)現(xiàn)一個隊(duì)列
25.尋找數(shù)組中前三大的值
26.兩個排序數(shù)組找到相同元素
HR常問
為什么想做測試
對測開的理解
測試過程中有沒有出現(xiàn)問題,是如何解決的
最近看了什么書?學(xué)了什么?為什么學(xué)?有看什么技術(shù)書籍嗎?
個人優(yōu)缺點(diǎn),舉例
測試看重什么能力
項(xiàng)目問題細(xì)挖
為什么選擇xx公司?
你對我們公司有什么了解嗎?
之前實(shí)習(xí)收獲了什么
介紹下自己的優(yōu)缺點(diǎn)
抗壓能力如何,描述一件自己如何抗壓的經(jīng)歷
反問環(huán)節(jié):你有什么問題想問我么?
項(xiàng)目中收獲了什么?
平時怎么學(xué)習(xí)的
為什么要離職?
你的期望薪資是多少?
如果在測試中發(fā)現(xiàn)一個?Bug?,但是開發(fā)經(jīng)理不認(rèn)為這是一個?Bug?,應(yīng)該怎么解決?
產(chǎn)生這種有爭議的?Bug?的幾個原因有
首先可能是測試人員自己的問題,是否描述該bug不太清晰,使得開發(fā)人員難以理解或者產(chǎn)生了歧義,這個時候要修改自己的描述,一定要清晰明了,無歧義,無冗余的步驟
其次可能是需求型的bug,找產(chǎn)品經(jīng)理溝通清楚該產(chǎn)品的需求,判斷是測試人員還是開發(fā)人員對該需求判斷有誤
還有可能是低概率性的?Bug?,出現(xiàn)了難以復(fù)現(xiàn)的?Bug?,這個時候要結(jié)合嚴(yán)重性、頻繁性、對用戶的影響以及產(chǎn)品交付時間與開發(fā)共同衡量是否修復(fù)該?Bug?,即使是選擇暫不修復(fù),也需要將該?Bug?詳細(xì)地提交備案
為什么想要做測試?
你覺得你做測試的優(yōu)勢在哪里?
怎么看待測試中重復(fù)性工作較多的問題
談?wù)勀銓y試的理解
你的職業(yè)規(guī)劃
如何理解測試和測試開發(fā)?
測試就是在規(guī)定條件下檢測產(chǎn)品功能或者程序上的錯誤,對其是否滿足設(shè)計(jì)要求進(jìn)行評估。
測試開發(fā)需要開發(fā)一些自動化測試的平臺或者二次開發(fā)一些現(xiàn)有的開源工具,最終目的是提升測試效率,但是核心職能仍然是測試。
如果遇到一些低概率性的?Bug?會怎么辦?
首先要認(rèn)真記錄引發(fā)該?Bug?的情況(當(dāng)時的測試環(huán)境、測試數(shù)據(jù)、出現(xiàn)問題前的操作),不應(yīng)該在測試報(bào)告中因?yàn)槌霈F(xiàn)概率低而忽略這些?Bug?的存在
其次,會根據(jù)嚴(yán)重性、頻繁性、對用戶的影響這三個因素共同做決定,嚴(yán)重性就是判斷該bug是否導(dǎo)致嚴(yán)重的后果,比如是不是會讓整個程序崩潰?會導(dǎo)致用戶信息丟失嗎?還是僅僅是無關(guān)痛癢的小問題?;頻繁性就是指在用戶使用的過程中是否會經(jīng)常碰到該類問題?還是這個 Bug 出現(xiàn)在某些不太常用的功能中;對用戶的影響是指是否會影響到全部用戶的使用?還是只影響部分用戶的使用?(比如說這個?Bug?所在的程序如果只出現(xiàn)在app的舊版本中,那么它對用戶的影響就很小)
綜合上面幾點(diǎn)聯(lián)合考慮,然后視產(chǎn)品發(fā)布日期來決定,如果產(chǎn)品發(fā)布日期臨近,修改一些不太嚴(yán)重、出現(xiàn)不太頻繁的?Bug?反而可能得不償失,帶來其他的風(fēng)險(xiǎn),因此此時僅僅將該?Bug?備案,其他情況下還是需要盡力定位、修復(fù)該bug。
項(xiàng)目最終結(jié)果不符合預(yù)期怎么辦?
作為一個測試開發(fā)工程師,要參與哪些流程?
