高级测试开发面试题
高級測試開發面試題:
一、java基礎
1)java中有哪些容器,區別和特點是什么
https://blog.csdn.net/qq_38774221/article/details/98974417
2)HashMap和HashTable的區別
3)Java中抽象類和接口的區別
抽象類:1、可以有默認的方法實現/子類使用繼承extends關鍵字,只有子類中有一個抽象方法,它就是抽象的,可以存在非抽象方法/可以有構造方法/不能實例化/抽象方法可以有public、protected和default這些修飾符/可以繼承一個類實現多個接口/
接口:1、完全是抽象的,不能有方法實現/子類使用implements實現接口,需要提供接口中聲明的所有方法的實現/不存在構造方法/接口方法默認修飾符只能是public/只能繼承一個接口或者多個接口/
4)java中重寫和重載的區別
重載與重寫是 Java 多態性的不同表現。
重寫是父類與子類之間多態性的表現,在運行時起作用(動態多態性,譬如實現動態綁定)/方法名、參數個數、類型必須一致
注意:
(1):子類不能重寫父類中被finall修飾的方法。
(2):子類必須重寫父類中的抽象方法(abstract修飾的方法)
(3):子類不能繼承父類被private修飾的屬性和方法
(4):子類不能繼承父類的構造器
重載是一個類中多態性的表現,在編譯時起作用(靜態多態性,譬如實現靜態綁定)/方法名相同,參數個數、參數類型可以不一樣
5)java的反射原理是什么
https://blog.csdn.net/Appleyk/article/details/77879073
1.將Java文件保存到本地硬盤
2.編譯Java文件,生成.class文件
3.使用Java虛擬機(JVM)將字節碼文件加載到內存
4.字節碼文件在內存中使用Class類表示
5.使用反射的時候,首先獲取到Class類,就可以得到class文件里的所有內容,包含屬性、構造方法、普通方法
6.屬性通過Filed類表示
7.構造方法通過Constructor表示
8.普通方法通過Method表示
6)JavaGC垃圾回收機制的工作原理是什么
新生代引發的垃圾YoungGC
老年代引發的垃圾FullGC,它會引起整個jvm暫停,待垃圾回收完才能繼續運行
如何確認哪些需要回收?–確定哪些是存活的哪些是死去的
—引用計數算法
—根搜索算法,通過某些對象往上搜索–主要采用的這種方式
怎么回收呢?
永久代回收的性價比比較低,它一般不會發生垃圾回收,因為里面存的都是靜態變量,除非項目停掉
主要回收:廢棄的常量、無用的類
主要關注堆里面的內存回收,垃圾回收算法有四種
1、標記清除算法,標記出哪些是存活的哪些是死忙的,先標記后清除
缺點:效率不高,大量的碎片內存區,不連續
2、復制算法–內存分為相當的2塊,把存活的順序復制到保留區,永遠要有一半是保留區—新生代主要采用這種算法
缺點:利用率低
3、標記-壓縮算法–把存活對象進行標記,然后讓所有存活對象向一邊移動,清除掉存活對象邊界的所有內存—老年代主要用這個
4、分代收集算法–當代的商業虛擬機都采用的這種,根據對象的存活周期不同將內存劃分成幾塊,一般java堆分為新生代-復制,老年代-標記壓縮算法
具體的垃圾回收算法實現是垃圾回收器
(1)Serial收集器(串行)–單線程、用戶線程全部停止、Client模式下,新生代默認收集器,優點–簡單高效
(2)ParNew收集器(并行)–serial的多線程,server模式下,新生代默認收集器,默認開啟的垃圾回收線程與cpu核數一致
(3)CMS收集器-并發收集器,采用標記清除、標記壓縮算法,缺點:消耗cpu、會產生內存碎片、浮動垃圾
7)出現內存泄露的根本原因是什么,怎么定位內存泄露原因
堆內存溢出
堆內存中存在大量對象,這些對象都有被引用,當所有對象占用空間達到內存的最大值,就會出現內存溢出
永久代溢出–程序一啟動就決定了占用空間
類的一些信息,如類名、修飾符、字段描述、方法描述等,所占空間大于永久代最大值,就會出現內存溢出,outofMemoryError:PermGen space
內存泄露的根本原因是Jvm中老年代中存在著大量存活的對象,這些對象不能被GC回收掉,從而占滿了整個老年代,造成Jvm一直處于FGC的狀態,程序沒有響應,服務器報OOM錯誤
內存泄露主要通過分析老年代中占用空間最大的類都有哪些,然后去代碼中找對應的類的創建。通??梢允褂胘dk提供的jvisualvm和jmap進行堆內存的分析
現象:
tps大幅波動,并慢慢降低,甚至為0,程序無響應
jstat命令看到,jvm中old區不斷增加,FullGC非常頻繁,對應的fullgc消耗的時間不斷增加
通過jconsole/jvisualvm可以看到,堆內存曲線不斷上升,接近上限時,變成一條直線
日志報錯
二、計算機基礎知識
1)TCP建立連接三次握手,斷開連接四次握手,為什么
TCP建立連接三次握手
1)主機A: 主機B,在線嗎? 收到請回復。
2)主機B:收到,那你還在線嗎?收到請回復。
3)主機A,收到,我還在線;會話連接成功,下面開始說正事吧
為什么是三次握手
假設只有二次握手,就有可能出現以下的情況:主機A請求連接時,因為網絡延遲問題,這條消息主機B遲遲沒有收到,因為主機A等待超時又發了一個連接請求,主機B收到請求后同意了連接,所以這次的連接建立了,這時上一次的請求連接消息主機B才收到,主機B當然也是同意的,但是這個連接在主機A看來是過時的,主機A當然不能正常連接,主機B卻連接了,這就導致主機B創建了一個無意義的連接,白白浪費了系統資源。
TCP釋放連接四次揮手
1)主機A:主機B,我沒有要發送的數據了,我請求關閉連接,收到請回復。
2)主機B: 收到,但是你得先等等,我得先確認一下我還有沒有數據要發送給你,若有我要發送完畢再聯系你。
3)主機B:主機A,我的數據也已經發送完畢,咱們現在關閉會話吧,收到請回復。
4)主機A:收到,可是我要等待2分鐘后才能關閉連接,2分鐘后連接將會自動關閉。
為什么要等待2分鐘呢?
2分鐘對應的專業術語是MSL即Maximum Segment Lifetime,也就是最大報文生存時間,他是任何報文在網絡上存在的最長時間,超過這個時間報文將被丟棄。引用《TCP/IP詳解》中的話:
“它(MSL)是任何報文段被丟棄前在網絡內的最長時間”。RFC 793中規定MSL為2分鐘,實際應用中常用的是30秒,1分鐘和2分鐘等。
因為主機A在對主機B進行回復確認時,可能網絡會丟失數據,如果丟失數據了,主機B會重發FIN給主機A的,因為主機B要等收到了主機A的確認時才會close連接,
但是如果主機A再回復確認后馬上close連接,那就可能會導致主機B不能close連接,所以主機B是比主機A早關閉的。
為什么是四次揮手
TCP建立連接要進行三次握手,而斷開連接要進行四次。這是由于TCP的半關閉造成的。因為TCP連接是全雙工的(即數據可在兩個方向上同時傳遞)所以進行關閉時每個方向上都要單獨進行關閉
2)TCP和UDP的區別,如何保證TCP的可靠性
https://blog.csdn.net/zhang6223284/article/details/81414149
3)在瀏覽器中輸入www.umfintech.com,到顯示出頁面內容,前后端發生了什么
https://blog.csdn.net/qiuchaoxi/article/details/79415400
輸入域名地址–DNS解析域名的ip地址–瀏覽器與服務器建立TCP連接,瀏覽器向服務器發送HTTP請求—服務器response給瀏覽器–TCP斷開鏈接–瀏覽器解析返回的jsp、css、圖片等信息,形成HTML顯示到頁面
4)DNS協議的原理
https://www.cnblogs.com/gopark/p/8430916.html
DNS將域名解析為ip的翻譯器
一個域名首先查找瀏覽器緩存,如果沒有,首先查詢本機hosts文件和dns緩存,如果沒有,dns客戶端向本地dns服務器查詢,dns服務器直接查詢全球13個定級域名服務器,如果本地區域配置中有,則返回給客戶端,如果沒有查詢dns服務器本地緩存–采用的是遞歸查詢
如果還是沒有,需要本地dns服務器向其他dns服務器查詢,采用迭代查詢
5)HTTP請求的報文格式、響應的報文格式
請求格式:請求行(方法post或者get、協議、url)+請求頭(Accept-Charset等)+請求數據
請求行
3部分組成,分別為:請求方法、URL、以及協議版本
請求頭
Host 接受請求的服務地址,可以是IP:端口號,也可以是域名
Connection 指定與連接的相關屬性:Keep-Alive
Accept-Encoding 通知服務端可以發送的數據壓縮格式
User-Agent 發送請求的應用程序名
Accept-Language 通知服務端可以發送的語言
Accept-Charset 通知服務端可以發送的編碼格式
HTTP響應報文主要由狀態行、響應頭部、響應正文3部分組成
常見狀態碼:
200–客戶端請求成功
500–服務器發生未知錯誤
403–服務器收到請求,但是拒絕服務
400–客戶端請求有語法錯誤,不能被服務器理解
404–資源不存在
響應頭
Server 服務器應用程序軟件的名稱和版本
Content-Type 發送給接收者的實體正文的媒體類型
Accept-Language 描述資源所用的自然語言,沒有設置則該選項則認為實體內容將提供給所有的語言閱讀
Content-Lenght 實體正文的長度
1、支持客戶/服務器模式。
2、簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、POST、PUT、DELETE。每種方法規定了客戶與服務器聯系的類型不同。由于HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3、靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4、無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
5、無狀態:HTTP協議是無狀態協議。無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快
6)HTTP響應碼有哪些
7)常見的關系型數據庫和非關系型數據庫及其區別
關系型數據庫:sqlserver、db2、mysql、oracle
關系型數據庫最典型的數據結構是表,由二維表及其之間的聯系所組成的一個數據組織
優點:
1、易于維護:都是使用表結構,格式一致;
2、使用方便:SQL語言通用,可用于復雜查詢;
3、復雜操作:支持SQL,可用于一個表以及多個表之間非常復雜的查詢。
4、成熟度高、具有數據庫事務能力
缺點:
1、讀寫性能比較差,尤其是海量數據的高效率讀寫;
2、固定的表結構,靈活度稍欠;
3、高并發讀寫需求,傳統關系型數據庫來說,硬盤I/O是一個很大的瓶頸。
二、非關系型數據庫–mongondb、redis
非關系型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合,可以是文檔或者鍵值對等。
優點:
1、格式靈活:存儲數據的格式可以是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,使用靈活,應用場景廣泛,而關系型數據庫則只支持基礎類型。
2、速度快:nosql可以使用硬盤或者隨機存儲器作為載體,而關系型數據庫只能使用硬盤;
3、高擴展性;
4、成本低:nosql數據庫部署簡單,基本都是開源軟件。
缺點:
1、不提供sql支持,學習和使用成本較高;
2、無事務處理能力,且成熟度地,可參考的資料較少;
3、數據結構相對復雜,復雜查詢方面稍欠。
8)cookie和session、token的區別
https://www.jianshu.com/p/2f7031a69f43
Cookie是客戶端保存數據的一種手段,可以存儲任何數據,一般以文件存儲
會話級cookie
持久性cookie
保存在客戶端本地,
session是服務端保存數據的一種手段,存儲用戶的關鍵信息,可以存儲任何數據,一般以內存存儲,每個用戶對應一個session(私有的),服務端會存儲很多session,每個seesion有自己唯一的id,有過期時間,一段時間沒有更新就會銷毀
缺點:多臺服務器不共享
token:客戶端一種身份驗證的機制,是一個經過加密的字符串,服務端需要解密
服務器會給客戶端返回token,客戶端需要自己保存在內存中
服務器端將token單獨、集中存儲到緩存數據庫(redis)
token一般都是加密的
有效期比較長,比如app登錄
特點:無狀態、可擴展、支持移動設備、跨程序調用、安全(因為是加密的)
9)單例模式是什么,有什么應用場景
10)同步和異步的區別
同步交互:指發送一個請求,需要等待返回,然后才能夠發送下一個請求,有個等待過程;
異步交互:指發送一個請求,不需要等待返回,隨時可以再發送下一個請求,即不需要等待。
區別:一個需要等待,一個不需要等待,在部分情況下,我們的項目開發中都會優先選擇不需要等待的異步交互方式。
同步是用于確保資源一次只能被一個線程使用的過程,同步對于單線程程序沒有任何好處。使用同步比非同步的性能差三到四倍。
線程都是獨立的,而且異步執行,也就是說每個線程都包含了運行時所需要的數據或方法,而不需要外部的資源或方法,也不必關心其它線程的狀態或行為。但是經常有一些同時運行的線程需要共享數據,此時就需考慮其他線程的狀態和行為,否則就不能保證程序的運行結果的正確性。
需要做的是允許一個線程徹底完成其任務后,再允許下一個線程執行。必須保證一個共享的資源一次只能被一個線程使用。實現此目的的過程稱為同步。
11)進程和線程的區別
進程:進程是不共享資源的,相互獨立的,安全,耗資源,一個進程可以起50線程,資源分配的基本單位
線程:線程之間共享資源,不安全,程序執行的最小單位
進程是資源分配的最小單位,線程是程序執行的最小單位。
進程有自己的獨立地址空間,每啟動一個進程,系統就會為它分配地址空間,建立數據表來維護代碼段、堆棧段和數據段,這種操作非常昂貴。而線程是共享進程中的數據的,使用相同的地址空間,因此CPU切換一個線程的花費遠比進程要小很多,同時創建一個線程的開銷也比進程要小很多。
線程之間的通信更方便,同一進程下的線程共享全局變量、靜態變量等數據,而進程之間的通信需要以通信的方式(IPC)進行。不過如何處理好同步與互斥是編寫多線程程序的難點。
但是多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉并不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
12)線程都有幾種狀態?哪些狀態需要關注?
創建、可運行就緒、運行、阻塞、關閉
等待和阻塞
常見問題:
1、造成線程阻塞的方法?
阻塞線程的方法:join、yield、sleep 和Object的wait()方法
2、Java的守護進程(后臺進程)?
設置線程為后臺進程運行:setDaemon(true) 如果一個進程中只有后臺線程在運行,這個進程就會結束。
3、造成線程阻塞后,線程回到哪個狀態了?
通過join、yield、sleep造成線程阻塞后是回到了就緒狀態
3、哪些狀態之后是回到就緒狀態?
a)通過join、yield、sleep造成線程阻塞后是回到了就緒狀態
b)遇到synchronized后
c)遇到Object的等待wait方法后
4、sleep會釋放鎖嗎?
sleep不會釋放鎖【它會抱著鎖睡覺】
5、線程都有哪些狀態?具體是怎么運行的?
線程有:創建、就緒、運行、阻塞、終止。5種狀態
1.通過new關鍵字創建后,進入到新生狀態
2.調用start后進入就緒狀態
3.CPU調度到本線程后,本線程開始執行。進入到運行狀態
4.運行中遇到join,yield,sleep造成阻塞,進入阻塞狀態。阻塞完成后,又回到就緒狀態
5.線程正常執行完,或者遇到異常終止后,進入死亡狀態
6、終止線程有哪幾種方法?
線程調用 stop()方法、destory()方法或 run()方法執行結束后,線程即處于死亡狀態。處于死亡狀態的線程不具有繼續運行的能力。
https://www.cnblogs.com/duanjiapingjy/p/9434244.html
13)Linux中查找一個文件并且刪除它(一條命令)
find /-name “文件名” | xargs rm -rf
14)什么是索引
https://blog.csdn.net/fengdi51764/article/details/79536605
三、業務相關
1)介紹之前測試過的系統的業務流程、系統架構
2)怎么理解支付行業,公司的盈利模式是什么
3)介紹付款防重的方法和保證資金安全的方法
1 關系型數據庫唯一鍵(數據庫鎖)作為訂單id唯一的保證。(但是一旦數據庫出問題發生腦裂會重復付款)
2 分布式鎖(redis)作為訂單id唯一的保證。(但是一旦redis出問題也會重復)
(1+2的方式更能保證不重復)
3 同一商戶號 訂單日期。校驗收款人姓名 賬戶 金額是否完全一致,一致認為疑似重復,由商戶確認(幫助商戶做防重)
4 內部生成流水號要唯一:使用數據庫自增鍵作為流水號
四、專項測試
1)有幾種類型的瀏覽器,核心的區別在什么地方,測試的時候需要關注什么
谷歌、safai:WebKit核心/主要用于Mac OS系統,它的特點在于源碼結構清晰、渲染速度極快。
火狐:Gecko核心、跨平臺
IE:Trident核心,Windows平臺,且是不開源的,與windows系統綁定
2)TestNG有哪些標簽、有哪些監聽器
3)selenium的原理
4)selenium定位方式有哪些
5)自動化測試項目的工程結構是什么樣的,是否封裝過公共方法
6)如何提高自動化測試的穩定性
7)一盒魔法盒子,能從里面變出東西,寫出測試用例
8)移動端專項測試關注哪些方面
兼容性、流量、耗電量、網絡(無線、2G、3G、4G、5G、軟網)、安裝卸載。與其他系統的兼容性、穩定性
9)性能測試的流程是什么
需求調研-環境準備-編寫腳本–準備測試數據-執行壓測-回歸調優-出測試報告
10)對于Linux系統,主要的監控指標有哪些?他們的各自閾值是多少?
cpu<80%
內存<80%
網絡IO<帶寬上線
磁盤IO<100-90%
load值<cpu核數
11)常見的性能指標有哪些?分別是什么含義?
tps:每秒事務量,代表了系統的處理能力,tps越高,性能越好
響應時間:從發出請求到接受到系統響應數據所花費的時間,響應時間越短,性能越好
吞吐量:網絡上行和下行流量的總和,吞吐量是網絡瓶頸定位的重要指標
錯誤率:在壓測過程中系統出現錯誤的比例
12)Mock的優點和缺點
優點:由其他模塊錯誤導致的本測試項做錯,可以作為隔離,提高穩定性
開發過程中,只要交互雙方定義好接口,團隊之間可以并行工作,進程互不影響;
依賴系統無法響應,或者響應異常時,可以用mock Object代替,快速反應,不會影響測試進度;
提前接入測試,提供測試效率,當接口定義好后,測試人員就可以創建Mock,把接口添加到自動化測試環境,提前開始測試,起到測試驅動開發效果;
缺點:不能表現真實的測試環境,可能會漏掉某些bug,使bug在系統測試階段才被發現,比較晚
13)自動化測試腳本維護成本是什么樣的
14)怎么理解devops,做過哪些相關工作
DevOps(Development和Operations的組合詞)是一種重視“軟件開發人員(Dev)”和“IT運維技術人員(Ops)”
DevOps是一組過程、方法與系統的統稱,用于促進開發(應用程序/軟件工程)、技術運營和質量保障(QA)部門之間的溝通、協作與整合。
DevOps 是一個完整的面向IT運維的工作流,以 IT 自動化以及持續集成(CI)、持續部署(CD)為基礎,來優化程式開發、測試、系統運維等所有環節。
15)是否了解靜態代碼掃描和代碼覆蓋率工具
五、算法編程題
1)求字符串“abcd”的全排列–完成
2)求一個字符串的最大子串–完成
3)單鏈表逆轉
4)單鏈表判斷是否有環
5)文件拷貝–FileInputStream FileOutputStream
6)判斷字符串回文–容易
7)兩個有序的字符串合并之后,排序–完成
8)數組中查找出現次數過半的數–容易
9)刪除字符串a中包含的字符串b,舉例:輸入a = “asdw”,b = “sd” 返回 字符串 “aw”,并且測試這個程序–容易
10)1~9999數列中數字3出現的次數–完成
11) 查找鏈表的倒數第三個數(代碼實現)
六、組織和管理能力
1)團隊是怎么劃分的,團隊的結構是什么樣的
2)怎么給團隊成員制定績效并考核
3)帶團隊過程中面臨過的最大問題是什么
4)如何跟產品、研發等其他團隊協作
5)最看重團隊成員的什么特質
6)未來的職業規劃是什么樣的
面試題還不錯
https://www.jianshu.com/p/8c3f3b2a94f2
https://www.cnblogs.com/z1201-x/p/11149249.html
壓力測試和負載測試的區別
壓力測試:是在高負載情況下來對系統的穩定性進行測試,更有效地發現系統穩定性的隱患和系統在負載峰值的條件下功能隱患等。
負載測試:通過改變系統負載方式、增加負載等來發現系統中所存在的性能問題。負載測試是一種測試方法,可以為性能測試、壓力測試所采用。
性能測試是為獲取或驗證系統性能指標而進行測試。多數情況下,性能測試會在不同負載情況下進行。
shell腳本每隔2s獲取某個進程的cpu和mem數據并保存到csv文件
echo “%CPU,%MEM” > cpu_test.csv
pid=1 #Can be change by yourself
while true
do
top -bn1 -n 1 -p $pid | tail -1 | awk ‘{ print $9,$10 }’ | sed ‘s/ /,/’ >> cpu_test.csv
sleep 2 #delay time
done
總結
- 上一篇: Server Tomcat v6.0 S
- 下一篇: 日积月累-从细节做起