經(jīng)典測試工程師面試題(二)
經(jīng)典測試工程師面試題(三)
背景
為了擴(kuò)展家里領(lǐng)導(dǎo)的測試知識水平和專業(yè)知識能力提升蝙昙,以及為以后更好的面試做基礎(chǔ)瓷们,特意從眾多測試相關(guān)題型整理出來塑径,其中的答案僅供參考葡盗。
白盒和黑盒的區(qū)別审磁,你是怎么運(yùn)用的酒来?
黑盒測試:已知產(chǎn)品的功能設(shè)計(jì)規(guī)格卢未,可以進(jìn)行測試證明每個(gè)實(shí)現(xiàn)了的功能是否符合要求。利用其檢查功能是否符合需求說明書堰汉,能夠正常使用辽社,
白盒測試:已知產(chǎn)品的內(nèi)部工作過程,可以進(jìn)行測試證明每種內(nèi)部操作是否符合設(shè)計(jì)規(guī)格要求翘鸭,所有內(nèi)部成分是否經(jīng)過檢查
利用其檢查程序模塊的內(nèi)部邏輯走向滴铅,主要覆蓋程序內(nèi)的邏輯。
如何設(shè)計(jì)測試用例就乓?什么樣子的測試用例是好用例汉匙?
掌握邊界值分析、等價(jià)類劃分生蚁、錯(cuò)誤推測等方法來設(shè)計(jì)測試用例
是一個(gè)完備的集合噩翠,它能夠覆蓋所有等價(jià)類以及各種邊界值;需要從軟件功能需求出發(fā)邦投,全面地伤锚,無遺漏地識別出測試需求;最好是代碼覆蓋測試也全面的測試
功能測試在 beta 版本對外的上線標(biāo)準(zhǔn)是什么志衣?
測試用例全部跑完并且bug都已經(jīng)關(guān)閉屯援,然后業(yè)務(wù)驗(yàn)收后可以上線
請描述下你公司的測試流程?
需求分析討論-確定測試策略-設(shè)計(jì)測試用例-測試用例評審-beta測試-uat測試-測試報(bào)告
請描述下bug的幾個(gè)要素念脯?
1.沒有實(shí)現(xiàn)需求說明書列出的功能
2.出現(xiàn)了需要說明書提到不應(yīng)出現(xiàn)的事情
3.實(shí)現(xiàn)了需求說明書未提到的功能
4.沒有實(shí)現(xiàn)說明書中沒有提到但應(yīng)該實(shí)現(xiàn)的功能
5.難于使用狞洋,運(yùn)轉(zhuǎn)速度很慢,用戶認(rèn)為沒有達(dá)到預(yù)期
請問你們公司是如何做接口測試的和二?
swagger 徘铝、 接口自動(dòng)化腳本
接口測試質(zhì)量評估標(biāo)準(zhǔn)是什么?
接口表現(xiàn)與接口文檔的一致性
請求參數(shù):必選和非必選惯吕、長度惕它、字符類型、為空废登、缺失淹魄、組合、重復(fù)
返回?cái)?shù)據(jù):正常和異常
請問你們公司是如何做性能測試的堡距?請講訴性能測試的相關(guān)指標(biāo)甲锡?
1.做性能需求分析兆蕉,挑選了用戶使用最頻繁的功能來做性能測試,比如:登陸缤沦,搜索虎韵,提交訂單,確定性能指標(biāo)缸废,比如:事務(wù)通過率為100%包蓝,90%的事務(wù)響應(yīng)時(shí)間不超過5秒,并發(fā)用戶為1000人企量,CPU和內(nèi)存的使用率為70%以下
2.性能測試計(jì)劃测萎,明確測試時(shí)間(通常在功能穩(wěn)定后,如第一輪測試后進(jìn)行)和測試環(huán)境和測試工具的選擇
3.編寫性能測試用例
4.搭建性能測試環(huán)境届巩,準(zhǔn)備好性能測試數(shù)據(jù)
5.通過性能測試用例硅瞧,編寫性能測試腳本
6.性能測試腳本進(jìn)行調(diào)優(yōu),設(shè)置檢查點(diǎn)恕汇、參數(shù)化腕唧、關(guān)聯(lián)、集合點(diǎn)拇勃、事務(wù)四苇,調(diào)整思考時(shí)間,刪除冗余的腳本等
7.設(shè)計(jì)性能測試場景方咆,使用nmon工具監(jiān)控服務(wù)器月腋,運(yùn)行測試場景
8.分析性能測試結(jié)果,如果有問題(性能瓶頸)瓣赂,收集相關(guān)的日志提單給開發(fā)修改
9.開發(fā)修改好后榆骚,回歸性能測試
10.編寫性能測試報(bào)告
相關(guān)指標(biāo):響應(yīng)時(shí)間、并發(fā)數(shù)煌集、吞吐率妓肢、資源利用率、TPS
壓力測試和負(fù)載測試的區(qū)別
負(fù)載測試是模擬實(shí)際軟件系統(tǒng)所承受的負(fù)載條件的系統(tǒng)負(fù)荷苫纤,通過不斷加載(如逐漸增加模擬用戶的數(shù)量)或其它加載方式來觀察不同負(fù)載下系統(tǒng)的響應(yīng)時(shí)間和數(shù)據(jù)吞吐量碉钠、系統(tǒng)占用的資源(如CPU、內(nèi)存)等卷拘,以檢驗(yàn)系統(tǒng)的行為和特性喊废,以發(fā)現(xiàn)系統(tǒng)可能存在的性能瓶頸、內(nèi)存泄漏栗弟、不能實(shí)時(shí)同步等問題
壓力測試是在高負(fù)載情況下對系統(tǒng)的穩(wěn)定性進(jìn)行測試污筷。是在高負(fù)載(大數(shù)據(jù)量、大量并發(fā)用戶等)下的測試乍赫,觀察系統(tǒng)在峰值使用情況下的表現(xiàn)瓣蛀,從而發(fā)現(xiàn)系統(tǒng)的功能隱患
負(fù)載測試:多用戶陆蟆,用戶數(shù)漸增,持續(xù)同時(shí)發(fā)同一業(yè)務(wù)請求惋增,產(chǎn)出最大TPS
壓力測試:多用戶叠殷,資源使用飽和,持續(xù)同時(shí)發(fā)同一業(yè)務(wù)請求器腋,產(chǎn)出系統(tǒng)瓶頸或使用極限
服務(wù)器中一般要監(jiān)控哪些數(shù)據(jù)溪猿,如何監(jiān)控的,怎么從監(jiān)控?cái)?shù)據(jù)中發(fā)現(xiàn)問題纫塌?
基礎(chǔ)監(jiān)控和應(yīng)用監(jiān)控。
基礎(chǔ)監(jiān)控包括機(jī)器是否死機(jī)讲弄,cpu措左,內(nèi)存,磁盤使用率等避除;應(yīng)用監(jiān)控包括日志監(jiān)控怎披、端口監(jiān)控、進(jìn)程數(shù)監(jiān)控等瓶摆。
假設(shè)系統(tǒng)A調(diào)用系統(tǒng)B凉逛,我把B的接口都mock了,進(jìn)行性能測試群井,這樣有什么好處和壞處状飞?
好處:防止系統(tǒng)B出錯(cuò)引起測試錯(cuò)誤;不會(huì)因系統(tǒng)B的開發(fā)進(jìn)度影響測試书斜;mock后可以快速返回結(jié)果诬辈,提高測試效率
壞處:很多情況下無法完全模擬出服務(wù)器的所有可能的返回情況,另外荐吉,mock掉了關(guān)聯(lián)方之后焙糟,整個(gè)環(huán)境的連通性可能測試的不到位。
有一天早上打車高峰样屠,滴滴服務(wù)端掛了大概30分鐘穿撮,工程師搶修之后,馬上上線痪欲,之后又掛了悦穿,請問有哪些原因會(huì)造成這個(gè)情況?
服務(wù)器內(nèi)存不夠勤揩、服務(wù)器超出負(fù)載咧党、并發(fā)量太大、遇到惡意攻擊
如何看待自動(dòng)化和手動(dòng)測試陨亡?怎樣的一個(gè)比例才是健康的傍衡?
自動(dòng)化適合做為回歸測試的主要方式深员,新上線的功能一般都是用手動(dòng)測試方式,一些極端和用戶習(xí)慣操作還是手動(dòng)測試比較方便蛙埂。盡可能線上穩(wěn)定的功能模塊都做成自動(dòng)化倦畅,提供效率
你們公司的自動(dòng)化投入產(chǎn)出比怎樣?效益怎樣绣的?
自動(dòng)化主要作為回歸測試叠赐,減少測試時(shí)間。UI自動(dòng)化么有弄屡江,基本找不到bug 芭概。
完整運(yùn)行一次自動(dòng)化用例需要多久時(shí)間?
主要跑的是業(yè)務(wù)流惩嘉,所以跑一次需要半個(gè)小時(shí)左右
什么是分層自動(dòng)化罢洲?
金字塔結(jié)構(gòu), 最底層UnitTest文黎,往上接口API/集成起來的service惹苗, 最上面UI自動(dòng)化
你的測試數(shù)據(jù)是怎么準(zhǔn)備的?
提前準(zhǔn)備好耸峭,在代碼里的yaml文件
測試腳本的維護(hù)成本是怎么樣的桩蓉?
業(yè)務(wù)不變的情況下,一般腳本都是不壞不動(dòng)的
請寫出冒泡排序劳闹。
#冒泡排序:n*n
def bubbleSort(array):
maxindex = len(array)-1
maxValue = array[maxindex]
k=0
while maxindex:
for i in range(1,maxindex):
if array[i-1]>array[i]:
temp = array[i]
array[i] = array[i-1]
array[i-1] = temp
k+=1
maxindex -=1
print(k)
return array
1~9999數(shù)列中數(shù)字3出現(xiàn)的次數(shù)院究。用遞推方法解出。
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)))
從一個(gè)數(shù)組中找出前4個(gè)最大的數(shù)玷或,用最優(yōu)解儡首。
#快速排序:最快的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(chǎn)中包含的字符串b偏友,舉例 輸入a = "asdw",b = "sd" 返回 字符串 “aw”蔬胯,并且測試這個(gè)程序。
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
寫一個(gè)方法位他,把字符串轉(zhuǎn)為數(shù)字氛濒,比如 str="1234",變成 int 1234鹅髓。并且測試這個(gè)程序舞竿。
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
什么是面向?qū)ο缶幊蹋?/h3>
面向?qū)ο缶幊?就是把具有共性的事務(wù)抽象成屬性和方法來進(jìn)行編程
Thread 類中的start() 和 run() 方法有什么區(qū)別?
start()方法可以用來啟動(dòng)線程窿冯,調(diào)用該方法骗奖,會(huì)創(chuàng)建一個(gè)新的線程,然后內(nèi)部執(zhí)行run()方法;不能多次調(diào)用执桌,否則會(huì)拋異常
直接調(diào)用run()方法鄙皇,不會(huì)創(chuàng)建新的線程;可以進(jìn)行多次調(diào)用
說下左連接和右連接
比如有兩張表 A仰挣,B伴逸。左連接是把符合條件的所有A表的內(nèi)容列出來,B表如果沒有內(nèi)容匹配用NULL代替膘壶。
右連接是符合條件的所有B表的內(nèi)容列出來错蝴,A表如果沒有內(nèi)容匹配用NULL代替
介紹下什么是索引
索引是由表或者視圖中的一列或多列生成的鍵,可以加快在表或者視圖中檢索行的速度
面向?qū)ο缶幊?就是把具有共性的事務(wù)抽象成屬性和方法來進(jìn)行編程
start()方法可以用來啟動(dòng)線程窿冯,調(diào)用該方法骗奖,會(huì)創(chuàng)建一個(gè)新的線程,然后內(nèi)部執(zhí)行run()方法;不能多次調(diào)用执桌,否則會(huì)拋異常
直接調(diào)用run()方法鄙皇,不會(huì)創(chuàng)建新的線程;可以進(jìn)行多次調(diào)用
比如有兩張表 A仰挣,B伴逸。左連接是把符合條件的所有A表的內(nèi)容列出來,B表如果沒有內(nèi)容匹配用NULL代替膘壶。
右連接是符合條件的所有B表的內(nèi)容列出來错蝴,A表如果沒有內(nèi)容匹配用NULL代替
索引是由表或者視圖中的一列或多列生成的鍵,可以加快在表或者視圖中檢索行的速度