201709今日頭條測試開發校招面經
一面
1.手寫斐波拉契數列
public static int fibonacci(int n){
if(n <= 2){
return 1;
}else{
return fibonacci(n-1) + fibonacci(n-2);
}
}
2.sql。列印每個學生的最高分,每個學生有多個成績。table:courseid username score
a) select * from table group by username having score=max(score)
3.linux命令:
a) 一個資料夾下有多少個檔案
ls -lR|grep "^-"| wc -l //R代表子目錄,"^d"表示目錄,"^-"表示檔案,wc -l表示統計輸出的行數。
ls -lR HB*/|grep "^-"| wc -l //HB開頭的檔案下所有檔案個數
ls -l|grep "^d"| wc -l //當前檔案下所有檔案夾個數
b) 清空資料夾下的所有檔案內容,不是刪除 >重寫 >>追加
c) 檢視埠號是否被佔用
lsof -i:80 //顯示所有開啟80埠的程序,lsof(list open files)是一個列出當前系統開啟檔案的工具
netstat -anp |grep 80 //顯示所有佔用80埠的程序
netstat -a //列出所有埠
lsof -p 30297 //顯示哪些檔案被pid為30297的程序開啟
4.抽象類和介面的聯絡和區別
a) 聯絡
i. 抽象類的抽象方法和介面的所有方法都是有一個方法頭,沒有具體實現。
ii. 都不能被例項化,即通過new生成一個物件
iii. 一個類繼承抽象類或者介面,都必須實現抽象類的抽象方法和介面的所有方法
b) 區別
i. 抽象類單繼承,介面多繼承
ii. 抽象類中可以有具體方法,介面中全是抽象方法
iii. 繼承抽象類的類可以不實現抽象類的抽象方法,只需要將此類定義為abstract即可,而實現介面的非抽象類必須重寫其方法。
iv. 抽象類的成員變數是普通變數,介面的成員變數是不可變常量。
v. 抽象類的抽象方法可以是public,protected,default型別,而介面的方法只能是public
c) 介面是抽象類的延伸,java了保證資料安全是不能多重繼承的,也就是說繼承只能存在一個父類,但是介面不同,一個類可以同時實現多個介面,不管這些介面之間有沒有關係,所以介面彌補了抽象類不能多重繼承的缺陷,但是推薦繼承和介面共同使用,因為這樣既可以保證資料安全性又可以實現多重繼承。
5.怎麼做的自動化測試
a) 主要包括功能測試(Web端到端測試)codeceptjs+webdriverIO和介面測試mocha+supertest
6.Git用過嗎?如何切換分支?如何暫存工作臺?
a) 切換分支 git checkout branch_name
b) 暫存工作區 git stash
c) 取出工作區 git stash pop
- 用過Jenkins嗎?怎麼配置的,如何檢視報告?除了發郵件通知還有什麼通知方法?
a) 報告需要專案跑完能輸出報告(json/html),然後利用外掛優美展示。
b) 在Jenkins上安裝外掛可以實現多種通知方式:釘釘,郵件
7.測試一個手機登陸介面
a) 功能測試:有網斷網、輸入正確、輸入錯誤、輸入空、中文特殊字元、長度限制、驗證碼有效時長、密碼儲存是否加密、是否有提示友好
b) 安全測試:sql注入、不登入能否操作、禁止輸入指令碼防XSS攻擊、使用者名稱密碼傳輸時是否加密
c) 效能測試:
i. 單使用者登入系統的響應時間是否符合”3-5-8”原則
ii. 使用者數在臨界點時併發登入是否還能符合”3-5-8”原則
iii. 壓力:大量併發使用者登入,系統的響應時間是多少?系統會出現宕機、記憶體洩露、cpu飽和、無法登入嗎?
iv. 穩定性: 系統能否處理併發使用者數在臨界點以內連續登入N個時的場景?
d) 頁面測試:不同手機控制元件位置、頁面美觀簡潔
e) 其他測試:輸錯超3次、是否支援貼上、(session 過期)
8.xml檔案如何視覺化更強
9.get/post區別
a) 傳送引數的方式不同。GET請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中),以?分割URL和傳輸資料,引數之間以&相連,這種方式不安全;POST把提交的資料則放置在是HTTP包的包體中。
b) 可傳引數長度不同。GET方式提交的資料有限制,理論上POST沒有限制,可傳較大量的資料。其實HTTP沒有對GET請求進行限制,而是瀏覽器對url長度有限制。
c) 伺服器獲取引數方式不同。對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的資料。
d) 總結:Get是向伺服器發索取資料的一種請求,資料在URL中,而Post是向伺服器提交資料的一種請求,資料在FORM(表單)中,Method預設為”GET”,實質上,GET和POST只是傳送引數的機制不同,並不是一個取一個發!Get也能修改資料,POST也能查詢資料,只是HTTP規範建議GET用於查詢因為效率更高,POST用於修改因為更安全。GET(冪等),POST(非冪等),PUT,DELETE查改增刪。POST可以完成所有的操作,引入PUT,DELETE是為了語義化,是指使用語義恰當的標籤,使規範有良好的結構,能夠讓人和機器都容易理解。
二面
1.手寫非遞迴翻轉二叉樹,二叉樹的映象二叉樹
2.linux:列印檔案a.log中所有包含error的行數,字元數(error算一個字元)
grep error a.log | wc -l
grep error a.log | wc -m
3.常見的HTTP狀態碼。
a) 200 請求成功
b) 301 資源被永久轉移到其他URL
c) 403 伺服器拒絕響應請求
d) 404 請求的資源不存在
e) 500 內部伺服器錯誤
f) 502 Bad Gateway 充當閘道器或代理的伺服器,從遠端伺服器接收到了一個無效的請求
g) 503 Service Unavailable 由於超載或系統維護,伺服器暫時的無法處理客戶端的請求。
**4.sql。**user:uid uname,project:pid pname,u_p: uid pid打印出姓名為ming的所有pid和pname,table1特別大。
a) select pid,pname from project,u_p
b) where uid in(select uid from user where uname=’ming’) and project.pid=u_p.pid
5.selenium原理簡述
e) Selenium 經歷了兩個版本,Selenium 1.0 和 Selenium 2.0,本文僅介紹Selenium2的原理,在Selenium 2.0 主推的是WebDriver,Selenium2又名Selenium Webdriver。
f) Selenium是一個用於Web應用程式測試的工具,支援多平臺、多瀏覽器、多語言去實現自動化測試,Selenium2將瀏覽器原生的API封裝成WebDriver API,可以直接操作瀏覽器頁面裡的元素,甚至操作瀏覽器本身(截圖,視窗大小,啟動,關閉,安裝外掛,配置證書之類的),所以就像真正的使用者在操作一樣。
g) Selenium2原理
webdriver是按照server–client的經典設計模式設計的:
server端就是remote server,可以是任意的瀏覽器:我們的指令碼啟動瀏覽器後,該瀏覽器就是remote server,它的職責就是等待client傳送請求並做出響應;
client端簡單說來就是我們的測試程式碼:我們測試程式碼中的一些行為,比如開啟瀏覽器,轉跳到特定的url等操作是以http請求的方式傳送給被server端(也就是被測瀏覽器)server接受請求,並執行相應操作,並在response中返回執行狀態、返回值等資訊;
簡單介紹一下webdriver的工作原理:
- 啟動瀏覽器後,selenium-webdriver會將目標瀏覽器繫結到特定的埠,啟動後的瀏覽器則作為webdriver的remote server。
- 客戶端(也就是測試指令碼),藉助ComandExecutor傳送HTTP請求給server端(通訊協議:The WebDriver Wire Protocol,在HTTP request的body中,會以WebDriver Wire協議規定的JSON格式的字串來告訴Selenium我們希望瀏覽器接下來做什麼事情)。
- Server端需要依賴原生的瀏覽器元件,轉化Web Service的命令為瀏覽器原生呼叫來完成操作。
注:
The WebDriver Wire Protocol是Selenium自己設計定義的協議,這套協議非常之強大,幾乎可以操作瀏覽器做任何事情,包括開啟、關閉、最大化、最小化、元素定位、元素點選、上傳檔案等。
WebDriver Wire協議是通用的,也就是說不管FirefoxDriver還是ChromeDriver,啟動之後都會在某一個埠啟動基於這套協議的Web Service。WebDriver Wire協議定義了一套基於RESTful的web service。