文章已被51測試網(wǎng)收錄:https://mp.weixin.qq.com/s/Mdbyvu-C0WVCfGsYVxTRGA
一、 為什么從開發(fā)轉(zhuǎn)測試
筆者從2019年5月開始從一名java開發(fā)女程序猿正式轉(zhuǎn)為測試開發(fā)工程師,原因 除了機(jī)緣湊巧之外,當(dāng)然是因?yàn)檫@個行業(yè)對測試工程師的要求已經(jīng)越來越高,簡單做 些UI腳本錄制和回放的自動化,參考度娘寫出框架demo卻不知道問題出在哪里的測試 人員,已經(jīng)不能滿足企業(yè)快速迭代產(chǎn)品,保證產(chǎn)品質(zhì)量的需求。當(dāng)一個產(chǎn)品越來越龐 大、用例越來越多,用例如何設(shè)置、腳本如何規(guī)劃、代碼結(jié)構(gòu)如何優(yōu)化,當(dāng)需求變動 時又如何做到高可維護(hù)、高健壯性的問題會接踵而來。所以,一名優(yōu)秀的測試開發(fā)工 程師是必須具備優(yōu)秀的代碼能力,甚至知識面是需要比普通的開發(fā)人員更廣的,比如 他需要熟悉自動化測試、服務(wù)器部署、網(wǎng)絡(luò)架構(gòu)、軟件性能、軟件安全等等方面的知 識。 所以開發(fā)工程師轉(zhuǎn)測試之后可做的內(nèi)容非常的多,測試這塊領(lǐng)域也需要更多有開 發(fā)背景的人員加入。
二、 前言
背景嘮嗑完,我們來說說面試題,由于是開發(fā)轉(zhuǎn)測試,首先開發(fā)的進(jìn)階基礎(chǔ)知識 是必須要掌握的,面試官也肯定會問(說不定直接是開發(fā)組的人面的),接著會問一 些功能測試的知識點(diǎn),但是一般不會多,然后是比較重要的自動化測試部分,做自動 化測試框架有很多,每個公司用的也不一樣,如果沒用過面試官說的,就說自己用過 那套的邏輯就好。如果沒有在工作中實(shí)踐過,非常有必要的告訴大家,在面試之前也 一定要多百度熟悉多動手寫demo,不要讓面試官問的工具和術(shù)語你都沒聽說過,那么 還沒開始就結(jié)束了的面試只會剩下尬聊(哭暈)。最后前面聊得愉快的話,面試官一 般還會繼續(xù)考察你的其他能力,比如性能、安全、Linux、數(shù)據(jù)庫、軟件架構(gòu)等。下述 內(nèi)容為大家準(zhǔn)備了每個知識點(diǎn)比較常見的面試題,大家可以參考并且發(fā)散準(zhǔn)備,最后 記得準(zhǔn)備必問題目:為什么從開發(fā)轉(zhuǎn)測試?參考我第一章的答案?
三、 開發(fā)基礎(chǔ)面試題
自動化常用的語言是 java 和 python,參考面試題:
(1) JAVA知識
Q1:List、Set、Map 之間的區(qū)別
List 是一個有序集合,允許元素重復(fù)。它的某些實(shí)現(xiàn)可以??供基于下標(biāo)值的常量訪問 時間,但是這不是 List 接口保證的。Set 是一個無序集合。
Q2:ArrayList 與 LinkedList 的區(qū)別?
最明顯的區(qū)別是 ArrrayList 底層的數(shù)據(jù)結(jié)構(gòu)是數(shù)組,支持隨機(jī)訪問,而 LinkedList 的底層數(shù)據(jù)結(jié)構(gòu)書鏈表,不支持隨機(jī)訪問。使用下標(biāo)訪問一個元素,ArrayList 的時間 復(fù)雜度是 O(1),而 LinkedList 是 O(n)。
Q3:Hashtable 與 HashMap 有什么不同之處?
這兩個類有許多不同的地方,下面列出了一部分: a) Hashtable 是 JDK 1 遺留下來 的類,而 HashMap 是后來增加的。 b)Hashtable 是同步的,比較慢,但 HashMap 沒有同步策略,所以會更快。 c)Hashtable 不允許有個空的 key,但是 HashMap 允許出現(xiàn)一個 null key。d)HashMap 線程不安全
Q4:Java 中 ++ 操作符是線程安全的嗎? 不是線程安全的操作。它涉及到多個指令,如讀取變量值,增加,然后存儲回內(nèi)存,
這個過程可能會出現(xiàn)多個線程交差。
Q5:int 和 Integer 哪個會占用更多的內(nèi)存?
Integer 對象會占用更多的內(nèi)存。Integer 是一個對象,需要存儲對象的元數(shù)據(jù)。但是 int 是一個原始類型的數(shù)據(jù),所以占用的空間更少
Q6:Java 中 sleep 方法和 wait 方法的區(qū)別?
雖然兩者都是用來暫停當(dāng)前運(yùn)行的線程,但是 sleep() 實(shí)際上只是短暫停頓,因?yàn)樗?不會釋放鎖,而 wait() 意味著條件等待,這就是為什么該方法要釋放鎖,因?yàn)橹挥羞@ 樣,其他等待的線程才能在滿足條件時獲取到該鎖。
Q7:解釋 Java 堆空間及 GC?
當(dāng)通過 Java 命令啟動 Java 進(jìn)程的時候,會為它分配內(nèi)存。內(nèi)存的一部分用于創(chuàng)建 堆空間,當(dāng)程序中創(chuàng)建對象的時候,就從對空間中分配內(nèi)存。GC 是 JVM 內(nèi)部的一 個進(jìn)程,回收無效對象的內(nèi)存用于將來的分配。
(2) Python知識
Q1:python 基本數(shù)據(jù)類型? int、str、float、list、bool、tuple 元組、dict 字典、set 集合
Q2:列出 python 中可變數(shù)據(jù)類型和不可變數(shù)據(jù)類型,并簡述原理
不可變數(shù)據(jù)類型:數(shù)值型、字符串 string、元組 tuple: 如果改變了變量的值,相當(dāng)于 是新建了一個對象,如果是相同的值,只用一個內(nèi)存地址保存
可變數(shù)據(jù)類型:列表 list、字典 dict:允許變量的值發(fā)生變化,即如果對變量進(jìn)行 append、+=等這種操作后,只是改變了變量的值,而不會新建一個對象,變量引用的 對象的地址也不會變化
Q3:python 字典和 json 字符串相互轉(zhuǎn)化方法 字典轉(zhuǎn) json:json.dumps() json 轉(zhuǎn)字典:json.loads()
Q4:Python 中@staticmethod 和@classmethod 的區(qū)別
在類中總共有三種方法:普通方法:需要參數(shù),使用時默認(rèn)將類的實(shí)例對象傳進(jìn)去, 類調(diào)用的時候需要傳遞實(shí)例對象@staticmethod 裝飾的靜態(tài)方法與普通函數(shù)相同:實(shí) 例和類均可調(diào)用,沒有默認(rèn)的參數(shù)傳遞進(jìn)去@classmethod 裝飾的類方法:需要參 數(shù),使用時將調(diào)用的類傳進(jìn)去
Q5:什么是裝飾器? 裝飾器的本質(zhì)是一個閉包函數(shù),實(shí)現(xiàn)的功能是在不修改原函數(shù)及調(diào)用方式的情況下對
原函數(shù)進(jìn)行功能擴(kuò)展的,是開放封閉原則的典型代表。
Q6:python 中常見的異常舉例 Exception 所有異常類的基類 AssertionError assert 語句失敗 FileNotfoundError 文件打開失敗 AttributeError 試圖訪問對象沒有屬性
Q7:Python 是如何進(jìn)行內(nèi)存管理的?
1.對象的引用計數(shù)機(jī)制 Python 內(nèi)部使用引用計數(shù),來保持追蹤內(nèi)存中的對象,所有對象都有引用計數(shù)。
2.垃圾回收機(jī)制 當(dāng)一個對象的引用計數(shù)歸零時,它將被垃圾收集機(jī)制處理掉。
3.內(nèi)存池機(jī) Python ??供了對內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而 不是返回給操作系統(tǒng)制
(3) 數(shù)據(jù)庫知識
Q1:數(shù)據(jù)表 student 有 name 字段,其中 name 中的名字可有重復(fù),需要消除重復(fù)行select distinct name from student Q2:什么是內(nèi)鏈接、左鏈接、右鏈接、全鏈接?
(1)INNER JOIN 產(chǎn)生的結(jié)果集中,是左和右的交集 (2)LEFT JOIN 返回左表的 全部行和右表滿足 ON 條件的行,其他 null 替代 (3)RIGHT JOIN 返回右表的全部 行和左表滿足 ON 條件的行,其他 null 替代 (4)FULL JOIN 會從左表 和右表 那里返回所有的行,如果其中一個表的數(shù)據(jù)行在另一個表中沒有匹配的行,那么對面的數(shù) 據(jù)用 NULL 代替
Q3:某個字段被建立索引后,數(shù)據(jù)的什么操作會使用到該索引?
(1)對建立了索引的字段做 where 條件查詢時
(2)多表做 join 操作時會使用索引 (3)對建立了索引的字段做 min()或 max()時 (4)對建立了索引的字段做 sort 或 group 操作時
(4) http知識
Q1:http 協(xié)議是不是安全的?如果不是,如何確保傳輸安全?
HTTP 的連接很簡單,是無狀態(tài)的,所以不安全,HTTPS 協(xié)議是由 SSL+HTTP 協(xié)議 構(gòu)建的可進(jìn)行加密傳輸、身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,是 HTTP 的安全版。(SSL 協(xié)議的對 稱密鑰加密、非對稱密鑰加密 Google 查資料)
Q2: 簡述 cookie 和 session 的區(qū)別
session 在服務(wù)器端,cookie 在客戶端(瀏覽器),session 的運(yùn)行依賴 session id,而 session id 是存在 cookie 中的,也就是說,如果瀏覽器禁用了 cookie ,同 時 session 也會失效,存儲 Session 時,鍵與 Cookie 中的 sessionid 相同,值是開 發(fā)人員設(shè)置的鍵值對信息,進(jìn)行了 base64 編碼,過期時間由開發(fā)人員設(shè)置
Q3: 什么是socket?
socket 是在應(yīng)用層和傳輸層之間的一個抽象層,它把 TCP/IP 層復(fù)雜的操作抽象為幾個簡單的接口供應(yīng)用層調(diào)用以實(shí)現(xiàn)進(jìn)程在網(wǎng)絡(luò)中通信。
(5) Git 知識
Q1: gitpull和gitfetch之間有什么區(qū)別?
簡單來說,git pull 是 git fetch + git merge。
1.git pull 會把所有拉取的??交合并到當(dāng)前處理的分支中,如果沒有細(xì)心管理分支,可 能會頻繁遇到?jīng)_突。
2.git fetch 會收集目標(biāo)分支中的所有不存在的??交,并將這些??交存儲到本地倉庫 中。但 Git 不會把這些??交合并到當(dāng)前分支中
Q2: git如何進(jìn)行版本回退 git reset --hard HEAD^
Q3: gitlab 如何進(jìn)行分支保護(hù)和代碼審查
四、 測試開發(fā)面試題
Q1: 接口測試如例如何設(shè)計
Q2: 自動化框架的搭建思路,分別有什么模塊,作用是什么?
用例模塊、發(fā)送請求、全局配置文件、數(shù)據(jù)自動采集、讀取數(shù)據(jù)、接口斷言、日志記 錄、測試報告
Q3: 測試數(shù)據(jù)有幾種,分別放哪里?
全局?jǐn)?shù)據(jù):寫入配置文件 一次性消耗數(shù)據(jù):從隨機(jī)函數(shù)生成 需要被接口多次讀取數(shù) 據(jù):參數(shù)化,放入 excel、json、或者從數(shù)據(jù)庫讀取 接口數(shù)據(jù)文件:數(shù)據(jù)驅(qū)動、使用 excel 管理測試接口
Q4: 影響數(shù)據(jù)流的接口如何處理,比如刪除這種接口如何測試 方法一:最后單獨(dú)處理這個接口,單獨(dú)造獨(dú)立的數(shù)據(jù)去刪除,豐富數(shù)據(jù) 方法二:連接到數(shù)據(jù)庫中操作
Q5: 測試腳本數(shù)據(jù)如何規(guī)劃設(shè)計
V1.0:跑通一個流程的接口(約 10 個),常量數(shù)據(jù)腳本 V2.0:跑通一個流程的接口(約 10 個),數(shù)據(jù)參數(shù)化,數(shù)據(jù)與腳本分離 V3.0:跑通所有接口,數(shù)據(jù)參數(shù)化,數(shù)據(jù)與腳本分離 V4.0:多組有效數(shù)據(jù),保證所有接口能全部跑通且??高覆蓋率 V5.0:多組無效數(shù)據(jù),加強(qiáng)測試覆蓋率
Q6: 使用什么框架完成自動化?講述使用過程 unittest、pytest、postman、jmeter、Selenium、Appnium 等
Q7: unittest、pytest 框架對比
pytest 相較于 unittest 最為跳躍的一點(diǎn)應(yīng)該就是 fixture 機(jī)制。對于 unittest 來說, 每個用例的類中都需要去寫入 setUp 和 tearDown。也就是我們所說的前置和后置,而 不可避免的,很多用例的前置和后置都是一樣,重復(fù)的復(fù)制粘貼致工作量增加,代碼 量也增加。
Q8:pytest 的@pytest.mark.parametrize 裝飾器作用是什么?
@pytest.mark.parametrize 裝飾器可以讓我們每次參數(shù)化 fixture 的時候傳入多個項(xiàng) 目。回憶上一節(jié),我們參數(shù)化的時候只能傳入 1 個字符串或者是其他的數(shù)據(jù)對象, parametrize 每次多個參數(shù),更加靈活。
Q9:postman + Newman 相關(guān)問題 是否會使用 postman 完成接口的基本調(diào)試? 變量有幾種,作用域分別是什么? 如何使用變量?
sandbox 如何使用,如何實(shí)現(xiàn)斷言 如何實(shí)現(xiàn)接口參數(shù)化,以及接口傳遞 Newman 的作用是什么,如何使用 如何輸出 html 格式的測試報告
Newman 是否可以改造
Q10:selenium 常用的八大定位法 Id、name、link_text、partial_link_text、tag_name、class_name、css_selector、
xpath
Q11:GUI 測試如何??高腳本的穩(wěn)定性
不要右鍵復(fù)制 xpath(十萬八千里那種路徑,肯定不穩(wěn)定),自己寫相對路徑,多用 name 定位,sleep 等待盡量少用(影響執(zhí)行時間)、使用 WebDriverWait,結(jié)合 WebDriverWait 和 expected_conditions 判斷元素方法,自己封裝一套定位元素方法
五、 擴(kuò)展問題
Q1: 安全測試有哪些方面?
Q2: 簡述性能測試、負(fù)載測試、壓力測試 性能測試是通過自動化的測試工具模擬多種正常、峰值以及異常負(fù)載條件來對系統(tǒng)的各項(xiàng)性能指標(biāo)進(jìn)行測試。負(fù)載測試- 核實(shí)在保持配置不變的情況下,測試對象在不同操作條件(如不同用戶 數(shù)、事務(wù)數(shù)等)下性能行為的可接受性壓力測試:壓力測試主要是為了測試硬件系統(tǒng)是否達(dá)到需求文檔設(shè)計的性能目標(biāo),譬 如在一定時期內(nèi),系統(tǒng)的 cpu 利用率,內(nèi)存使用率,磁盤 I/O 吞吐率,網(wǎng)絡(luò)吞吐量 等,壓力測試和負(fù)載測試最大的差別在于測試目的不同。
Q3: 常用的性能指標(biāo)的名稱與具體含義。 響應(yīng)時間、并發(fā)用戶數(shù),吞吐量,性能計數(shù)器,TPS,HPS、XSS、CSRF 攻擊、SQL 注入攻擊、web 木馬攻擊、文件上傳攻擊、賬密暴力破解、驗(yàn)證碼缺陷、用戶權(quán)限、端口掃??、服務(wù)檢測、中間件安全。對這塊有要求的小伙伴找本書看看,推薦《web 安全防護(hù)指南基礎(chǔ)篇》