測試工程師的面試總結

蘭色發表於2020-07-23

蘭瑟作為一個已經工作有4年經驗的測試工程師,其間也輾轉了幾個大的網際網路公司,雖然確實缺少了一些穩定性,但同時也積累了一些面試的經驗,不才分享一些給大家。那麼主要是針對測試工程師的一些總結,對於其他的工種,我可能會在別的文章中去總結一些面試技巧,本文會著重於測試工程師的面經。

測試的面試重點分為兩大部分:技術,專案
擴充一下:技術的一些注意點,專案上的一些處理方式(有些還會有一些溝通上的小技巧),可能不會寫的特別詳細,但點我都會點到,後續會再繼續補充(近3萬字的長文預警,希望能幫助到各位網際網路的孩子們
那麼直接上貨,希望能幫助到各位同行,或者不是同行卻也能激發起你們的靈感的夥伴們~

一.黑盒測試方法(可能會問等價類的分類,等價類和邊界值是最重要的:
1、等價類劃分:
(有效等價類:對於程式規格說明來說,是合理的,有意義的輸入資料構成的集合)
(無效等價類:對於程式規格說明來說,是不合理的,無意義的輸入資料構成的集合)
2、邊界值分析方法

3、因果圖方法
4、正交實驗設計方法
5、功能圖分析方法
6、錯誤推測法
7、需求文件轉化法
8、隨機測試
9、物件屬性分析法

二.白盒測試方法(可以選擇性記憶....不知道會不會問):
1.語句覆蓋:就是設計若干個測試用例,執行被測程式,使得每一可執行語句至少執行一次。
2.判定覆蓋:使設計的測試用例保證程式中每個判斷的每個取值分支至少經歷一次。
3.條件覆蓋:條件覆蓋是指選擇足夠的測試用例,使得執行這些測試用例時,判定中每個條件的所有可能結果至少出現一次,但未必能覆蓋全部分支
4.判定條件覆蓋:判定-條件覆蓋就是設計足夠的測試用例,使得判斷中每個條件的所有可能取值至少執行一次,同時每個判斷的所有可能判斷結果至少執行,即要求各個判斷的所有可能的條件取值組合至少執行一次。
5.條件組合覆蓋:在白盒測試法中,選擇足夠的測試用例,使所有判定中各條件判斷結果的所有組合至少出現一次,滿足這種覆蓋標準成為條件組合覆蓋。
6.路徑覆蓋:是每條可能執行到的路徑至少執行一次。
補充:
(1)語句覆蓋在所有的測試方法中是一種最弱的覆蓋。
(2)判定覆蓋和條件覆蓋比語句覆蓋強,滿足判定/條件覆蓋標準的測試用例一定也滿足判定覆蓋、條件覆蓋和語句覆蓋
(3)路徑覆蓋也是一種比較強的覆蓋,但未必考慮判定條件結果的組合,並不能代替條件覆蓋和條件組合覆蓋。

三.TCP/IP分層協議(每層的協議要注意):
1.鏈路層(資料鏈路層/網路介面層):包括作業系統中的裝置驅動程式、計算機中對應的網路介面卡
2.網路層(網際網路層):處理分組在網路中的活動,比如分組的選路。
3.運輸層:主要為兩臺主機上的應用提供端到端的通訊。
4.應用層:負責處理特定的應用程式細節。
alt 文字

TCP和UDP的區別(網路上的知識點):
1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線
2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付
3、TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向報文的
UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)
4、每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊
5、TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組
6、TCP的邏輯通訊通道是全雙工的可靠通道,UDP則是不可靠通道

四.TCP/IP三次握手,四次揮手(常問項)
三次握手:
alt 文字
第一次握手(SYN=1,seq=x):
客戶端傳送一個TCP的SYN標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及初始序號X,儲存在包頭的序列號(Sequence Number)欄位裡。
第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1):
伺服器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均為1。伺服器端選擇自己的ISN序列號,放在seq域裡,同時將確認序號(Acknowledgement Number)設定為客戶的ISN加1,即X+1。傳送完畢後,伺服器端進入SYN_RCVD狀態。
第三次握手(ACK=1,ACKnum=y+1):
客戶端再次傳送確認包(ACK),SYN標誌位為0,ACK標誌位為1,並且把伺服器發來ACK的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫ISN的+1。
傳送完畢後,客戶端進入ESTABLISHED狀態,當伺服器端收到這個包時,也進入ESTABLISHED狀態,TCP握手結束,TCP連線建立完成
我的理解....:
A問B:你聽到了麼,發確認資訊
B回答A:聽到了,告訴A它能接收到A的訊息
A再回B:我能接收到你的訊息,再發一次確認 ,然後建立連線
四次揮手:
alt 文字
第一次揮手(FIN=1,seq=x):
假設客戶端想要關閉連線,客戶端傳送一個FIN標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接收資料。
傳送完畢之後,客戶端進入FIN_WAIT_1狀態。
第二次揮手(ACK=1,ACKnum=x+1):
伺服器端確認客戶端的FIN包,傳送一個確認包,表明自己接收到了客戶端關閉連線的請求,但還沒有準備好關閉連線。
傳送完畢後,伺服器端進入CLOSE_WAIT狀態,客戶端接收到這個確認包之後進入FIN_WAIT_2狀態,等待伺服器端關閉連線。
第三次揮手(FIN=1,seq=y):
伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,FIN置為1。
傳送完畢後,伺服器端進入LAST_ACK狀態,等待來自客戶端的最後一個ACK
第四次揮手(ACK=1,ACKnum=y+1):
客戶端接收到來自伺服器的端的關閉請求,傳送一個確認包,並進入TIME_WAIT狀態,等待可能出現的要重傳的ACK包。
伺服器端接收到這個確認包之後,關閉連線,進入CLOSED狀態。
客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2Maximum Segment Lifetime)之後,沒有收到伺服器端的ACK,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入CLOSED狀態。
為什麼是三次,不是兩次或者四次(這個問題真的可能會被問到)
兩次握手並不能保證可靠性(B不確定A能收到自己的資訊),四次握手又浪費了效率

五.OSI七層模型(記一記應用層,傳輸層,網路層我覺得就可以了....)
alt 文字

六. DNS(執行在UDP協議上,埠53)
概念:dns是一個域名系統,是全球資訊網上作為域名和IP地址相互對映的一個分散式資料庫,能夠使使用者更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的IP數串

七:http協議(https://www.cnblogs.com/ranyonsue/p/5984001.html細緻的大家可以閱讀這一篇)
restful介面:
1.URI資源 2.表現:XML,HTML等格式 3.狀態轉移:get,post等

HTTP:是網際網路上應用最為廣泛的一種網路協議,是一個客戶端和伺服器端請求和應答的標準(TCP),用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議,它可以使瀏覽器更加高效,使網路傳輸減少
HTTPS:是以安全為目標的HTTP通道,簡單講是HTTP的安全版,即HTTP下加入SSL層,HTTPS的安全基礎是SSL,因此加密的詳細內容就需要SSL。
HTTP和HTTPS區別:(這個還挺重要的,埠號稍微記一下)
1、https協議需要到ca申請證照,一般免費證照較少,因而需要一定費用。
2、http是超文字傳輸協議,資訊是明文傳輸,https則是具有安全性的ssl加密傳輸協議。
3、http和https使用的是完全不同的連線方式,用的埠也不一樣,前者是80,後者是443。
4、http的連線很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
HTTP協議特點:
1.支援客戶/伺服器模式。
2.簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
3.靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type(Content-Type是HTTP包中用來表示內容型別的標識)加以標記。
4.無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。
HTTP原理:
1、客戶端連線到Web伺服器
一個HTTP客戶端,通常是瀏覽器,與Web伺服器的HTTP埠(預設為80)建立一個TCP套接字連線。
2、傳送HTTP請求
通過TCP套接字,客戶端向Web伺服器傳送一個文字的請求報文,一個請求報文由請求行、請求頭部、空行和請求資料4部分組成。
3、伺服器接受請求並返回HTTP響應
Web伺服器解析請求,定位請求資源。伺服器將資源複本寫到TCP套接字,由客戶端讀取。一個響應由狀態行、響應頭部、空行和響應資料4部分組成。
4、釋放連線TCP連線
若connection 模式為close,則伺服器主動關閉TCP連線,客戶端被動關閉連線,釋放TCP連線;若connection 模式為keepalive,則該連線會保持一段時間,在該時間內可以繼續接收請求;
5、客戶端瀏覽器解析HTML內容
客戶端瀏覽器首先解析狀態行,檢視錶明請求是否成功的狀態程式碼。然後解析每一個響應頭,響應頭告知以下為若干位元組的HTML文件和文件的字符集。客戶端瀏覽器讀取響應資料HTML,根據HTML的語法對其進行格式化,並在瀏覽器視窗中顯示。
GET和POST請求的區別(個人感覺這個是要了解的):
1.GET提交的資料會放在URL之後,以?分割URL和傳輸資料,引數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的資料放在HTTP包的Body中.
2.GET提交的資料大小有限制(因為瀏覽器對URL的長度有限制),而POST方法提交的資料沒有限制.
3.GET方式需要使用Request.QueryString來取得變數的值,而POST方式通過Request.Form來獲取變數的值。
4.GET方式提交資料,會帶來安全問題,比如一個登入頁面,通過GET方式提交資料時,使用者名稱和密碼將出現在URL上,如果頁面可以被快取或者其他人可以訪問這臺機器,就可以從歷史記錄獲得該使用者的賬號和密碼.
狀態碼:
1xx:指示資訊--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤--伺服器未能實現合法的請求
常見狀態碼:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被伺服器所理解
401 Unauthorized //請求未經授權,這個狀態程式碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //伺服器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //伺服器發生不可預期的錯誤
503 Server Unavailable //伺服器當前不能處理客戶端的請求,一段時間後可能恢復正常

八:TestNG(這個我自己用過,感興趣也可以看看) testng傳參方式(parameter在testng.xml 或者通過dataprovider)
執行方式:1.Run as 2.testng.xml
按順序執行:preserve-order=true
忽略測試:@Test(enable=false)
分組測試:@Test(groups=..)
依賴測試:@Test(dependsonmethods=...)
結果在oup-put,日誌級別是verbose
併發執行用例:parallel=methods

九:appium(可以稍稍瞭解,和selenium異曲同工,有些點我覺得是UI自動化想通的)
特點(為什麼流行我覺得):

  1. 跨平臺,native hybrid webview(H5)
  2. 跨裝置,android iOS
  3. 跨app,可以在多個app之間互動
  4. 不依賴APP開原始碼(保留意見,android Uiautomator對H5的支援需要程式碼支援,這裡不細說)
  5. 支援Selenium WebDriver / Selenium Grid
  6. 跨語言,java python ruby nodejs
  7. Open Source 原理: Android alt 文字

1.左邊的WebDriver script是我們的selenium測試指令碼(其實就是測試程式碼)
2.中間是起的Appium的服務,Appium在這邊起了一個Server(4723埠),跟selenium
Webdriver測試框架類似,Appium⽀支援標準的WebDriver JSONWireProtocol 。在這裡提供了一套web服務,Appium Server接收web driver 標準請求,解析請求內容,調⽤用對應的框架響應操作。
如:指令碼傳送一個點選按鈕的請求給appium server,

  1. appium server會把請求轉發給中介軟體Bootstrap.jar ,它是用java寫的,安裝在手機上. Bootstrap 接收appium 的命令(4724埠),最終通過調⽤用UiAutomator的命令來實現。 4.最後執⾏行的結果由Bootstrap返回給appium server 5.另外,appium還用到了chromedriver來⽀支援基於H5(webview)的測試。 IOS: alt 文字

1.左邊的WebDriver script是selenium測試指令碼
2.中間是起的Appium的服務,Appium在這邊起了⼀一個Server(4723埠),跟selenium
Webdriver測試框架類似,Appium⽀支援標準的WebDriver JSONWireProtocol 。在這裡提供了一套web服務,Appium Server接收web driver 標準請求,解析請求內容,調⽤用對應的框架響應操作。
如:指令碼傳送一個點選按鈕的請求給appium server,

  1. appium server呼叫instruments.js 啟動⼀一個socket server,同時分出⼀一個⼦子程式運⾏行instruments.app,將bootstrap.js(一個UIAutomation指令碼)注⼊入到device⽤用於和外界進⾏行互動。 4.對於H5的操作,運⽤用了 iOS webkit debug proxy來實現 Android和IOS的區別我覺得就是bootstrap.jar和bootstrap.js去分別驅動uiautomator和uiautomation,新版本的Appium已經支援uiautomator2了,IOS支援XCUItest 定位元素方法(By後面那些東西,ID可以唯一定位): webdriver提供的用 By 定位元素 find_element(By.ID,"kw") find_element(By.NAME,"wd") find_element(By.CLASS_NAME,"s_ipt") find_element(By.TAG_NAME,"input") find_element(By.LINK_TEXT,u"新聞") find_element(By.PARTIAL_LINK_TEXT,u"新") find_element(By.XPATH,"//*[@class='bg s_btn']") find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su") find_element()方法只用於定位元素。它需要兩個引數,第一個引數是定位方式,這個由 By 提供;另第二個引數是定位的值。

十. linux常用命令(我覺得比較可能問的多的)
Cd:切換目錄
當前目錄和上層目錄:./ ../
主目錄:~/
檢視當前路徑:pwd
清屏:clear
退出當前命令:ctrl+c 徹底退出
軟連結:ln -s slink source
查詢自己所在的終端資訊:who am i
檢視當前誰在使用該主機:who
ls -l (也可以直接 ll ) :列出長資料串,包含檔案的屬性與許可權資料等
ls -a :列出全部的檔案,連同隱藏檔案(開頭為.的檔案)一起列出來(常用)
find -name 檔名 :找匹配的檔名
mkdir :建立指定的名稱的目錄
cp -a file1 file2 :連同檔案的所有特性把檔案file1複製成檔案file2

cp file1 file2 file3 dir :把檔案file1、file2、file3複製到目錄dir中

mv file1 file2 file3 dir : 把檔案file1、file2、file3移動到目錄dir中

mv file1 file2 : 把檔案file1重新命名為file2
rm -fr dir : 強制刪除目錄dir中的所有檔案
ps -ef|grep java :找出所有java程式
kill -9 程式號 :徹底殺死某個程式
chmod 改變檔案的許可權
語法:chmod [options] mode files
多數用三位八進位制數字的形式來表示許可權,第一位指定屬主的許可權,第二位指定組許可權,第三位指定其他使用者的許可權,每位通過4(讀)、2(寫)、1(執行)三種數值的和來確定許可權。如6(4+2)代表有讀寫權,7(4+2+1)有讀、寫和執行的許可權
chmod u+x file :給file的屬主增加執行許可權
vi :檔名 #編輯方式檢視,可修改
cat :檔名 #顯示全部檔案內容
more :檔名 #分頁顯示檔案內容
less :檔名 #與 more 相似,更好的是可以往前翻頁
head :檔名 #僅檢視頭部,還可以指定行數
tail -f 20160921.logs :檢視正在改變的日誌檔案
tail -3000 catalina.out:檢視倒數前3000行的資料
history:檢視用過的命令列表
df -hl:檢視磁碟使用空間
which :只能查可執行檔案
whereis :只能查二進位制檔案、說明文件,原始檔等
du :顯示目錄或檔案的大小
df :顯示每個<檔案>所在的檔案系統的資訊,預設是顯示所有檔案系統
df 命令獲得真正的檔案系統資料,而 du 命令只檢視檔案系統的部分情況
bash shell 的內建命令let 可以進行整型數的數學運算
free:顯示系統當前記憶體的使用情況,包括已用記憶體、可用記憶體和交換記憶體的情況
top:顯示當前系統中佔用資源最多的一些程式
netstat -anp|grep port:檢視某埠是否被佔用
chown -R:更改某個檔案或目錄的屬主和屬組
Shift + PageUp:翻頁
清空檔案:echo "" > filename 或者cat /dev/null > a.txt 或者>a.txt
Linux統計檔案中出現的次數:
(1) 單個字串:grep -o targetstr filename | wc -l
多個字串:grep -o “targetstr_1\targetstr_2”filename | wc -l
(2) awk '{s+=gsub(/targetStr/,"&")}END{print s}' filename
Linux查詢某個檔案中的某個詞:
grep ‘test’a,b,c 在檔案a,b,c中尋找test這個詞
grep -r 'test' . #在當前目錄中找test這個詞
grep -r 'test' example #在example目錄中找test這個詞
wc -l filename: 檢視檔案裡有多少行
uniq testfile: 刪除一個檔案中重複都是行
sort testfile1 | uniq:刪除重複之後進行排序(次數的)

十一.Mysql(亂七八糟語句不寫了,寫點我覺得可能會被問到的)
授權語句:
grant select, insert, update, delete on testdb.* to common_user@'%'
事務:
1.原子性: 要麼全部完成,要麼不完成,若發生錯誤會進行回滾操作;
2.一致性: 開始到結束後,資料庫完整性約束沒收到破壞;(實體完整性,參照完整性,使用者定義的完整性)
3.隔離性: 事務與事務之間相隔離,序列化執行;
4.永續性: 事務完成對資料的影響是永久的;
四個隔離:
1.髒讀
髒讀是指在一個事務處理過程裡讀取了另一個未提交的事務中的資料。
當一個事務正在多次修改某個資料,而在這個事務中這多次的修改都還未提交,這時一個併發的事務來訪問該資料,就會造成兩個事務得到的資料不一致。例如:使用者A向使用者B轉賬100元,對應SQL命令如下
update account set money=money+100 where name=’B’; (此時A通知B)
update account set money=money - 100 where name=’A’;
當只執行第一條SQL時,A通知B檢視賬戶,B發現確實錢已到賬(此時即發生了髒讀),而之後無論第二條SQL是否執行,只要該事務不提交,則所有操作都將回滾,那麼當B以後再次檢視賬戶時就會發現錢其實並沒有轉。
2.不可重複讀
不可重複讀是指在對於資料庫中的某個資料,一個事務範圍內多次查詢卻返回了不同的資料值,這是由於在查詢間隔,被另一個事務修改並提交了
3.虛讀(幻讀)
幻讀是事務非獨立執行時發生的一種現象。例如事務T1對一個表中所有的行的某個資料項做了從“1”修改為“2”的操作,這時事務T2又對這個表中插入了一行資料項,而這個資料項的數值還是為“1”並且提交給資料庫。而操作事務T1的使用者如果再檢視剛剛修改的資料,會發現還有一行沒有修改,其實這行是從事務T2中新增的,就好像產生幻覺一樣,這就是發生了幻讀
Serializable (序列化):可避免髒讀、不可重複讀、幻讀的發生。
Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
Read committed (讀已提交):可避免髒讀的發生。
Read uncommitted (讀未提交):最低階別,任何情況都無法保證。
四種隔離級別最高的是Serializable級別,最低的是Read uncommitted級別,級別越高,執行效率就越低。
主鍵,外來鍵:
主鍵 :對錶中資料進行唯一標識的資料列的組合;不能缺失;不能空值;
外來鍵 :該列為另一表的主鍵
索引:
1.資料庫索引,是資料庫管理系統中一個排序的資料結構,以協助快速查詢、更新資料庫表中資料。索引的實現通常使用B樹及其變種B+樹
2.通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性
CREATE INDEX index_name ON table_name(username(length));
建立索引的缺陷:
1.雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對錶進行INSERT,UPDATE和DELETE。因為更新表時,mysql不僅要儲存資料,還要儲存一下索引檔案
2.建立索引會佔用磁碟空間的索引檔案。一般情況這個問題不太嚴重,但如果你在要給大表上建了多種組合索引,索引檔案會膨脹很寬
drop,delete與truncate的區別
drop直接刪掉表 truncate刪除表中資料,再插入時自增長id又從1開始 delete刪除表中資料,可以加where字句
一般而言,drop > truncate > delete
連線種類,區別:
Inner join,left join,right join,full join
分庫分表:
資料庫引擎:myisam和innodb,前者比較適合大量select,事務不安全;後者支援外來鍵,事務安全,,適合大量update,insert

十二.Jmeter
1.效能測試幾個概念
TPS:每秒鐘request/事務 數量
併發數: 系統同時處理的request/事務數
響應時間: 一般取平均響應時間
下面幾個概念可以看看
負載測試(Load Test):負載測試是一種效能測試,指資料在超負荷環境中執行,程式是否能夠承擔(通俗講我覺得就是到了拐點就停了,再往上指標也不會上漲)
壓力測試(Stress Test): 壓力測試(又叫強度測試)也是一種效能測試,它在系統資源特別低的情況下軟體系統執行情況,目的是找到系統在哪裡失效以及如何失效的地方。
(1)穩定性壓力測試:在選定的壓力值下,長時間持續執行。通過這類壓力測試,可以考察各項效能指標是否在指定範圍內,有無記憶體洩漏、有無功能性故障等;
(2)破壞性壓力測試:在穩定性壓力測試中可能會出現一些問題,如系統效能明顯降低,但很難暴露出其真實的原因。通過破壞性不斷加壓的手段,往往能快速造成系統的崩潰或讓問題明顯的暴露出來
極限測試 Extreme testing:在過量使用者下的負載測試 Hammer testing:連續執行所有能做的操作
像一般效能測試可能會發現資料庫連線上的錯誤,程式碼的異常,也有可能是jmeter自身這個軟體有效能瓶頸
Jmeter-plugins-manager(一個外掛)
下載之後放到lib/ext下面,重啟,然後就如圖
alt 文字

1.其中Transaction per Second就是tps圖,Response Time Over Time 就是平均響應時間,方便實時觀察,而不是最後看檢視結果樹
2.一般短的壓測都是相同條件壓三次取平均值
3.一般很少會直接壓線上,所以會有一個線上和測試的機器引數對比,有一個倍數關係,測試環境做完壓測後再計算大概線上的結果
怎麼確定效能指標?
1.網際網路上對於使用者響應時間,有一個普遍的標準,2-5-10原則
2.1.5倍峰值作為參考+伺服器(記憶體,CPU等等)
jmeter怎麼用上一個介面的結果作為下一個介面的引數(使用Json extractor)-加分點

十三.測試用例設計
這一塊的東西我寫個大致的範圍....
登陸模組
1.功能用例
2.相容性(app版本,作業系統版本,不同移動裝置解析度)
3.效能上(單使用者的響應時間,高併發,長時間多使用者登陸)
4.安全性(加密,SQL隱碼攻擊(通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令),指令碼攻擊,多裝置登陸的互斥)
5.弱網(android 在fiddler下,ios通過自身的status ,下一章寫)
6.UI測試
7.可用性,易用性(全鍵盤輸入,enter,tab)
8.本地化(多語言)
還有很多,測試紙杯,電梯,購物車,支付功能(這都是我面試遇到過的)很多別的也可以考慮這些方面,反正都憑自身經驗吧~~

十四.弱網測試
1.IOS
IOS平臺,通過自帶的開發者選項 --Network Link Conditioner, 簡單的模擬各種速度的網路
alt 文字

2.android
Fiddler :
1.先開啟網路模擬
alt 文字
2.開啟延遲
alt 文字
然後編輯指令碼
alt 文字
每上傳和下載1KB的資料要延遲多少秒
Charles:
延遲設定 --選擇相應的網路延遲設定或者自定義延遲--開啟延遲即可
alt 文字
alt 文字
charles抓https的包:
1.安裝Charles
2.電腦安裝Charles證照(install charles root certificate)
3.手機安裝證照(install charles root certificate on a mobile device or a remote browser)
4.手機網頁輸入網址chls.pro/ssl後提示下載證照並信任(ios11開始需要手動信任描述檔案)
5.開始抓包
Charles設定Proxy
Proxy -> SSL Proxying Settings
6.把想要抓https包的站點新增到Proxy -> SSL Proxying Settings--include中即可
原理(簡單說就是charles偽裝自己拿到CA證照後先從客戶端拿到公鑰,加密後給伺服器,伺服器再用用私鑰解密再返回響應給客戶端):
(1)Charles攔截客戶端的請求,偽裝成客戶端向伺服器進行請求
(2)伺服器向“客戶端”(實際上是Charles)返回伺服器的CA證照
(3)Charles攔截伺服器的響應,獲取伺服器證照公鑰,然後自己製作一張證照,將伺服器證照替換後傳送給客戶端。(這一步,Charles拿到了伺服器證照的公鑰)
(4)客戶端接收到“伺服器”(實際上是Charles)的證照後,生成一個對稱金鑰,用Charles的公鑰加密,傳送給“伺服器”(Charles)
(5)Charles攔截客戶端的響應,用自己的私鑰解密對稱金鑰,然後用伺服器證照公鑰加密,傳送給伺服器。(這一步,Charles拿到了對稱金鑰)
(6)伺服器用自己的私鑰解密對稱金鑰,向“客戶端”(Charles)傳送響應
(7)Charles攔截伺服器的響應,替換成自己的證照後傳送給客戶端

十五.Fiddler(我覺得知道怎麼改資料的方式就行了)
打斷點和AutoResponder的區別,注意修改資料後請求超時導致客戶端不做請求
1、打斷點,是阻塞了請求,一直沒有結果返回,請求將線上程中一直存在,直到超時被踢出來。
2、AutoResponder返回404/502,這種情況是有結果返回的,代表請求也結束了,不會線上程中一直存在
fiddler抓https包:
(1)原理同charles,首先:給fiddler安裝certmaker外掛(然後重啟)
(2)Tools->Fiddler Options->HTTPS ,Actions-> Trust Root Certificate,彈框後安裝CA證照
alt 文字

安裝成功後可以通過Actions—>open windows certificate Manager 檢視安裝的證照
(3) 手機安裝Fiddler證照,開啟手機瀏覽器,在瀏覽器地址輸入代理伺服器IP和埠
alt 文字
點選之後安裝證照即可

十六.APP crash
1.crash常見的原因(空指標,記憶體洩漏,陣列越界,呼叫高版本API)
裝置碎片化:由於裝置極具多樣性,App在不同的裝置上可能有表現不同。
頻寬限制:頻寬不佳的網路對App所需的快速響應時間可能不夠。
網路的變化:不同網路間的切換可能會影響App的穩定性。
記憶體管理:可用記憶體過低,或非授權的記憶體位置的使用可能會導致App失敗。
使用者過多:連線數量過多可能會導致App崩潰。
程式碼錯誤:沒有經過測試的新功能,可能會導致App在生產環境中失敗。
(可能是java的UnChecked異常發生時,由於沒有相應的try…catch處理該異常物件,所以Java執行環境將會終止,程式將退出)
第三方服務:廣告或彈出螢幕可能會導致App崩潰。
2.App崩潰的測試用例設計:
驗證在有不同的螢幕解析度,作業系統和運營商的多個裝置上的App行為。
用新發布的作業系統版本驗證App的行為。
驗證在如隧道,電梯等網路質量突然改變的環境中的App行為。
通過手動網路從蜂窩更改到Wi-Fi ,或反過來,驗證App行為。
驗證在沒有網路的環境中的App行為。
驗證來電/簡訊和裝置特定的警報(如警報和通知)時的App行為。
通過改變裝置的方向,以不同的檢視模式,驗證App行為。
驗證裝置記憶體不足時的App行為。
通過用測試工具施載入荷驗證App行為。

十七.Git(命令為主)
簡單命令
git clone
git status 檢視倉庫狀態
git diff * 檢視X檔案修改了那些內容

git log 檢視歷史記錄
git reset –hard HEAD^ 回退到上一個版本
git reset --hard HEAD~第幾個 如果想回退到第3個版本,使用git reset –hard HEAD~3
git branch 檢視本地所有的分支
git branch -a 檢視遠端所有的分支
git branch name 建立分支
git branch –d dev 刪除dev分支
git checkout –b dev 建立dev分支 並切換到dev分支上
git merge dev 在當前分支上合併dev分支代
提交程式碼三部曲哈哈哈:
git add * 把x檔案新增到暫存區去
git commit –m "*" 提交檔案 –m 後面的是註釋
git push

十八.Monkey(命令用到查就行了這個,要知道-p是指定包)
1.Monkey程式由Android系統自帶,使用Java語言寫成,在Android檔案系統中的存放路徑是:/sdk/sdk/tools/lib/monkey.jar
2.Monkey.jar程式是由一個名為“monkey”的Shell指令碼來啟動執行,shell指令碼在Android檔案系統中的存放路徑是:/sdk/sdk/tools/bin/monkey

  1. adb shell monkey {+命令引數} Monkey 測試出現錯誤後,一般的分析步驟(我以前被問到過,當時一臉懵逼(´⊙ω⊙`)) 看Monkey的日誌 (注意第一個swith以及異常資訊等)
  2. 程式無響應的問題: 在日誌中搜尋 “ANR”
  3. 崩潰問題:在日誌中搜尋 “Exception” (如果出現空指標, NullPointerException) 肯定是有bug

十九.Tomcat(想不到啥,有可能會問問)
Tomcat的預設埠及修改(服務的部署新站點的時候就會改這個,要不然埠衝突)
1.找到Tomcat目錄下的conf資料夾
2.進入conf資料夾裡面找到server.xml檔案
3.開啟server.xml檔案
4.在server.xml檔案裡面找到下列資訊

將8080改成你想要的埠即可
Tomcat部署方式(服務的用的多的是2,有空可以稍微瞭解下,server.xml最下面就是第二點那種,如果我沒記錯的話哈哈~~)
1.直接把Web專案放在webapps下,Tomcat會自動將其部署
2.在server.xml檔案上配置節點,設定相關的屬性即可
3.通過Catalina來進行配置:進入到conf\Catalina\localhost檔案下,建立一個xml檔案,該檔案的名字就是站點的名字,編寫XML的方式來進行設定。

二十.排序演算法(單獨就列這個演算法吧,其他演算法先不用看了...因為這個是我印象最深的被問過最多的,可以看這篇,寫的很全https://blog.csdn.net/hellozhxy/article/details/79911867,冒泡尤為重要)
總結:
alt 文字
1.一些概念
穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面;
不穩定:如果a原本在b的前面,而a=b,排序之後a可能會出現在b的後面;
內排序:所有排序操作都在記憶體中完成;
外排序:由於資料太大,因此把資料放在磁碟中,而排序通過磁碟和記憶體的資料傳輸才能進行;
時間複雜度: 一個演算法執行所耗費的時間。
空間複雜度:執行完一個程式所需記憶體的大小。
2.排序分類 圖總結的挺好
alt 文字
(1)氣泡排序(你記住這個就行,一用百面通..問的最多哈哈)
演算法描述:
1.比較相鄰的元素,如果第一個比第二個大,就交換它們兩個;
2.對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;
3.針對所有的元素重複以上的步驟,除了最後一個;
重複步驟1~3,直到排序完成。
alt 文字

剩下的我就不寫這裡了,其實程式碼不懂也無所謂,我的經驗是一般描述一下這個演算法的過程就可以了,然後如果能寫出來肯定是最好的,還是看面試時候的具體情況~~

二十一.Java簡單知識點(我對java熟點,所以就寫寫java了~~,不過大同小異,本質一樣的,一些語法不同而已,可以抽空看看簡單的這些,還是有可能會問的)
1.物件導向的特徵
(1)抽象:抽象是將一類物件的共同特徵總結出來構造類的過程,包括資料抽象和行為抽象兩方面。抽象只關注物件有哪些屬性和行為,並不關注這些行為的細節是什麼。
(2)繼承:繼承是從已有類得到繼承資訊建立新類的過程。提供繼承資訊的類被稱為父類(超類、基類);得到繼承資訊的類被稱為子類(派生類)。
(3)封裝:通常認為封裝是把過程和資料包圍起來,對資料的訪問只能通過已定義的介面。物件導向的本質就是將現實世界描繪成一系列完全自治、封閉的物件。我們在類中編寫的方法就是對實現細節的一種封裝;我們編寫一個類就是對資料和資料操作的封裝。可以說,封裝就是隱藏一切可隱藏的東西,只向外界提供最簡單的程式設計介面(可以想想普通洗衣機和全自動洗衣機的差別,明顯全自動洗衣機封裝更好因此操作起來更簡單)。
(4)多型性:多型性是指允許不同子型別的物件對同一訊息作出不同的響應。簡單的說就是用同樣的物件引用呼叫同樣的方法但是做了不同的事情。多型性分為編譯時的多型性和執行時的多型性。執行時的多型性可以解釋為:當A系統訪問B系統提供的服務時,B系統有多種提供服務的方式,但一切對A系統來說都是透明的。
2.修飾符(範圍自上而下,看這個就夠了~
alt 文字
這個圖是一個完整的java程式,這樣應該好理解點..子類我直介面述下:
alt 文字
3.java資料型別
alt 文字
4.JDK、JRE、JVM基本概念
JDK: Java Development kit Java 開發工具包
JRE: Java Runtime Environment Java 執行環境
JVM: Java virtual Machine Java 虛擬機器
5.Java程式編譯和執行的過程(瞭解下就好)
(1)Java編譯程式將Java源程式翻譯為JVM可執行程式碼--位元組碼,建立完原始檔之後,程式會先被編譯成 “.class” 檔案。
(2)在編譯好的java程式得到“.class”檔案後,使用命令java 執行這個 .class 檔案,系統就會啟動一個jvm程式,並找到主函式的入口,開始執行main函式。
6.int 和Integer 的區別
Java為了程式設計的方便引入不是物件的基本資料型別,但是為了能夠將這些基本資料型別當成物件操作,Java為每一個基本資料型別都引入了對應的封裝型別(wrapper class),int的封裝類就是Integer,從JDK1.5開始引入了自動封箱/解封箱機制,使得二者可以相互轉換。
Java 為每個原始型別提供了封裝類:
原始型別: boolean,char,byte,short,int,long,float,double
封裝型別:Boolean,Character,Byte,Short,Integer,Long,Float,Double
7.值傳遞和引用傳遞的區別
值傳遞:值傳遞是將進行傳遞的值進行拷貝,然後對拷貝之後的值進行傳遞,傳遞過程前後不改變原值的大小;
引用傳遞:引用傳遞是將需要傳遞值的地址進行傳遞,傳遞過程前後會改變原值的大小。
8.過載(Overload)和重寫(Override)的區別
方法的過載和重寫都是實現多型的方式,區別在於前者實現的是編譯時的多型性,而後者實現的是執行時的多型性。過載發生在一個類中,同名的方法如果有不同的引數列表(引數型別不同、引數個數不同或者二者都不同)則視為過載;重寫發生在子類與父類之間,重寫要求子類被重寫方法與父類被重寫方法有相同的引數列表,有相容的返回型別,比父類被重寫方法更好訪問,不能比父類被重寫方法宣告更多的異常。過載對返回型別沒有特殊的要求,不能根據返回型別進行區分
9.break 和continue的區別(迴圈裡面用到的關鍵字~)
break是直接結束迴圈, 而continue不是直接結束本次迴圈而是跳過迴圈,繼續執行下一次的迴圈
10.抽象類(abstract class)和介面(interface)的異同(時間多的話可以看下)
介面和抽象類的相似性
(1)介面和抽象類都不能被例項化,它們都位於繼承樹的頂端,用於被其他類實現和繼承。
(2)介面和抽象類都可以包含抽象方法,實現介面或繼承抽象類的普通子類都必須實現這些抽象方法。
介面和抽象類的區別
(1)介面裡只能包含抽象方法,靜態方法和預設方法,不能為普通方法提供方法實現,抽象類則完全可以包含普通方法。
(2)介面裡只能定義靜態常量,不能定義普通成員變數,抽象類裡則既可以定義普通成員變數,也可以定義靜態常量。
(3)介面不能包含構造器,抽象類可以包含構造器,抽象類裡的構造器並不是用於建立物件,而是讓其子類呼叫這些構造器來完成屬於抽象類的初始化操作。
(4)介面裡不能包含初始化塊,但抽象類裡完全可以包含初始化塊。
(5)一個類最多隻能有一個直接父類,包括抽象類,但一個類可以直接實現多個介面,通過實現
多個介面可以彌補Java單繼承不足
11.final, finally, finalize(我簡單概括)
final:當用final修飾類的時,表明該類不能被其他類所繼承
finally:作為異常處理的一部分,它只能用在try/catch語句中,並且附帶一個語句塊,表示這段語句最終一定會被執行(不管有沒有丟擲異常)
finalize:finalize()方法在垃圾收集器將物件從記憶體中清除之前做必要的清理工作,所有的類都繼承了它
12.java多執行緒的實現方式(看一遍就行)
1.繼承Thread類,重寫run方法
2.實現Runnable介面,重寫run方法,實現Runnable介面的實現類的例項物件作為Thread建構函式的target
3.通過Callable和FutureTask建立執行緒
4.通過執行緒池建立執行緒
13.set list map(集合裡面的,也簡單概括)
alt 文字
集合類存放於java.util包中,型別主要有3種:set(集)、list(列表)和map(對映)
(1) List 集合中物件按照索引位置排序,可以有重複物件,允許按照物件在集合中的索引位置檢索物件,例如通過list.get(i)方法來獲取集合中的元素;
(2) Map 中的每一個元素包含一個鍵和一個值,成對出現,鍵物件不可以重複,值物件可以重複;
(3) Set 集合中的物件不按照特定的方式排序,並且沒有重複物件,但它的實現類能對集合中的物件按照特定的方式排序,例如 Tree Set 類,可以按照預設順序,也可以通過實現 Java.util.Comparator< Type >介面來自定義排序方式。
14.HashMap 和 HashTable
(1)HashMap 是執行緒不安全的,HashMap 是一個介面,是 Map的一個子介面,是將鍵對映到值得物件,不允許鍵值重複,允許空鍵和空值;由於非執行緒安全, HashMap的效率要較 HashTable 的效率高一些.
(2)HashTable 是執行緒安全的一個集合,不允許 null 值作為一個 key 值或者 Value 值;
(3)HashTable 是 sychronize(同步化),多個執行緒訪問時不需要自己為它的方法實現同步,而 HashMap 在被多個執行緒訪問的時候需要自己為它的方法實現同步
15.ArrayList和LinkedList的區別
1.ArrayList是實現了基於動態陣列的資料結構,LinkedList基於連結串列的資料結構。
2.對於隨機訪問get和set,ArrayList效率優於LinkedList,因為LinkedList要移動指標。
3.對於新增和刪除操作add和remove,LinedList比較佔優勢,因為ArrayList要移動資料。
16.JAVA的GC
GC是垃圾收集的意思,Java提供的GC功能可以自動監測物件是否超過作用域從而達到自動回收記憶體的目的,垃圾回收可以有效的防止記憶體洩露,有效的使用可以使用的記憶體
實現GC的方法:System.gc() 或Runtime.getRuntime().gc()
17.幾個關鍵字
實現介面:implements

介面:interface
繼承:extends
super:我們可以通過super關鍵字來實現對父類成員的訪問,用來引用當前物件的父類
static: static方法就是沒有this的方法。在static方法內部不能呼叫非靜態方法,反過來是可以的
18.equal和==的區別
==:比較的是兩個字串記憶體地址(堆記憶體)的數值是否相等,屬於數值比較;
equals():比較的是兩個字串的內容,屬於內容比較。
19.程式和執行緒
1.程式是資源分配的最小單位,執行緒是程式執行的最小單位。
2.程式有自己的獨立地址空間,每啟動一個程式,系統就會為它分配地址空間,建立資料表來維護程式碼段、堆疊段和資料段,這種操作非常昂貴。而執行緒是共享程式中的資料的,使用相同的地址空間,因此CPU切換一個執行緒的花費遠比程式要小很多,同時建立一個執行緒的開銷也比程式要小很多。
3.執行緒之間的通訊更方便,同一程式下的執行緒共享全域性變數、靜態變數等資料,而程式之間的通訊需要以通訊的方式(IPC)進行。不過如何處理好同步與互斥是編寫多執行緒程式的難點。
4.多程式程式更健壯,多執行緒程式只要有一個執行緒死掉,整個程式也死掉了,而一個程式死掉並不會對另外一個程式造成影響,因為程式有自己獨立的地址空間。
20.wait()與sleep()的區別
1.sleep()來自Thread類,和wait()來自Object類。呼叫sleep()方法的過程中,執行緒不會釋放物件鎖。而 呼叫 wait 方法執行緒會釋放物件鎖
2.sleep()睡眠後不出讓系統資源,wait讓其他執行緒可以佔用CPU
3.sleep(milliseconds)需要指定一個睡眠時間,時間一到會自動喚醒.而wait()需要配合notify()或者notifyAll()使用

二十二.web和app測試的區別(感覺不是問這個就是問android和ios的區別)
1.相容
2.效能上,比如電量,記憶體,CPU
3.健壯性,專項測試,比如中斷,來電,簡訊,關機,弱網
4.因為web是基於瀏覽器的,app是基於客戶端的,所以要考慮app的安裝,更新,解除安裝
5.app的觸控
6.自動化,web多為selenium,app多為appium

二十三.nmon(效能監控工具)
nmon -s1 -c60 -f -m /home/nmon
引數說明:
-s1 每隔n秒抽樣一次,這裡為1秒
-c60 取出多少個抽樣數量,這裡為60,即監控=1*60/60=1分鐘
-f 按標準格式輸出檔名稱:_YYMMDD_HHMM.nmon
-m 指定監控檔案的存放目錄,-m後跟指定目錄

二十四.Android和IOS測試區別
1 . Android長按home鍵撥出應用列表和切換應用,然後右滑則終止應用;

  1. 多解析度測試,Android端20多種,ios較少;
  2. 手機作業系統,Android較多,ios較少且不能降級,只能單向升級;新的ios系統中的資源庫不能完全相容低版本中的ios系統中的應用,低版本ios系統中的應用呼叫了新的資源庫,會直接導致閃退(Crash);
  3. 操作習慣:Android,Back鍵是否被重寫,測試點選Back鍵後的反饋是否正確;應用資料從記憶體移動到SD卡後能否正常執行等;
  4. push測試:Android:點選home鍵,程式後臺執行時,此時接收到push,點選後喚醒應用,此時是否可以正確跳轉;ios,點選home鍵關閉程式和螢幕鎖屏的情況(紅點的顯示);
  5. 安裝解除安裝測試:Android的下載和安裝的平臺和工具和渠道比較多,ios主要有app store,iTunes和testflight下載;
  6. 升級測試:可以被升級的必要條件:新舊版本具有相同的簽名;新舊版本具有相同的包名;有一個標示符區分新舊版本(如版本號),對於Android若有內建的應用需檢查升級之後內建檔案是否匹配(如內建的輸入法)

二十五.IOS和android日誌抓取
iOS:
1.通過iTunes Connect(Manage Your Applications - View Details - Crash Reports)獲取使用者的crash日誌
2.通過Xcode從你的裝置上獲得崩潰日誌
3.自己在程式中新增崩潰捕捉程式碼,如果應用整合第三方SDK,如百度統計
Android:
1.通過整合第三方SDK,如百度統計、友盟統計等
2、發版時使用加固工具,他們也會收集錯誤日誌,如360加固
3、在程式中新增程式異常崩潰的捕捉程式碼,儲存到本地檔案中

二十六.SQL隱碼攻擊(想了半天,這個得列一下,安全雖然我們不做,但問基本都是問這東西,看懂這段就夠了,要是問怎麼防止就說對使用者輸入進行校驗,不要動態拼接SQL)
select * from users where username='' or 1=1#' and password=md5('')
等價於
select * from users where username='' or 1=1
SQL隱碼攻擊採用的' OR 1=1 # 是什麼意思呢?
最後一個#號有什麼意義呢?
SELECT * FROM test WHERE name='' OR 1=1 #' AND age='20'
這後面寫的 #' 是什麼意思呢?
解釋:可以註釋掉後面的一行SQL程式碼
相當於去掉了一個where條件
MySQL 註釋, 過濾掉後面的SQL語句,使其不起作用
因為1=1永遠是都是成立的,即where子句總是為真,將該sql進一步簡化之後,等價於如下select語句:
select * from users 沒錯,該sql語句的作用是檢索users表中的所有欄位

二十七.cookie和session的區別
1、cookie資料存放在客戶的瀏覽器上,session資料放在伺服器上。
2、cookie不是很安全,別人可以分析存放在本地的COOKIE並進行COOKIE欺騙
考慮到安全應當使用session。
3、session會在一定時間內儲存在伺服器上。當訪問增多,會比較佔用你伺服器的效能
考慮到減輕伺服器效能方面,應當使用COOKIE。
4、單個cookie儲存的資料不能超過4K,很多瀏覽器都限制一個站點最多儲存20個cookie。
5、所以個人建議:
將登陸資訊等重要資訊存放為SESSION
其他資訊如果需要保留,可以放在COOKIE中

二十八.客戶端的效能測試https://blog.csdn.net/xiaomaoxiao336368/article/details/83547318
1、響應(冷啟動即首次啟動,熱啟動為非首次啟動)
冷啟動:首次啟動app的時間間隔(只是啟動時間,不包括頁面載入)
熱啟動:非首次啟動app的時間間隔(只是啟動時間,不包括頁面載入)
方法:adb shell am start -W packageName或者通過Android Monitor的logcat
2、記憶體 測試點一般如下
空閒狀態:切換至後臺或者啟動後不做任何操作,消耗記憶體最少。
中強度狀態:時間偏長的操作應用。
高強度狀態:高強度使用應用,可以跑monkey來測試(通常用來測試記憶體洩漏)。
方法:adb shell dumpsys meminfo packageName
3、cpu 測試點一般如下
在空閒時間(切換至後臺)的消耗,基本沒大應用使用cpu
在執行一些應用的情況下,cpu已佔50%的情況下,觀察應用程式佔用cpu的情況
在高負荷的情況下看CPU的表現(cpu佔用應是在80%以上)
方法: top -m -s cpu |grep packageName(-m是最大 -s是排序)或者dumpsys cpuinfo |grep packageName
4、FPS (app使用的流暢度,60幀/s,要保持畫面流暢不卡頓,一般是要求每一幀的時間不超過1000/60=16.6ms)
方法:adb shell dumpsys gfxinfo packageName或者開發者選項—>profile GPU rendering —> on screen as bars(這個基本不用,瞭解就行了我感覺)
5、GPU過度渲染(開發者選項—>Debug GPU overdraw—>show overdraw areas)
6、耗電 測試點一般如下
測試手機安裝目標APK前後待機功耗無明顯差異;
常見使用場景中能夠正常進入待機,待機電流在正常範圍內;
長時間連續使用應用無異常耗電現象
方法:adb shell dumpsys batterystats |grep packageName
7、耗流
方法:
先檢視UID:cat /data/system/packages.list | grep com.newsplus.tr 假設UID為1000
然後 通過cat /proc/uid_stat/1000/tcp_rcv計算下行流量
再啟動APP到APP徹底啟動 cat/proc/uid_stat/1000/tcp_sed計算上行流量
然後sed-rcv即可
或者通過wireshark抓包也可以,沒仔細研究

二十九.CI,CD
https://blog.csdn.net/yuanjunliang/article/details/81211684

三十.adb
adb全稱為Android Debug Bridge,就是起到除錯橋的作用。顧名思義,adb就是一個debug工具。
Adb的原理:
1)當你啟動一個adb Client(客戶端),Client首先會選確認是否已有一個adb Server(伺服器)程式在執行,如果沒有,則會啟動Server程式。此時,adb Server就會繫結本地的TCP埠5037,並監聽adb Client發來的命令。
2)接著,Server將會掃描所有5555到5585範圍內的奇數埠來定位所有的模擬器或裝置,並與之建立連線。一旦Server找到 了adb daemon(守護程式),它將建立一個到該埠的連線,這樣,我們就可以使用adb命令控制和訪問模擬器或裝置了。在這裡,需注意的是任何模擬器或裝置例項會取得兩個連續的埠:一個偶數埠用來相應控制檯的連線,和一個奇數埠用來響應adb連線。
常用命令:
adb devices:檢視當前連線的裝置(連線計算機的Android裝置或者模擬器)
adb install ,將指定的apk安裝到裝置上,安裝的apk包會放在/data/app目錄下。
幾個引數:
-r 強制安裝
-d(真機,多個裝置中只有一個真機時適用)
-e(模擬器,多個裝置中只有一個模擬器時適用)
-s(指定裝置,後接序列號)
adb –s 44a188f9 install –r test.apk(其中44a188f9即序列號,通過adb devices可獲取)
adb reboot:重啟android裝置
adb shell ps/top:檢視當前終端中的程式資訊,如pid等
adb shell pm list packages:列出當前裝置所有已安裝的程式的包名
adb pull 和 adb push:
adb pull <裝置中的檔案路徑> <本地路徑>:從模擬器或裝置中複製檔案到本地。
adb push <本地檔案路徑> <裝置中的路徑>:將本地檔案或目錄複製到模擬器或裝置。
adb shell dumpsys:
alt 文字

三十一.DDMS
DDMS(Dalvik Debug Monitor Service),是 Android 開發環境中的Dalvik虛擬機器除錯監控服務,可以進行的操作有:為測試裝置截圖,檢視特定行程中正在執行的執行緒以及堆資訊、Logcat、廣播狀態資訊、模擬電話呼叫、接收SMS、虛擬地理座標
原理:
DDMS將搭建起IDE與測試終端(Emulator 或者connected device)的連結,它們應用各自獨立的埠監聽偵錯程式的資訊,DDMS可以實時監測到測試終端的連線情況。當有新的測試終端連線後,DDMS將捕捉到終端的ID,並通過adb建立偵錯程式,從而實現傳送指令到測試終端的目的
DDMS 工具存放在 SDK 的 tools 路徑下,啟動DDMS方法如下:
直接雙擊ddms.bat執行
主要功能:
Devices:在GUI的左上角可以看到標籤為“Devices”的皮膚,這裡可以檢視到所有與DDMS連線的終端的詳細資訊(真機或模擬器),以及每個終端正在執行的APP程式,每個程式最右邊相對應的是與偵錯程式連結的埠。因為Android是基於Linux核心開發的操作平臺,同時也保留了Linux中特有的程式ID,它介於程式名和埠號之間。
Screen captrue:截圖操作。
Dump View:顯示手機當前螢幕對應當前除錯頁面,選擇頁面元素,會在右面就是顯示對應View的資訊,這對我們分析頁面佈局很有用。
Threads:檢視程式中執行緒情況。
Heap:檢視應用中記憶體使用情況。
File Exporler:File Explorer非常有用,它是一個檔案瀏覽器,可以把檔案上傳到Android手機,或者從手機下載下來,也可以進行刪除操作。選中file explorer選項卡後可實現對Android手機檔案系統的上傳、下載、刪除操作,不過真機上的很多操作需要Root許可權才能進行。
Emulator Control:通過這個皮膚的一些功能可以非常容易的使測試終端模擬真實手機所具備的一些互動功能,比如:接聽電話,根據選項模擬各種不同網路情況,模擬接受SMS訊息和傳送虛擬地址座標用於測試GPS功能等。
LogCat :檢視日誌輸入資訊,可以對日誌輸入進行Filter過濾一些除錯的資訊篩選檢視等。
Console:是Android模擬器輸出的資訊,載入程式等資訊。
alt 文字
技術上暫時先寫到這,我後續還會更新~下面是一些個人總結的面試小技巧和小的問點吧
一些我認為可能會問的問題
1.自我介紹
2.你現在的測試流程描述下?
3.挑一個你最熟悉的專案描述下,說一說你在其中的工作
4.你認為如何做一個好的測試(或者說你覺得你做測試比別人的優勢在哪)
5.你印象中測試過程中最大的問題是什麼?怎麼解決的(包括線上問題)
6.工作以來或者未來的規劃(有個規劃就好)
7.什麼樣的測試用例算是一個好的測試用例(建議與第一點的黑盒方法結合著說)
8.一般你都怎麼定位bug
9.為什麼要做自動化測試?或者說和手工測試有什麼不同(https://www.cnblogs.com/test_home_c/p/9399287.html)
(這個寫的挺好,總結其實最主要:迴歸,提高效率,減少重複工作,能及時報警,更好保證產品質量)
10.離職原因(千萬不要說前公司的壞話,儘量靠在工作方向說,只要不是一些偏激的我認為都可以)
11.期望薪資(要麼直接說,要麼我覺得就是問之前可以先問問年終是幾個月,或者補貼什麼的有多少再說自己的期望,具體情況具體分析)
12.對於加班你怎麼看?(加班分兩方面,一方面是對於自己來說是成長,同時也會push公司業務的增進;第二就是有壓力的情況下其實會有動力,也會自己平時有一些解壓的方法)
13.你有什麼問題想問我麼(我覺得是一定是要問的,除非確實沒啥興趣或者覺得掛了,先考慮考慮,比如業務相關)
14.作為測試工程師,怎麼保證軟體的質量?(怎麼做好一個測試)

(1)程式碼質量:開發通過單元測試保證
(2)讓使用者參與UAT測試,保證使用者體驗(使用質量)
(3)功能測試、效能測試、相容性測試等多種測試型別的結合
(4)採用合適的用例方法,如何進行需求分析,用例評審
(5)要有把控全域性的能力(推動客戶端和UI,互動的時間,推動研發提測時間,提測質量;比如說研發提測質量低,那我們可以制定冒煙測試標準,且讓他們在測試環境聯調)

(6)要有好的溝通能力和責任心

15.開發堅持說這不是一個問題怎麼辦?(1.看需求,如果是的話就沒什麼說的 2.如果堅持,儘量重現,三方討論)
16.緊急需求怎麼辦?(一般拿出來看優先順序,如果是重要且緊急的那種,那就緊急釋出,如果不重要不緊急,看是否可以延後至下個版本;當出現緊急需求的時候,我們要和產品,研發leader討論是否可以在版本原先上線時間的基礎上延後,要為自己爭取)

給大家劇透一些問題(曾經我遇到過的,一個示例,大家也可以參考,具體的公司我就避免一些意外,不在此透露):

  1. 介紹專案

  2. 怎麼測一個介面,哪些方式(我理解是跟用例差不多,協議,url,引數,請求方式,頭部資訊,返回;然後效能上響應時間,併發,安全上SQL隱碼攻擊,許可權什麼的,提一下就行,反正能多說就說,對方會覺得你知識面廣一些)

  3. 會問有多少個服務,其實就是站點,大概算下就好了,10多個吧,然後就問服務端的一個流轉(主要是服務的流轉性)

  4. Android和ios測試區別(上面有..1.右滑 2.IOS版本少一些,一般相容4個系統版本,比如12,11,10,9,也看具體使用者情況 ,android版本多,解析度也多 3.home鍵,android能後臺執行 4.android效能沒IOS好,電量,記憶體什麼的都不如IOS其實 5.想到的可以自己補充哦)

  5. 測試這個專案的時候比如在使用者表插入一條資料,資料庫哪些欄位會變化(他的意思是測了一個查詢介面,其實我答錯了,不過回答的應該是id,userid,使用者名稱,密碼,插入時間,使用者狀態,許可權,針對借款專案的話比如還有綁卡資訊什麼的)

  6. linux檢視日誌的命令(上面有,less,more,cat,tail,echo.....)

7.遇到過的印象最深的線上問題

8.如果你提到支付,應該會問支付異常case(資料庫,流程尤為關鍵)

9.對加班怎麼看

10.測試用例設計(購物車)

11.web和app測試的最大區別(上面有)

12.怎麼進行sql注入(我覺得這個還是看下,安全上雖然沒做過,不過看過這個在面試過程中會有加分的時候)

13.jmeter引數化的方法( 總結 1.用jmeter的使用者引數,直接下面的用上面的 2.jmeter的函式助手,csvread 3.csv_data,這個傳參)

14.一週的緊急需求怎麼排期能儘量保證上線質量

15.描述最近的工作,專案,你做的什麼

16.字串倒序怎麼實現

17.自動化

暫時寫這些吧,後面蘭瑟會持續更新~
像測試方法,TCP/IP,HTTP,android和ios,web區別,抓包,linux,簡單的sql這些個是一定要知道些的,嗯~
其實在測試當中,也有很多測試工種的分類,不過此文我暫時沒有分的很細,是一個總的小結,後續我會繼續拆分,將功能,效能,自動化等等測試方面的經驗,技術,都分享給大家。
我個人的一點點見解是一定會對著簡歷細問的,所以
簡歷一定要好好寫!
簡歷一定要好好寫!
簡歷一定要好好寫!

最後,祝願大家都能成功進入自己理想的公司~

本文首發於 知乎https://zhuanlan.zhihu.com/p/116889926/edit

有任何問題都可直接提問,看到就會回覆,謝謝~

相關文章