經典測試工程師面試題(一)
白盒和黑盒的區別,你是怎么運用的?
黑盒測試:已知產品的功能設計規格,可以進行測試證明每個實現了的功能是否符合要求。利用其檢查功能是否符合需求說明書,能夠正常使用,
白盒測試:已知產品的內部工作過程,可以進行測試證明每種內部操作是否符合設計規格要求,所有內部成分是否經過檢查
利用其檢查程序模塊的內部邏輯走向,主要覆蓋程序內的邏輯。
如何設計測試用例?什么樣子的測試用例是好用例?
掌握邊界值分析、等價類划分、錯誤推測等方法來設計測試用例
是一個完備的集合,它能夠覆蓋所有等價類以及各種邊界值;需要從軟件功能需求出發,全面地,無遺漏地識別出測試需求;最好是代碼覆蓋測試也全面的測試
功能測試在 beta 版本對外的上線標准是什么?
測試用例全部跑完並且bug都已經關閉,然后業務驗收后可以上線
請描述下你公司的測試流程?
需求分析討論-確定測試策略-設計測試用例-測試用例評審-beta測試-uat測試-測試報告
請描述下bug的幾個要素?
1.沒有實現需求說明書列出的功能
2.出現了需要說明書提到不應出現的事情
3.實現了需求說明書未提到的功能
4.沒有實現說明書中沒有提到但應該實現的功能
5.難於使用,運轉速度很慢,用戶認為沒有達到預期
請問你們公司是如何做接口測試的?
swagger 、 接口自動化腳本
接口測試質量評估標准是什么?
接口表現與接口文檔的一致性
請求參數:必選和非必選、長度、字符類型、為空、缺失、組合、重復
返回數據:正常和異常
請問你們公司是如何做性能測試的?請講訴性能測試的相關指標?
1.做性能需求分析,挑選了用戶使用最頻繁的功能來做性能測試,比如:登陸,搜索,提交訂單,確定性能指標,比如:事務通過率為100%,90%的事務響應時間不超過5秒,並發用戶為1000人,CPU和內存的使用率為70%以下
2.性能測試計划,明確測試時間(通常在功能穩定后,如第一輪測試后進行)和測試環境和測試工具的選擇
3.編寫性能測試用例
4.搭建性能測試環境,准備好性能測試數據
5.通過性能測試用例,編寫性能測試腳本
6.性能測試腳本進行調優,設置檢查點、參數化、關聯、集合點、事務,調整思考時間,刪除冗余的腳本等
7.設計性能測試場景,使用nmon工具監控服務器,運行測試場景
8.分析性能測試結果,如果有問題(性能瓶頸),收集相關的日志提單給開發修改
9.開發修改好后,回歸性能測試
10.編寫性能測試報告
相關指標:響應時間、並發數、吞吐率、資源利用率、TPS
壓力測試和負載測試的區別
負載測試是模擬實際軟件系統所承受的負載條件的系統負荷,通過不斷加載(如逐漸增加模擬用戶的數量)或其它加載方式來觀察不同負載下系統的響應時間和數據吞吐量、系統占用的資源(如CPU、內存)等,以檢驗系統的行為和特性,以發現系統可能存在的性能瓶頸、內存泄漏、不能實時同步等問題
壓力測試是在高負載情況下對系統的穩定性進行測試。是在高負載(大數據量、大量並發用戶等)下的測試,觀察系統在峰值使用情況下的表現,從而發現系統的功能隱患
負載測試:多用戶,用戶數漸增,持續同時發同一業務請求,產出最大TPS
壓力測試:多用戶,資源使用飽和,持續同時發同一業務請求,產出系統瓶頸或使用極限
服務器中一般要監控哪些數據,如何監控的,怎么從監控數據中發現問題?
基礎監控和應用監控。
基礎監控包括機器是否死機,cpu,內存,磁盤使用率等;應用監控包括日志監控、端口監控、進程數監控等。
假設系統A調用系統B,我把B的接口都mock了,進行性能測試,這樣有什么好處和壞處?
好處:防止系統B出錯引起測試錯誤;不會因系統B的開發進度影響測試;mock后可以快速返回結果,提高測試效率
壞處:很多情況下無法完全模擬出服務器的所有可能的返回情況,另外,mock掉了關聯方之后,整個環境的連通性可能測試的不到位。
有一天早上打車高峰,滴滴服務端掛了大概30分鍾,工程師搶修之后,馬上上線,之后又掛了,請問有哪些原因會造成這個情況?
服務器內存不夠、服務器超出負載、並發量太大、遇到惡意攻擊
如何看待自動化和手動測試?怎樣的一個比例才是健康的?
自動化適合做為回歸測試的主要方式,新上線的功能一般都是用手動測試方式,一些極端和用戶習慣操作還是手動測試比較方便。盡可能線上穩定的功能模塊都做成自動化,提供效率
你們公司的自動化投入產出比怎樣?效益怎樣?
自動化主要作為回歸測試,減少測試時間。UI自動化么有弄,基本找不到bug 。
完整運行一次自動化用例需要多久時間?
主要跑的是業務流,所以跑一次需要半個小時左右
什么是分層自動化?
金字塔結構, 最底層UnitTest,往上接口API/集成起來的service, 最上面UI自動化
你的測試數據是怎么准備的?
提前准備好,在代碼里的yaml文件
測試腳本的維護成本是怎么樣的?
業務不變的情況下,一般腳本都是不壞不動的
請寫出冒泡排序。
1 #冒泡排序:n*n 2 def bubbleSort(array): 3 maxindex = len(array)-1 4 maxValue = array[maxindex] 5 k=0 6 while maxindex: 7 for i in range(1,maxindex): 8 if array[i-1]>array[i]: 9 temp = array[i] 10 array[i] = array[i-1] 11 array[i-1] = temp 12 k+=1 13 maxindex -=1 14 print(k) 15 return array
1~9999數列中數字3出現的次數。用遞推方法解出。
def count_digit(number): return len(str(number)) def countThree(digit): if not isinstance(digit,int): raise TypeError('number is not int') # digit = len(str(number)) if(digit <=0): return 0 if(digit ==1): return 1 return 10*countThree(digit-1) + 10 **(digit-1) print(countThree(count_digit(9999)))
從一個數組中找出前4個最大的數,用最優解。
#快速排序:最快的n*logN def qiuckSort(list): if len(list)<2: return list mid = list[0] left = [i for i in list[1:] if i <= mid] right = [i for i in list[1:] if i > mid] finallyList = qiuckSort(left)+[mid] + qiuckSort(right) return finallyList array = [3, 0, 1, 832,23,45, 5, 5, 6,46, 9, 56, 897] print(qiuckSort(array)[-4:])
寫一段程序,刪除字符串a中包含的字符串b,舉例 輸入a = "asdw",b = "sd" 返回 字符串 “aw”,並且測試這個程序。
def delBString(a,b): if not isinstance(a,str): raise TypeError("a is not str") if not isinstance(b,str): raise TypeError("b is not str") if len(a) < len(b): raise Exception('a length must large to b length') result = [] flag = False i=0 la = len(a) lb = len(b) while i <la: j = 0 while j < lb: if i+j < la and a[i+j] == b[j]: j += 1 else : j += 1 flag = False break flag = True if flag: i += lb else: result.append(a[i]) i += 1 return "".join(result)
測試用例:
class TestdelInnerStringFunctions(): def setUp(self): pass def tearDown(self): pass def test_nomorl1(self): assert delBString('asdqwe','we') == 'asdq' def test_nomorl2(self): assert delBString('asdqwe','0') == 'asdqwe' def test_nomorl3(self): assert delBString('測試asdqwe','we') == '測試asdq' def test_nomorl4(self): assert delBString('測試asdqwe','測試') == 'asdqwe' def test_nomorl5(self): assert delBString('asdqwe','') == 'asdqwe' def test_nomorl6(self): with pytest.raises(TypeError): delBString('', 0) def test_nomorl7(self): with pytest.raises(TypeError): delBString(0, 'as') def test_nomorl8(self): with pytest.raises(TypeError): delBString(True) def test_nomorl9(self): with pytest.raises(Exception) as excinfo: delBString('acd','acde') assert "a length must large to b length" in str(excinfo.value) assert excinfo.type == Exception
寫一個方法,把字符串轉為數字,比如 str="1234",變成 int 1234。並且測試這個程序。
def StrToInt(a): res ,mult,flag = 0,1,1 if not isinstance(a,str): raise TypeError("a is not str") if a[0] =='-' or a[0] == '+': if a[0] == '-': flag = -1 a = a[1:] for i in range(len(a)-1,-1,-1): if '9' >=a[i] >= '0': res +=(ord(a[i]) -48) * mult mult = mult *10 else : return 0 return res * flag def test_strToInt2(self): with pytest.raises(TypeError): StrToInt(34)
測試用例:
def test_strToInt3(self): assert StrToInt('測試賽') == 0 def test_strToInt4(self): assert StrToInt('+2147689') == 2147689 def test_strToInt5(self): assert StrToInt('45') == 45 def test_strToInt6(self): assert StrToInt('1a33') == 0 def test_strToInt7(self): assert StrToInt('-5') == -5
什么是面向對象編程?
面向對象編程 就是把具有共性的事務抽象成屬性和方法來進行編程
Thread 類中的start() 和 run() 方法有什么區別?
start()方法可以用來啟動線程,調用該方法,會創建一個新的線程,然后內部執行run()方法;不能多次調用,否則會拋異常
直接調用run()方法,不會創建新的線程;可以進行多次調用
說下左連接和右連接
比如有兩張表 A,B。左連接是把符合條件的所有A表的內容列出來,B表如果沒有內容匹配用NULL代替。
右連接是符合條件的所有B表的內容列出來,A表如果沒有內容匹配用NULL代替
介紹下什么是索引
索引是由表或者視圖中的一列或多列生成的鍵,可以加快在表或者視圖中檢索行的速度
【轉】龔十一