測試開發面試題

目錄

 

功能測試用例的設計

(一).我想要回家,讓你給我買一張票,然後設計測試用例

工作測試流程

(一).功能測試流程

app專項測試

工具使用

基礎概念:

什麼是性能測試

HTTP協議(哪些方法,什麼區別(GET\POST),怎麼組成,狀態碼)

TCP三次握手四次離手

線程,進程區別聯繫

內存泄露,內存溢出區別

死鎖

自動化測試:

自動化測試腳本的應用場景:

自動化框架的搭建:

功能自動化框架

平臺工具:

算法:

c程序實現找二叉樹交叉節點

從100億隨機數中找到前100萬個最大的數

斐波那契,遞歸非遞歸 時間複雜度

linux:

linux常用指令(說了10個左右)

數據庫:

數據庫中索引和主鍵有什麼相同點和區別

網絡

tcp和udp的區別

dns的解析過程

dns屬於udp還是tcp,原因

ISO七層的作用,分別有什麼協議

給定ip,url,time等參數,去重獲取其中一天,某一時間段得日誌ip信息

典型例題

(一).Web頁面出現空白頁怎麼定位問題

(二).Web頁面響應過慢怎麼定位問題

測試用例的題目:微信有發送文字消息的功能,如果讓你設計功能點,你會設計什麼樣的測試用例來測試它的功能是不是正確的

有一個場景要測試:比如說一個微信有羣聊功能,怎麼測試這個功能是不是正確的,確保這個羣聊可以用

你爲了軟件測試這個崗位做了什麼準備呢?

對測試開發的理解

給你一個需求,怎麼開始測試;發版前遇到重大bug,怎麼處理?

在跟進版本過程中要處理很多事情,怎麼平衡?

你覺得測試最重要的是什麼?

職業規劃


功能測試用例的設計

舉例:

(一).我想要回家,讓你給我買一張票,然後設計測試用例

答案:

1.確定需求(回家回哪,需要什麼票,買什麼時候的票)

2.開始測試

2.1功能測試(我去買票(買火車票,飛機票),買到票(什麼時候),回來給你)

2.2可靠性測試(我去買票過程中被撞死了,票買不到怎麼辦,延期了,買那個點的票沒了怎麼辦讓我幫他買票的人的身份,比如是否有特殊優待,如軍人,1米2以下兒童等,身份證丟了,或者票丟了,責任劃分)

2.3可維護性測試(票是否可保存完好)

2.4兼容性(還不同人的去買,我中間招人去買,我坐車走路)

2.5算法測試(我通過不同的渠道買票花費的時間)

2.6競品測試(別的人怎麼買的票)

2.7安全性測試(身份信息保密)

2.8性能測試(一個身份證買多張票,同時多張身份證買多張票)

工作測試流程

(一).功能測試流程

1.需求評審(重點,你發揮的作用是什麼,需求可執行性,關聯影響的功能模塊,異常情況處理)

2.評估測試時間(測試計劃)

3.測試用例設計(正交,邊界值,等價類。。)

4.用例review(領導,開發,產品)

5.提測(確認開發進行過自測,功能主流程暢通,然後開始介入測試)(產品開發測試一塊走流程)

6.codediff(代碼改動點,從根源發現開發的問題,代碼中明顯測試代碼(return,寫死值),

公共靜態變量在發生高併發時容易出問題,所以不能讓這個變量的值去內存裏面取)

7.執行用例

8.提bug(jira)

9.迴歸測試

10.確認測試(準生產環境確認)(分情況)

11.發佈(線上迴歸))

12.BUG review(總結問題)

注意點:

發佈測試來控制,測試環境部署測試來控制

發佈過程中,開發運維做監控。(分批發布)

app專項測試

1.CPU,內存,流量,電量,弱網,兼容性,FPS,中斷,安裝,穩定性

   怎麼自動化實現,寫一些自動化框架方法封裝起來,重複的使用

2.冷熱啓動的區別

冷啓動:在個人電腦中,冷啓動是切斷電源後重新啓動。App類似,就是完全退出(不在後臺運行)後重啓啓動。

熱啓動:非冷啓動情況都可以稱爲熱啓動。熱啓動比冷啓動多了一個觸發點,那就是在後臺啓動App,比如雙擊蘋果的HOME鍵,進行App的熱啓動。同時熱啓動通常會有一個計時器,特別是一些理財和銀行的類的App會做此處理,當你間隔一段時間觸發了熱啓動後,會讓你再次登錄(通過密碼/手勢/指紋)。也有比如網易新聞客戶端這樣的,當你間隔一段時間後觸發熱啓動,會彈出廣告頁。

工具使用

postman:接口,功能測試,可以做參數化

httprequester:接口,功能測試

jemter:接口功能性能工具

lr:接口功能性能

fiddler:抓包,設置代理,設置斷點,mock數據

charles:抓包,設置代理,設置斷點,mock數據

robot:功能自動化

uft(qtp):功能自動化

docker:容器

monkey:性能穩定性(app)

jenkins:自動持續集成

git,svn:代碼管理

xmind/visio:腦圖

soapUI:接口功能測試(HTTP,WEBSERVICE協議)

xshell/SecureCRT/putty:

slor:關鍵字分詞

slor:我測試:我   測試分別去數據庫搜索結果

nginx(反向代理)

tomcat(動態網頁發佈)

基礎概念:

什麼是性能測試

概念:性能測試就是通過特定的方式對被測試系統按照一定測試策略施加壓力,獲取該系統的響應時間、TPS、吞吐量、資源利用率等性能指標,來檢測系統上線後能否滿足用戶需求的過程。

什麼是軟件性能:軟件性能覆蓋面廣泛,對一個系統來說包含系統的執行效率、服務器資源使用情況、系統穩定性、安全性、兼容性、可擴展性、可靠性等等

軟件性能的影響因素:

1:網絡環境 2:硬件設備(CPU、內存、存儲設置) 3:操作系統、應用服務器、數據庫配置 4:數據庫設計和數據庫訪問實現(SQL語句)。 5:系統構架(同步、異步)

不同人員對軟件性能的認識:1、實際用戶角度 2、系統管理員角度 3、開發設計人員角度

客戶使用角度:軟件對用戶操作的響應時間,如用戶提交一個查詢操作、打開一個Wed頁面的鏈接等

系統管理員角度:1、併發壓力 2、服務器硬件資源的使用情況 3、是否出現性能瓶頸 4、系統的擴展性如何

開發設計角度:1、架構設計的合理性 2、數據庫設計是否存在問題 3、代碼編程的規範是否需要優化例如SQL 4、看是否通過代碼的優化或是調節系統參數設置來提高系統優化。

HTTP協議(哪些方法,什麼區別(GET\POST),怎麼組成,狀態碼)

HTTP/1.1協議中共定義了8種HTTP請求方法,HTTP請求方法也被叫做“請求動作”,不同的方法規定了不同的操作指定的資源方式。服務端也會根據不同的請求方法做不同的響應。

GET

GET請求會顯示請求指定的資源。一般來說GET方法應該只用於數據的讀取,而不應當用於會產生副作用的非冪等的操作中。

GET會方法請求指定的頁面信息,並返回響應主體,GET被認爲是不安全的方法,因爲GET方法會被網絡蜘蛛等任意的訪問。

HEAD:HEAD方法與GET方法一樣,都是向服務器發出指定資源的請求。但是,服務器在響應HEAD請求時不會回傳資源的內容部分,即:響應主體。這樣,我們可以不傳輸全部內容的情況下,就可以獲取服務器的響應頭信息。HEAD方法常被用於客戶端查看服務器的性能。

POST:POST請求會 向指定資源提交數據,請求服務器進行處理,如:表單數據提交、文件上傳等,請求數據會被包含在請求體中。POST方法是非冪等的方法,因爲這個請求可能會創建新的資源或/和修改現有資源。

PUT:PUT請求會身向指定資源位置上傳其最新內容,PUT方法是冪等的方法。通過該方法客戶端可以將指定資源的最新數據傳送給服務器取代指定的資源的內容。

TCP三次握手四次離手

三次握手:

  1. 客戶端發送一個SYN段,並指明客戶端的初始序列號,即ISN(c).
  2. 服務端發送自己的SYN段作爲應答,同樣指明自己的ISN(s)。爲了確認客戶端的SYN,將ISN(c)+1作爲ACK數值。這樣,每發送一個SYN,序列號就會加1. 如果有丟失的情況,則會重傳。
  3. 爲了確認服務器端的SYN,客戶端將ISN(s)+1作爲返回的ACK數值。

四次揮手:

1. 客戶端發送一個FIN段,幷包含一個希望接收者看到的自己當前的序列號K. 同時還包含一個ACK表示確認對方最近一次發過來的數據。 2. 服務端將K值加1作爲ACK序號值,表明收到了上一個包。這時上層的應用程序會被告知另一端發起了關閉操作,通常這將引起應用程序發起自己的關閉操作。 3. 服務端發起自己的FIN段,ACK=K+1, Seq=L 4. 客戶端確認。ACK=L+1

線程,進程區別聯繫

進程概念:進程是表示資源分配的基本單位,又是調度運行的基本單位。例如,用戶運行自己的程序,系統就創建一個進程,併爲它分配資源,包括各種表格、內存空間、磁盤空間、I/O設備等。然後,把該進程放人進程的就緒隊列。進程調度程序選中它,爲它分配CPU以及其它有關資源,該進程才真正運行。所以,進程是系統中的併發執行的單位。在Mac、Windows NT等採用微內核結構的操作系統中,進程的功能發生了變化:它只是資源分配的單位,而不再是調度運行的單位。在微內核系統中,真正調度運行的基本單位是線程。因此,實現併發功能的單位是線程。

線程概念線程是進程中執行運算的最小單位,亦即執行處理機調度的基本單位。如果把進程理解爲在邏輯上操作系統所完成的任務,那麼線程表示完成該任務的許多可能的子任務之一。例如,假設用戶啓動了一個窗口中的數據庫應用程序,操作系統就將對數據庫的調用表示爲一個進程。假設用戶要從數據庫中產生一份工資單報表,並傳到一個文件中,這是一個子任務;在產生工資單報表的過程中,用戶又可以輸人數據庫查詢請求,這又是一個子任務。這樣,操作系統則把每一個請求――工資單報表和新輸人的數據查詢表示爲數據庫進程中的獨立的線程。線程可以在處理器上獨立調度執行,這樣,在多處理器環境下就允許幾個線程各自在單獨處理器上進行。操作系統提供線程就是爲了方便而有效地實現這種併發性

引入線程的好處

(1)易於調度。

(2)提高併發性。通過線程可方便有效地實現併發性。進程可創建多個線程來執行同一程序的不同部分。

(3)開銷少。創建線程比創建進程要快,所需開銷很少。。

(4)利於充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的併發性,使每個處理器都得到充分運行。

進程和線程的關係

(1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。線程是操作系統可識別的最小執行和調度單位。

(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。 同一進程中的多個線程共享代碼段(代碼和常量),數據段(全局變量和靜態變量),擴展段(堆存儲)。但是每個線程擁有自己的棧段,棧段又叫運行時段,用來存放所有局部變量和臨時變量。

(3)處理機分給線程,即真正在處理機上運行的是線程。

(4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。

進程的兩個基本屬性:

(1)進程是一個可擁有資源的獨立單位;

(2)進程同時又是——個可以獨立調度和分派的基本單位。正是由於進程具有這兩個基本屬性,才使之成爲一個能獨立運行的基本單位,從而也就構成了進程併發執行的基礎。

然而爲使程序能併發執行,系統還必須進行以下的一系列操作:

(1)創建進程。系統在創建進程時,必須爲之分配其所必需的、除處理機以外的所有資源。如內存空間、I/0設備以及建立相應的PCB。

(2)撤消進程。系統在撤消進程時,又必須先對這些資源進行回收操作,然後再撤消PCB。

(3)進程切換。在對進程進行切換時,由於要保留當前進程的CPU環境和設置新選中進程的CPU環境,爲此需花費不少處理機時間。

由於進程是一個資源擁有者,因而在進程的創建、撤消和切換中,系統必須爲之付出較大的時空開銷。也正因爲如此,在系統中所設置的進程數目不宜過多,進程切換的頻率也不宜太高,但這也就限制了併發程度的進一步提高。

線程與進程的比較

從調度、併發性、 系統開銷、擁有資源等方面,來比較線程與進程。

1.調度:在傳統的操作系統中,擁有資源的基本單位和獨立調度、分派的基本單位都是進程。而在引入線程的操作系統中,則把線程作爲調度和分派的基本單位。而把進程作爲資源擁有的基本單位,使傳統進程的兩個屬性分開,線程便能輕裝運行,從而可顯著地提高系統的併發程度。在同一進程中,線程的切換不會引起進程的切換,在 由一個進程中的線程切換到另一個進程中的線程時,將會引起進程的切換。

2.併發性:在引入線程的操作系統中,不僅進程之間可以併發執行,而且在一個進程中的多個線程之間,亦可併發執行,因而使操作系統具有更好的併發性,從而能更有效地使 用系統資源和提高系統吞吐量。例如,在一個未引入線程的單CPU操作系統中,若僅設置一個文件服務進程,當它由於某種原因而被阻塞時,便沒有其它的文件服 務進程來提供服務。在引入了線程的操作系統中,可以在一個文件服務進程中,設置多個服務線程,當第一個線程等待時,文件服務進程中的第二個線程可以繼續運 行;當第二個線程阻塞時,第三個線程可以繼續執行,從而顯著地提高了文件服務的質量以及系統吞吐量。

3.擁有資源:不論是傳統的操作系統,還是設有線程的操作系統,進程都是擁有資源的一個獨立單位,它可以擁有自己的資源。一般地說,線程自己不擁有系統資源(也有一點必 不可少的資源),但它可以訪問其隸屬進程的資源。亦即,一個進程的代碼段、數據段以及系統資源,如已打開的文件、I/O設備等,可供問一進程的其它所有線 程共享。

4.系統開銷:由於在創建或撤消進程時,系統都要爲之分配或回收資源,如內存空間、I/o設備等。因此,操作系統所付出的開銷將顯著地大於在創建或撤消線程時的開銷。類 似地,在進行進程切換時,涉及到整個當前進程CPU環境的保存以及新被調度運行的進程的CPU環境的設置。而線程切換隻須保存和設置少量寄存器的內容,並 不涉及存儲器管理方面的操作。可見,進程切換的開銷也遠大於線程切換的開銷。此外,由於同一進程中的多個線程具有相同的地址空間,致使它們之間的同步和通信的實現,也變得比較容易。在有的系統中,線程的切換、同步和通信都無須

內存泄露,內存溢出區別

內存溢出 out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是內存溢出。

內存泄露 memory leak,是指程序在申請內存後,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積後果很嚴重,無論多少內存,遲早會被佔光。

內存泄漏是指你向系統申請分配內存進行使用(new),可是使用完了以後卻不歸還(delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統也不能再次將它分配給需要的程序。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必定產生空間溢出,叫上溢,棧空時再做退棧也產生空間溢出,稱爲下溢。就是分配的內存不足以放下數據項序列,稱爲內存溢出. 

以發生的方式來分類,內存泄漏可以分爲4類: 

1. 常發性內存泄漏。發生內存泄漏的代碼會被多次執行到,每次被執行的時候都會導致一塊內存泄漏。 
2. 偶發性內存泄漏。發生內存泄漏的代碼只有在某些特定環境或操作過程下才會發生。常發性和偶發性是相對的。對於特定的環境,偶發性的也許就變成了常發性的。所以測試環境和測試方法對檢測內存泄漏至關重要。 
3. 一次性內存泄漏。發生內存泄漏的代碼只會被執行一次,或者由於算法上的缺陷,導致總會有一塊僅且一塊內存發生泄漏。比如,在類的構造函數中分配內存,在析構函數中卻沒有釋放該內存,所以內存泄漏只會發生一次。 
4. 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這裏並沒有發生內存泄漏,因爲最終程序釋放了所有申請的內存。但是對於一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統的所有內存。所以,我們稱這類內存泄漏爲隱式內存泄漏。 

從用戶使用程序的角度來看,內存泄漏本身不會產生什麼危害,作爲一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統所有的內存。從這個角度來說,一次性內存泄漏並沒有什麼危害,因爲它不會堆積,而隱式內存泄漏危害性則非常大,因爲較之於常發性和偶發性內存泄漏它更難被檢測到 

死鎖

概念:當線程A持有獨佔鎖a,並嘗試去獲取獨佔鎖b的同時,線程B持有獨佔鎖b,並嘗試獲取獨佔鎖a的情況下,就會發生AB兩個線程由於互相持有對方需要的鎖,而發生的阻塞現象,我們稱爲死鎖。

造成死鎖必須達成的4個條件(原因):

  1. 互斥條件:一個資源每次只能被一個線程使用。
  2. 請求與保持條件:一個線程因請求資源而阻塞時,對已獲得的資源保持不放。
  3. 不剝奪條件:線程已獲得的資源,在未使用完之前,不能強行剝奪。
  4. 循環等待條件:若干線程之間形成一種頭尾相接的循環等待資源關係。
  1. 互斥條件 ---> 獨佔鎖的特點之一。
  2. 請求與保持條件 ---> 獨佔鎖的特點之一,嘗試獲取鎖時並不會釋放已經持有的鎖
  3. 不剝奪條件 ---> 獨佔鎖的特點之一。
  4. 循環等待條件 ---> 唯一需要記憶的造成死鎖的條件。

不錯!複雜的死鎖條件經過簡化,現在需要記憶的僅只有獨佔鎖與第四個條件而已。

所以,面對如何避免死鎖這個問題,我們只需要這樣回答!
: 在併發程序中,避免了邏輯中出現複數個線程互相持有對方線程所需要的獨佔鎖的的情況,就可以避免死鎖。

自動化測試:

自動化測試腳本的應用場景:

1.重複性較多的,寫腳本能省時間,節省效率,

接口重複迴歸,功能重複迴歸

2.手動做不了的測試

上萬數據的準確性校驗,腳本跑,錯誤數據篩選出來

數據更新機制的調整,全量變成增量更新()

自動化框架的搭建:

接口自動化框架

1.結構(1.框架思想(數據,關鍵字,行爲,事件,混合)

2.讀取用例的模塊(excel,txt,mysql,xml)

3.發請求的模塊(requests封裝)

4.斷言模塊(re,遍歷斷言)

5.日誌模塊

6.測試報告生成模塊

7.發郵件模塊

8.配置文件)

2.怎麼設計測試用例,注意哪些點()

3.怎麼斷言

功能自動化框架

1.和接口自動化類似

2.對頁面各個控件的api封裝(哪些封裝,下拉框,選擇框,對隱形控件怎麼處理)

3.不同環境處理

4.xpath定位方法()

5.js定位方法()

平臺工具:

1.接口自動化集成到平臺上;

2.平臺做測試環境,線上環境的監控

3.做公用統計線上badcase的統計

算法:

(會多門語言(前端了解。java熟練,python熟練))

排序算法:

冒泡

快排

查找算法:

二分查找,

隊列,堆,棧實現:

c程序實現找二叉樹交叉節點

尋找兩個鏈表中相交部分的起點,不得改變鏈表結構,時間複雜性要求爲O(n),空間複雜性爲O(1),不相交則返回null

    例如:鏈表A:        a1->a2->c1->c2->c3 

               鏈表B: b1->b2->b3->c1->c2->c3

             相交的起點爲c1

思路較簡單:鏈表後部分相同,可以先把鏈表以後端爲基準對齊,再一個一個元素的比較,第一個相同的元素則爲相交的起點。(這裏認爲兩個鏈表只有一個相交點,且相交點之後的部分全都相同,如果這種假設不成立,這種方法無效,不過題目應該是支持這種假設的,否則測試案例肯定通不過)

public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
    //boundary check
    if(headA == null || headB == null) return null;
    
    ListNode a = headA;
    ListNode b = headB;
    
    //如果a和b的長度不相等,那麼下面的循環會循環兩次,第一次循環後把兩個鏈表的指針交換,同時完成末端對齊。大神就是大神。。
    while( a != b){    
    	//for the end of first iteration, we just reset the pointer to the head of another linkedlist
        a = a == null? headB : a.next;
        b = b == null? headA : b.next;    
    }
    
    return a;
}

從100億隨機數中找到前100萬個最大的數

堆排序做法:先取出前100個數,維護一個100個數的最小堆,遍歷一遍剩餘的元素,在此過程中維護堆就可以了。具體步驟如下:
step1:取前m個元素(例如m=100),建立一個小頂堆。保持一個小頂堆得性質的步驟,運行時間爲O(lgm);建立一個小頂堆運行時間爲m*O(lgm)=O(m lgm);
step2:順序讀取後續元素,直到結束。每次讀取一個元素,如果該元素比堆頂元素小,直接丟棄
如果大於堆頂元素,則用該元素替換堆頂元素,然後保持最小堆性質。最壞情況是每次都需要替換掉堆頂的最小元素,因此需要維護堆的代價爲(N-m)*O(lgm);
最後這個堆中的元素就是前最大的10W個。時間複雜度爲O(N lgm)。

根據快速排序劃分的思想
(1) 遞歸對所有數據分成[a,b)b(b,d]兩個區間,(b,d]區間內的數都是大於[a,b)區間內的數
(2) 對(b,d]重複(1)操作,直到最右邊的區間個數小於100個。注意[a,b)區間不用劃分
(3) 返回上一個區間,並返回此區間的數字數目。接着方法仍然是對上一區間的左邊進行劃分,分爲[a2,b2)b2(b2,d2]兩個區間,取(b2,d2]區間。如果個數不夠,繼續(3)操作,如果個數超過100的就重複1操作,直到最後右邊只有100個數爲止。

斐波那契,遞歸非遞歸 時間複雜度

概念:由於斐波納挈數列是以兔子的繁殖引入的,因此也叫“兔子數列”。它指的是這樣一個數列:0,1,1,2,3,5,8,13......從這組數可以很明顯看出這樣一個規律:從第三個數開始,後邊一個數一定是在其之前兩個數的和。在數學上,斐波納挈數列可以以這樣的公式表示:F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2),(n>=2)
既然該數列已經有這樣一個規律:F(n) = F(n-1) + F(n-2);那麼我們很容易就能想到用遞歸的方法,這樣寫出來的代碼比較簡潔

long long Fib1(long long num)
{
	assert(num >= 0);
 
	//遞歸
	if ((num == 1) || (num == 0))
	{
		return num;
	}
	return Fib1(num-1)+Fib1(num-2);
}

時間複雜度 ----- O(2^N)

由於使用遞歸時,其執行步驟是:要得到後一個數之前必須先計算出之前的兩個數,即在每個遞歸調用時都會觸發另外兩個遞歸調用,例如:要得到F(10)之前得先得到F(9)、F(8),那麼得到F(9)之前得先得到F(8)、F(7)......如此遞歸下去

從上圖我們可以看出,這樣的計算是以 2 的次方在增長的。除此之外,我們也可以看到,F(8)和F(7)的值都被多次計算,如果遞歸的深度越深,那麼F(8)和F(7)的值會被計算更多次,但是這樣計算的結果都是一樣的,除了其中之一外,其餘的都是浪費,可想而知,這樣的開銷是非常恐怖的!

兩種非遞歸算法來實現:

@@:時間複雜度爲O(N),空間複雜度爲O(N)

創建一個數組,每次將前兩個數相加後直接賦給後一個數。這樣的話,有N個數就創建一個包含N個數的一維數組,所以空間複雜度爲O(N);由於只需從頭向尾遍歷一邊,時間複雜度爲O(N)

long long* Fib2(long long num)
{
	assert(num >= 0);
	//非遞歸
	long long* array = new long long[num+1];
	array[0] = 0;
	array[1] = 1;
	for (int i=2; i<=num; i++)
	{
		array[i] = array[i-1] + array[i-2];
	}
	return array;
}

linux:

linux常用指令(說了10個左右)

1、cd命令:它用於切換當前目錄,它的參數是要切換到的目錄的路徑,可以是絕對路徑,也可以是相對路徑。
2、ls命令:查看文件與目錄的命令,list之意,它的參數非常多
3、grep命令:該命令常用於分析一行的信息,若當中有我們所需要的信息,就將該行顯示出來,該命令通常與管道命令一起使用,用於對一些命令的輸出進行篩選加工等等,它的簡單語法爲grep [-acinv] [--color=auto] '查找字符串' filename
# 取出文件/etc/man.config中包含MANPATH的行,並把找到的關鍵字加上顏色
grep --color=auto 'MANPATH' /etc/man.config
# 把ls -l的輸出中包含字母file(不區分大小寫)的內容輸出
ls -l | grep -i file
4、find命令:基於查找的功能非常強大的命令,相對而言,它的使用也相對較爲複雜,參數也比較多,所以在這裏將給把它們分類列出,它的基本語法如下:find [PATH] [option] [action]
find /root -mtime 0 # 在當前目錄下查找今天之內有改動的文件
5、cp命令:該命令用於複製文件,copy之意,它還可以把多個文件一次性地複製到一個目錄下,它的常用參數如下:
cp -a file1 file2 #連同文件的所有特性把文件file1複製成文件file2
cp file1 file2 file3 dir #把文件file1、file2、file3複製到目錄dir中
6、mv命令:該命令用於移動文件、目錄或更名,move之意。

7、rm命令:該命令用於刪除文件或目錄,remove之間。

rm -i file # 刪除文件file,在刪除之前會詢問是否進行該操作

rm -fr dir # 強制刪除目錄dir中的所有文件

8、ps命令:用於將某個時間點的進程運行情況選取下來並輸出,process之意。

其實我們只要記住ps一般使用的命令參數搭配即可,它們並不多,如下:

ps aux # 查看系統所有的進程數據
ps ax # 查看不與terminal有關的所有進程
ps -lA # 查看系統所有的進程數據
ps axjf # 查看連同一部分進程樹狀態

9、kill命令

該命令用於向某個工作(%jobnumber)或者是某個PID(數字)傳送一個信號,它通常與ps和jobs命令一起使用,它的基本語法如下:

kill -signal PID

例如:

# 以正常的結束進程方式來終於第一個後臺工作,可用jobs命令查看後臺中的第一個工作進程
kill -SIGTERM %1 
# 重新改動進程ID爲PID的進程,PID可用ps命令通過管道命令加上grep命令進行篩選獲得
kill -SIGHUP PID

10、tar命令

只需要記住下面三條命令即可:
壓縮:tar -jcv -f filename.tar.bz2 要被處理的文件或目錄名稱
查詢:tar -jtv -f filename.tar.bz2
解壓:tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄
注:文件名並不定要以後綴tar.bz2結尾,這裏主要是爲了說明使用的壓縮程序爲bzip2
11、cat命令

該命令用於查看文本文件的內容,後接要查看的文件名,通常可用管道與more和less一起使用,從而可以一頁頁地查看數據。例如:

cat text | less # 查看text文件中的內容
# 注:這條命令也可以使用less text來代替

12、chmod命令:該命令用於改變文件的權限。

同時,chmod還可以使用u(user)、g(group)、o(other)、a(all)和+(加入)、-(刪除)、=(設置)跟rwx搭配來對文件的權限進行更改。

# 例如:
chmod 0755 file # 把file的文件權限改變爲-rxwr-xr-x
chmod g+w file # 向file的文件權限中加入用戶組可寫權限

13、vim命令:該命令主要用於文本編輯,它接一個或多個文件名作爲參數,如果文件存在就打開,如果文件不存在就以該文件名創建一個文件。vim是一個非常好用的文本編輯器,它裏面有很多非常好用的命令,在這裏不再多說。你可以從這裏下載vim常用操作的詳細說明。

14、gcc命令
對於一個用Linux開發C程序的人來說,這個命令就非常重要了,它用於把C語言的源程序文件,編譯成可執行程序,由於g++的很多參數跟它非常相似,所以這裏只介紹gcc的參數,它的常用參數如下:

-o :output之意,用於指定生成一個可執行文件的文件名
-c :用於把源文件生成目標文件(.o),並阻止編譯器創建一個完整的程序
-I :增加編譯時搜索頭文件的路徑
-L :增加編譯時搜索靜態連接庫的路徑
-S :把源文件生成彙編代碼文件
-lm:表示標準庫的目錄中名爲libm.a的函數庫
-lpthread :連接NPTL實現的線程庫
-std= :用於指定把使用的C語言的版本

# 例如:
# 把源文件test.c按照c99標準編譯成可執行程序test
gcc -o test test.c -lm -std=c99
#把源文件test.c轉換爲相應的彙編程序源文件test.s
gcc -S test.c

15、看日誌(cat,head,tail,more)

grep|wc -l

數據庫:

關係型數據庫:

mangodb

mysql(sql,慢查詢,配置)

oracal

GP數據庫

非關係型數據庫:

redis

服務架構:

服務分佈式架構(超融合):概念實現理解

數據庫中索引和主鍵有什麼相同點和區別

主鍵是表中的一個或多個字段,它的值用於惟一地標識表中的某一條記錄.;使用索引可快速訪問數據庫表中的特定信息。
索引是對數據庫表中一列或多列的值進行排序的一種結構,只有當經常查詢索引列中的數據時,才需要在表上創建索引。索引佔用磁盤空間,並且降低添加、刪除和更新行的速度。當然索引也有好處就是查詢速度快,它利還是大於弊的所以請慎重使用索引。

網絡

tcp和udp的區別

TCP編程的服務器端一般步驟是: 
  1、創建一個socket,用函數socket(); 
  2、設置socket屬性,用函數setsockopt(); * 可選 
  3、綁定IP地址、端口等信息到socket上,用函數bind(); 
  4、開啓監聽,用函數listen(); 
  5、接收客戶端上來的連接,用函數accept(); 
  6、收發數據,用函數send()和recv(),或者read()和write(); 
  7、關閉網絡連接; 
  8、關閉監聽; 

TCP編程的客戶端一般步驟是: 
  1、創建一個socket,用函數socket(); 
  2、設置socket屬性,用函數setsockopt();* 可選 
  3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選 
  4、設置要連接的對方的IP地址和端口等屬性; 
  5、連接服務器,用函數connect(); 
  6、收發數據,用函數send()和recv(),或者read()和write(); 
  7、關閉網絡連接;

UDP:
與之對應的UDP編程步驟要簡單許多,分別如下: 
  UDP編程的服務器端一般步驟是: 
  1、創建一個socket,用函數socket(); 
  2、設置socket屬性,用函數setsockopt();* 可選 
  3、綁定IP地址、端口等信息到socket上,用函數bind(); 
  4、循環接收數據,用函數recvfrom(); 
  5、關閉網絡連接; 

UDP編程的客戶端一般步驟是: 
  1、創建一個socket,用函數socket(); 
  2、設置socket屬性,用函數setsockopt();* 可選 
  3、綁定IP地址、端口等信息到socket上,用函數bind();* 可選 
  4、設置對方的IP地址和端口等屬性; 
  5、發送數據,用函數sendto(); 
  6、關閉網絡連接;

dns的解析過程

概念:DNS的全稱是domain name system,即域名系統。DNS是因特網上作爲域名和IP地址相互映射的一個分佈式數據庫,能夠使用戶更方便的去訪問互聯網而不用去記住能夠被機器直接讀取的IP地址。通過域名,最終得到該域名對應的IP地址的過程則是域名解析的過程。

解析方法:

1、遞歸查詢

遞歸查詢時如果客戶端所詢問的本地域名服務器不知道被查詢的域名的IP地址,那麼本地域名服務器就以DNS客戶的身份,向其他頂級域名服務器繼續發出查詢,直到查詢到結果後,再層層傳遞回來。

2、迭代查詢

總結:

當我們在瀏覽器中輸入一個網站時,會發生如下過程

1、瀏覽器中輸入想要訪問的網站的域名,操作系統會先檢查本地的hosts文件是否有這個網址映射關係,如果有,就先調用這個IP地址映射,完成域名解析。

2、如果hosts裏沒有這個域名的映射,客戶端會向本地DNS服務器發起查詢。本地DNS服務器收到查詢時,如果要查詢的域名包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析。

3、如果本地DNS服務器本地區域文件與緩存解析都失效,則根據本地DNS服務器的設置,採用遞歸或者迭代查詢,直至解析完成。

dns屬於udp還是tcp,原因

DNS同時佔用UDP和TCP端口53是公認的,這種單個應用協議同時使用兩種傳輸協議的情況在TCP/IP棧也算是個另類。但很少有人知道DNS分別在什麼情況下使用這兩種協議。

爲什麼既使用TCP又使用UDP? 
首先了解一下TCP與UDP傳送字節的長度限制: 
UDP報文的最大長度爲512字節,而TCP則允許報文長度超過512字節。當DNS查詢超過512字節時,協議的TC標誌出現刪除標誌,這時則使用TCP發送。通常傳統的UDP報文一般不會大於512字節。 
區域傳送時使用TCP,主要有一下兩點考慮: 
1.輔域名服務器會定時(一般時3小時)向主域名服務器進行查詢以便了解數據是否有變動。如有變動,則會執行一次區域傳送,進行數據同步。區域傳送將使用TCP而不是UDP,因爲數據同步傳送的數據量比一個請求和應答的數據量要多得多。 
2.TCP是一種可靠的連接,保證了數據的準確性。 
域名解析時使用UDP協議: 
客戶端向DNS服務器查詢域名,一般返回的內容都不超過512字節,用UDP傳輸即可。不用經過TCP三次握手,這樣DNS服務器負載更低,響應更快。雖然從理論上說,客戶端也可以指定向DNS服務器查詢的時候使用TCP,但事實上,很多DNS服務器進行配置的時候,僅支持UDP查詢包。

ISO七層的作用,分別有什麼協議

webp

給定ip,url,time等參數,去重獲取其中一天,某一時間段得日誌ip信息

(採用了set方法,time和logging模塊)好像面試官不是很滿意

後來想想可以用linux查logger文件,ls-ld獲取某天全部日誌信息,再py去重。。

典型例題

(一).Web頁面出現空白頁怎麼定位問題

1.抓包(抓包)

2.看服務日誌

3.看你當前url 用接口實際訪問模擬下請求

4.mock數據,給請求,確認是那部分問題

 

(二).Web頁面響應過慢怎麼定位問題

從一個瀏覽器輸入url到形成頁面經歷了什麼

(三).你所測試的系統架構

測試用例的題目:微信有發送文字消息的功能,如果讓你設計功能點,你會設計什麼樣的測試用例來測試它的功能是不是正確的

1、根據需求文檔,完全按照需求文檔框架/功能描述,根據自己的理解整理爲用例。簡單來說,就是將需求文檔描述的內容,重新按照用例的格式編輯一次,把能想到的各種可能性添加進去。

2、搜索其他測試人員編寫的同類型功能用例,先理解,再根據項目實際需求的較小差異,重新新增/刪/改,組成滿足需求的用例組。

有一個場景要測試:比如說一個微信有羣聊功能,怎麼測試這個功能是不是正確的,確保這個羣聊可以用

你爲了軟件測試這個崗位做了什麼準備呢?

對測試開發的理解

測試開發工程師是屬於測試工程師的。與純測試不同的是,還需要有編碼能力,能夠寫一些測試工具,腳本來幫助提高測試效率。

給你一個需求,怎麼開始測試;發版前遇到重大bug,怎麼處理?

在跟進版本過程中要處理很多事情,怎麼平衡?

你覺得測試最重要的是什麼?

儘可能的找出軟件的錯誤

職業規劃

參考

https://blog.csdn.net/qq_30758629/article/details/81568366

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章