文章已被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è)對測試工程師的要求已經(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ā)組的人面的),接著會問一 些功能測試的知識點兰怠,但是一般不會多梦鉴,然后是比較重要的自動化測試部分,做自動 化測試框架有很多揭保,每個公司用的也不一樣肥橙,如果沒用過面試官說的,就說自己用過 那套的邏輯就好秸侣。如果沒有在工作中實踐過存筏,非常有必要的告訴大家宠互,在面試之前也 一定要多百度熟悉多動手寫demo,不要讓面試官問的工具和術(shù)語你都沒聽說過椭坚,那么 還沒開始就結(jié)束了的面試只會剩下尬聊(哭暈)予跌。最后前面聊得愉快的話,面試官一 般還會繼續(xù)考察你的其他能力善茎,比如性能券册、安全、Linux垂涯、數(shù)據(jù)庫烁焙、軟件架構(gòu)等。下述 內(nèi)容為大家準(zhǔn)備了每個知識點比較常見的面試題集币,大家可以參考并且發(fā)散準(zhǔn)備考阱,最后 記得準(zhǔn)備必問題目:為什么從開發(fā)轉(zhuǎn)測試?參考我第一章的答案?
三、 開發(fā)基礎(chǔ)面試題
自動化常用的語言是 java 和 python鞠苟,參考面試題:
(1) JAVA知識
Q1:List乞榨、Set、Map 之間的區(qū)別
List 是一個有序集合当娱,允許元素重復(fù)吃既。它的某些實現(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() 實際上只是短暫停頓遗遵,因為它 不會釋放鎖,而 wait() 意味著條件等待逸嘀,這就是為什么該方法要釋放鎖车要,因為只有這 樣,其他等待的線程才能在滿足條件時獲取到該鎖崭倘。
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)將類的實例對象傳進(jìn)去瑞信, 類調(diào)用的時候需要傳遞實例對象@staticmethod 裝飾的靜態(tài)方法與普通函數(shù)相同:實 例和類均可調(diào)用,沒有默認(rèn)的參數(shù)傳遞進(jìn)去@classmethod 裝飾的類方法:需要參 數(shù)穴豫,使用時將調(diào)用的類傳進(jìn)去
Q5:什么是裝飾器? 裝飾器的本質(zhì)是一個閉包函數(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)用以實現(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ù)流的接口如何處理肋殴,比如刪除這種接口如何測試 方法一:最后單獨處理這個接口囤锉,單獨造獨立的數(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 最為跳躍的一點應(yīng)該就是 fixture 機(jī)制旺罢。對于 unittest 來說, 每個用例的類中都需要去寫入 setUp 和 tearDown绢记。也就是我們所說的前置和后置扁达,而 不可避免的,很多用例的前置和后置都是一樣蠢熄,重復(fù)的復(fù)制粘貼致工作量增加跪解,代碼 量也增加。
Q8:pytest 的@pytest.mark.parametrize 裝飾器作用是什么?
@pytest.mark.parametrize 裝飾器可以讓我們每次參數(shù)化 fixture 的時候傳入多個項 目签孔〔婕ィ回憶上一節(jié),我們參數(shù)化的時候只能傳入 1 個字符串或者是其他的數(shù)據(jù)對象饥追, parametrize 每次多個參數(shù)图仓,更加靈活。
Q9:postman + Newman 相關(guān)問題 是否會使用 postman 完成接口的基本調(diào)試? 變量有幾種但绕,作用域分別是什么? 如何使用變量?
sandbox 如何使用救崔,如何實現(xiàn)斷言 如何實現(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)的各項性能指標(biāo)進(jìn)行測試恳啥。負(fù)載測試- 核實在保持配置不變的情況下偏灿,測試對象在不同操作條件(如不同用戶 數(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 木馬攻擊、文件上傳攻擊花嘶、賬密暴力破解笋籽、驗證碼缺陷、用戶權(quán)限椭员、端口掃??车海、服務(wù)檢測、中間件安全隘击。對這塊有要求的小伙伴找本書看看侍芝,推薦《web 安全防護(hù)指南基礎(chǔ)篇》