做了三年開發後,我是如何轉行軟體測試的?看這篇面試題就夠了

atstudy網校 發佈 2020-01-14T12:40:59+00:00

一、為什麼從開發轉測試我從2019年5月開始從一名java開發女程序猿正式轉為測試開發工程師,原因除了機緣湊巧之外,當然是因為這個行業對測試工程師的要求已經越來越高,簡單做些UI腳本錄製和回放的自動化,參考度娘寫出框架demo卻不知道問題出在哪裡的測試人員,已經不能滿足企業快速迭

一、為什麼從開發轉測試

我從2019年5月開始從一名java開發女程序猿正式轉為測試開發工程師,原因除了機緣湊巧之外,當然是因為這個行業對測試工程師的要求已經越來越高,簡單做些UI腳本錄製和回放的自動化,參考度娘寫出框架demo卻不知道問題出在哪裡的測試人員,已經不能滿足企業快速疊代產品,保證產品質量的需求。

當一個產品越來越龐大、用例越來越多,用例如何設置、腳本如何規劃、代碼結構如何優化,當需求變動時又如何做到高可維護、高健壯性的問題會接踵而來。所以,一名優秀的測試開發工程師是必須具備優秀的代碼能力,甚至知識面是需要比普通的開發人員更廣的,比如他需要熟悉自動化測試、伺服器部署、網絡架構、軟體性能、軟體安全等等方面的知識。

所以開發工程師轉測試之後可做的內容非常的多,測試這塊領域也需要更多有開發背景的人員加入。

二、前言

背景嘮嗑完,我們來說說面試題,由於是開發轉測試,首先開發的進階基礎知識是必須要掌握的,面試官也肯定會問(說不定直接是開發組的人面的),接著會問一些功能測試的知識點,但是一般不會多,然後是比較重要的自動化測試部分,做自動化測試框架有很多,每個公司用的也不一樣,如果沒用過面試官說的,就說自己用過那套的邏輯就好。

如果沒有在工作中實踐過,非常有必要的告訴大家,在面試之前也一定要多百度熟悉多動手寫demo,不要讓面試官問的工具和術語你都沒聽說過,那麼還沒開始就結束了的面試只會剩下尬聊(哭暈)。

最後前面聊得愉快的話,面試官一般還會繼續考察你的其他能力,比如性能、安全、Linux、資料庫、軟體架構等。下述內容為大家準備了每個知識點比較常見的面試題,大家可以參考並且發散準備,最後記得準備必問題目:為什麼從開發轉測試?參考我第一章的答案?

三、開發基礎面試題

自動化常用的語言是java和python,參考面試題:

(1)JAVA知識

Q1:List、Set、Map 之間的區別

List 是一個有序並且允許元素重複的集合,它的底層數據結構是數組,數組的優缺點都很明顯,就是查詢速度很快,但是要做數據移動,比如增加、刪除速度就會很慢。

Set 是一個無序且不允許元素重複的集合,它的底層數據結構是哈希表,它的優缺點是跟數組完全相反的,既查詢速度慢,但是增加、刪速度很快。

Map也是集合的一部分,它最大的特點是key-value形的,並且key不能重複出現,但是value可以重複出現,這對我們某些業務,如用戶重複處理能起到重要作用。

Q2:ArrayList 與 LinkedList 的區別?

ArrrayList說白了就是個數組,所以自然也是有數據的優缺點的,比如支持隨機訪問,查詢速度快。而LinkedList 的底層數據結構是鍊表,所以是不支持隨機訪問的,在代碼中用下標訪問一個元素時,ArrayList 的time complexity是 O(1),而 LinkedList 是O(n)。

Q3:Hashtable 與 HashMap 有什麼不同之處?

Hashtable 是過時了的遺留下來的類,後面新增的是HashMap。Hashtable 的方法是同步的,所以時間上比較慢,但HashMap 沒有同步策略,雖然時間更快了但是也導致它另外一個問題:HashMap是線程不安全的。因為是異步的,在線程並發時可能會導致數據錯亂。

Q4:Java 中 ++ 操作符是線程安全的嗎?

當然不是線程安全的操作,因為這個過程涉及到多個指令,比如先讀取變量值,然後進行增加操作,最後存儲回內存,整個過程可能會出現多個線程交差。所以說它不是線程安全的。

Q5:int 和 Integer 哪個會占用更多的內存?

由於Integer 是一個對象,不僅需要存儲指向對象的指針,還要存儲對象值,所以會占用更多的內存。但是 int 是八種數據類型之一,不需要實例化才能使用,所以占用的空間更少一些。

Q6:Java 中 sleep 方法和 wait 方法的區別?

這兩個方法是繼承自不同的類的,所以雖然都可以用來暫停當前運行的線程,但sleep() 只是短暫停頓,並不會釋放鎖,而 wait() 是條件等待,使用了該方法之後,還要釋放鎖,不然其他等待的線程就不能在滿足條件時獲取到該鎖。而且sleep必須捕獲異常的,但wait不需要捕獲異常

Q7:解釋 Java 堆空間及 GC?

當通過 Java 命令啟動 Java 進程的時候,會為它分配內存。內存的一部分用於創建堆空間,當程序中創建對象的時候,就從對空間中分配內存。GC 是 JVM 內部的一個進程,回收無效對象的內存用於將來的分配。

(2)Python知識

Q1:python的八大基本數據類型是?

int、str、float、list、bool、tuple元組、dict字典、set集合

Q2:python中可變數據類型和不可變數據類型有哪些?

不可變數據類型:數值型、字符串string、元組tuple,這類數據類型改變了變量的值相當於是新建了一個對象,也就是如果值是是相同,那麼只用一個內存地址保存

可變數據類型:列表list、字典dict:允許變量的值發生變化,即如果對變量進行append、+=等這種操作後,只是改變了變量的值,而不會新建一個對象,變量引用的對象的地址也不會變化

Q3:python字典和json字符串相互轉化方法是?

字典轉json使用:json.dumps()

json轉字典使用:json.loads()

Q4:Python中@staticmethod和@classmethod的區別

首先說一下什麼是普通方法,普通方法需要傳遞參數,類調用的時默認會將類的實例對象傳進去。

@staticmethod裝飾的靜態方法與普通函數相同:實例和類均可調用,但是不需要傳遞默認的參數進去

@classmethod裝飾的類方法:也需要參數,使用時需要將調用的類傳進去

Q5:什麼是裝飾器?

裝飾器的本質是一個閉包函數,實現的功能是在不修改原函數及調用方式的情況下對原函數進行功能擴展的,是開放封閉原則的典型代表,我們在業務中有編程場景可以用上裝飾器,比如用戶登陸後的權限校驗、執行函數前的預備處理、執行後的功能清理、以及更高級的事務處理等等。

Q6:python中常見的異常舉例

Exception 所有異常類的基類

AssertionError assert語句失敗

FileNotfoundError 文件打開失敗

AttributeError 試圖訪問對象沒有屬性

Q7:Python是如何進行內存管理的?

Python一個高效語言的原因之一是因為它有非常完善的內存管理機制,在python中萬物皆對象,所以圍繞對象的內存管理是整個的核心。第一:對象的引用計數機制,python是使用引用計數來保持追蹤內存中的對象。第二:垃圾回收機制,當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉,保證對象可回收。第三:內存池機,Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給作業系統制

(3)資料庫知識

Q1:數據表project有code欄位,其中code中的編碼名有重複,如何消除重複行?

select distinct code from project

Q2:什麼是內連結、左連結、右連結、全連結?

(1)INNER JOIN產生的結果集中,是左和右的交集 (2)LEFT JOIN返回左表的全部行和右表滿足ON條件的行,其他null替代 (3)RIGHT JOIN返回右表的全部行和左表滿足ON條件的行,其他null替代 (4)FULL JOIN 會從左表 和右表 那裡返回所有的行,如果其中一個表的數據行在另一個表中沒有匹配的行,那麼對面的數據用NULL代替。這個問題基本是問資料庫問題必問的,大家還可以深入準備下哪些業務場景用到哪種連結。

Q3:某個欄位被建立索引後,數據的什麼操作會使用到該索引?

(1)對建立了索引的欄位做where條件查詢時

(2)多表做join操作時會使用索引

(3)對建立了索引的欄位做min()或max()時

(4)對建立了索引的欄位做sort排序操作時

其中我們用索引最多的時候在查詢場景,但同時索引查詢也會增加內存消耗,所以索引查詢該如何優化是一個更大的問題,此類問題也是資料庫常見面試題之一,有興趣的小夥伴可以自行查閱資料。

(4)http知識

Q1:http協議是不是安全的?如果不是,如何確保傳輸安全?

HTTP的連接很簡單,是無狀態的,所以不安全,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,是HTTP的安全版。(SSL協議的對稱密鑰加密、非對稱密鑰加密Google查資料)

Q2: 簡述cookie和session的區別

session 在伺服器端,而cookie 在客戶端(瀏覽器)

cookie 由於是放在客戶端的,存在不安全性,容易被黑客利用

session 放在服務端的,安全相對較高,但是如果網站訪問量較大的時候,session的存儲機制會占用伺服器較多內存,所以同時需要考慮性能優化的問題

Q3: 什麼是socket?

網絡中的進程一般是通過socket通信的,socket是在應用層和TCP/IP協議通信之間的抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的接口,供應用層調用以實現進程在網絡中通信,socket函數的本質是操作文件,如讀寫I/O、打開進程、關閉進程。

(5)Git 知識

Q1: git pull和git fetch之間有什麼區別?

簡單來說,git pull 是 git fetch + git merge。

1.git pull 會拉取所有的提交並且合併到當前處理的分支中,如果沒有細心管理分支,可能會頻繁遇到衝突。

2.git fetch 會拉取目標分支中所有本地不存在的提交,將這些遠程提交存儲到本地倉庫中,但不會把這些提交合併到當前分支中,如果跟小夥伴的代碼存在較大可能心時,建議先用git fetch拉取代碼,後用 git merge合併代碼

Q2: git如何進行版本回退

git reset --hard HEAD^

Q3: gitlab如何進行分支保護和代碼審查

Gitlab是部署在自己伺服器的一套git代碼版本管理系統,部署完畢後讓自己的成員在該網址上註冊好帳號,管理員建立對應的項目組並且拉相關成員進組,需要給對應的成員設置好角色,因為角色不同決定了對整個項目的操作權限不同。代碼分支管理在設置中的Protected Branches,在Allowed to merge下選擇對應角色的成員既有權利管理master分支,並且在其他成員將自己分支合併到master分支之前做好代碼審查工作。

四、測試開發面試題

Q1: 接口測試如例如何設計

Q2: 自動化框架的搭建思路,分別有什麼模塊,作用是什麼?

用例模塊、發送請求、全局配置文件、數據自動採集、讀取數據、接口斷言、日誌記錄、測試報告

Q3: 測試數據有幾種,分別放哪裡?

全局數據:寫入配置文件 一次性消耗數據:從隨機函數生成 需要被接口多次讀取數據:參數化,放入excel、json、或者從資料庫讀取 接口數據文件:數據驅動、使用excel管理測試接口

Q4: 影響數據流的接口如何處理,比如刪除這種接口如何測試

方法一:最後單獨處理這個接口,單獨造獨立的數據去刪除,豐富數據

方法二:連接到資料庫中操作

Q5: 測試腳本數據如何規劃設計

V1.0:跑通一個流程的接口(約10個),常量數據腳本

V2.0:跑通一個流程的接口(約10個),數據參數化,數據與腳本分離

V3.0:跑通所有接口,數據參數化,數據與腳本分離

V4.0:多組有效數據,保證所有接口能全部跑通且提高覆蓋率

V5.0:多組無效數據,加強測試覆蓋率

Q6: 使用什麼框架完成自動化?講述使用過程

unittest、pytest、postman、jmeter、Selenium、Appnium等

Q7: unittest、pytest框架對比

pytest 相較於 unittest 最為跳躍的一點應該就是 fixture 機制。對於unittest來說,每個用例的類中都需要去寫入setUp和tearDown。也就是我們所說的前置和後置,而不可避免的,很多用例的前置和後置都是一樣,重複的複製粘貼致工作量增加,代碼量也增加。

Q8:pytest的@pytest.mark.parametrize 裝飾器作用是什麼?

@pytest.mark.parametrize 裝飾器可以讓我們每次參數化fixture的時候傳入多個項目。回憶上一節,我們參數化的時候只能傳入1個字符串或者是其他的數據對象,parametrize每次多個參數,更加靈活。

Q9:postman + Newman相關問題

是否會使用postman完成接口的基本調試?

變量有幾種,作用域分別是什麼?

如何使用變量?

sandbox如何使用,如何實現斷言

如何實現接口參數化,以及接口傳遞

Newman的作用是什麼,如何使用

如何輸出html格式的測試報告

Newman是否可以改造

Q10:selenium常用的八大定位法

Id、name、link_text、partial_link_text、tag_name、class_name、css_selector、xpath

Q11:GUI測試如何提高腳本的穩定性

不要右鍵複製xpath(十萬八千里那種路徑,肯定不穩定),自己寫相對路徑,多用name定位,sleep等待儘量少用(影響執行時間)、使用WebDriverWait,結合WebDriverWait和expected_conditions判斷元素方法,自己封裝一套定位元素方法

五、擴展問題

Q1: 安全測試有哪些方面?

XSS、CSRF攻擊、SQL注入攻擊、web木馬攻擊、文件上傳攻擊、帳密暴力破解、驗證碼缺陷、用戶權限、埠掃描、服務檢測、中間件安全。對這塊有要求的小夥伴找本書看看,推薦《web安全防護指南基礎篇》

Q2: 簡述性能測試、負載測試、壓力測試

性能測試是通過自動化的測試工具模擬多種正常、峰值以及異常負載條件來對系統的各項性能指標進行測試。

負載測試- 核實在保持配置不變的情況下,測試對象在不同操作條件(如不同用戶數、事務數等)下性能行為的可接受性

壓力測試:壓力測試主要是為了測試硬體系統是否達到需求文檔設計的性能目標,譬如在一定時期內,系統的cpu利用率,內存使用率,磁碟I/O吞吐率,網絡吞吐量等,壓力測試和負載測試最大的差別在於測試目的不同。

Q3: 常用的性能指標的名稱與具體含義。

響應時間、並發用戶數,吞吐量,性能計數器,TPS,HPS

請關注+私信回覆:「測試」就可以免費拿到軟體測試學習資料。

關鍵字: