1. 程式人生 > >大廠測試工程師面試題總結-一面(附參考答案)

大廠測試工程師面試題總結-一面(附參考答案)

一面:面試官問的面試題:
1、首先自我介紹,然後問了簡歷上熟悉的自動化測試框架的使用過程,自動化測試框架的優缺點

2、用棧實現佇列

3、資料庫的死鎖問題 
死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
產生死鎖的原因主要是:

(1)系統資源不足。

(2) 程序執行推進的順序不合適。

(3)資源分配不當等。

如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。

4、三次握手,四次握手
三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。
        
第一次握手:Client什麼都不能確認;Server確認了對方傳送正常
        
第二次握手:Client確認了:自己傳送、接收正常,對方傳送、接收正常;Server確認了:自己接收正常,對方傳送正常       
第三次握手:Client確認了:自己傳送、接收正常,對方傳送、接收正常;Server確認了:自己傳送、接收正常,對方傳送接收正常
所以三次握手就能確認雙發收發功能都正常,缺一不可。

為什麼要四次揮手?

答:根本原因是,一方傳送FIN只表示自己發完了所有要發的資料,但還允許對方繼續把沒發完的資料發過來。
        舉個例子:A和B打電話,通話即將結束後,A說“我沒啥要說的了”,B回答“我知道了”,但是B可能還會有要說的話,A不能要求B跟著自己的節奏結束通話,於是B可能又巴拉巴拉說了一通,最後B說“我說完了”,A回答“知道了”,這樣通話才算結束。


5、面向物件裡面重寫和過載的區別
多型:允許不同類的物件對同一訊息做出響應。即同一操作作用於不同的物件,可以有不同的解釋,產生不同的執行結果。這也意味著一個物件有著多重特徵,可以在特定的情況下,表現不同的狀態,從而對應著不同的屬性和方法。

多型的實現方式:介面實現,繼承父類進行方法重寫,同一個類中進行方法過載。

方法過載(Overloading):一個類中有多個方法(函式),它們具有相同的名字,但方法傳遞的引數或引數的個數不同,返回型別可以相同。
方法重寫(Override): 子類對父類的方法做一定的修改,返回值和形參都不能改變。又稱方法覆蓋。

6、父函式子函式是指什麼 

7、Linux命令,檢視機器上所有的程序(top)
可以使用ps命令。它能顯示當前執行中程序的相關資訊,包括程序的PID

8、過濾出某一個生產條件對應的程序 

9、某一個埠的佔用情況 
輸入命令:netstat -ano,列出所有埠的情況。
開啟工作管理員,切換到程序選項卡,在PID一列檢視2720對應的程序是誰,如果看不到PID這一列,如下圖:

10、介紹Linux管道 
tail -200 ims.log | grep  "Integer" 日誌查詢關鍵字命令
管道
舉例:ls -a | grep mysql
說明:就是把前一個命令的結果當成後一個命令的輸入。結合本例就是先顯示所有的檔案,然後再用grep命令在ls的結果中查詢包含mysql的檔案

11、資料庫增刪改查命令,分別介紹一下每個命令的作用,刪除表,刪除表的某一行各怎麼寫 
插入記錄:insert
更新記錄:update
刪除記錄:delete
查詢記錄:select

表的建立:create tablename ..
表的檢視:desc tablename
表的刪除:drop table tablename
表的修改:
修改表  
1)修改某個表中某個列的某個資料型別   
語法:alter table tablename modify column_name newcolumn_type;  
2)增加表字段   語法:alter table tablename add column newcolumn_name newcolumn_type;  
3)刪除表字段   語法:alter table tablename drop column column_name;   
4) 欄位改名     語法:alter table tablename change column_name newcolumn_name column_type;(將column_type更改,成為newcolumn_type,可同時更改欄位型別)  

12、你比較熟悉的設計模式有哪些 
    單例模式、抽象工廠模式

13、設計一個類,我們只能獲取這個類的一個例項,其實是一個單例模式,可以作為參考(我寫到了static) 
單例模式實現步驟:
   1.把構造方法私有化
   2.惟一的一個例項,加上static屬性
   3.對外提供獲取該類物件的共有方法也是static屬性

14、類裡面靜態變數和非靜態變數的區別(原題+3) 
static修飾的成員,大家用的時候都用的一個東西,一個人改動後,大家的都變了。而非static 修飾的成員是個人私有的,允許自己修改,每個人的都不一樣。

靜態變數在記憶體中只有一個,java虛擬機器在載入類的過程中為靜態變數分配記憶體,靜態變數位於方法區,被類的所有例項共享。而例項變數取決於類的例項。每建立一個例項,java虛擬機器就會為例項變數分配一次記憶體,例項變數位於堆區中,其生命週期取決於例項的生命週期。

15、比較熟悉的排序有哪些,(冒泡,歸併)分別介紹一下 
氣泡排序:將序列中所有元素兩兩比較,將最大的放在最後面。將剩餘序列中所有元素兩兩比較,將最大的放在最後面。重複第二步,直到只剩下一個數。
程式碼;
public class SortTest {
    /*氣泡排序
     */
    public static void bubbleSort(int[] a) {
        int len=a.length;
        for(int i=0;i<len;i++) {
            for(int j=0;j<len-i-1;j++) {//第二重迴圈的條件
                if(a[j]>a[j+1]) {
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }
        
    }
    
    public static void main(String[] args) {
        int a[]=new int[] {8,3,5,9,1};
        SortTest.bubbleSort(a);
        System.out.println(Arrays.toString(a));
    }
}

歸併排序
速度僅次於快速排序,記憶體少的時候使用,可以進行平行計算的時候使用。
選擇相鄰兩個陣列成一個有序序列。
選擇相鄰的兩個有序序列組成一個有序序列。
重複第二步,直到全部組成一個有序序列。
public  void mergeSort(int[] a, int left, int right) {  
             int t = 1;// 每組元素個數  
             int size = right - left + 1;  
             while (t < size) {  
                 int s = t;// 本次迴圈每組元素個數  
                 t = 2 * s;  
                 int i = left;  
                 while (i + (t - 1) < size) {  
                     merge(a, i, i + (s - 1), i + (t - 1));  
                    i += t;  
                }  
                if (i + (s - 1) < right)  
                    merge(a, i, i + (s - 1), right);  
            }  
         }  
        
         private static void merge(int[] data, int p, int q, int r) {  
            int[] B = new int[data.length];  
            int s = p;  
            int t = q + 1;  
            int k = p;  
            while (s <= q && t <= r) {  
               if (data[s] <= data[t]) {  
                    B[k] = data[s];  
                    s++;  
                } else {  
                    B[k] = data[t];  
                    t++;  
                }  
                k++;  
            }  
            if (s == q + 1)  
                B[k++] = data[t++];  
            else  
                B[k++] = data[s++];  
            for (int i = p; i <= r; i++)  
                data[i] = B[i];  
         }
一、穩定性:

    穩定:氣泡排序、插入排序、歸併排序和基數排序

  不穩定:選擇排序、快速排序、希爾排序、堆排序

二、平均時間複雜度

  O(n^2):直接插入排序,簡單選擇排序,氣泡排序。