1. 程式人生 > >【已解決】面試測試崗位遇到的幾個未解決的問題

【已解決】面試測試崗位遇到的幾個未解決的問題

本來可以問面試官的,面的太差,不想開口啦,哈哈哈哈

1. api介面中的冪等性有什麼解決方案?

冪等性三個字平常倒是聽說過,但只浮於表面聽過而已,是什麼意思,不清楚;

百度給出但解釋是:

抄用一段數學上的定義:f(f(x)) = f(x)。x被函式f作用一次和作用無限次的結果是一樣的。冪等性應用在軟體系統中,我把它簡單定義為:某個函式或者某個介面使用相同引數呼叫一次或者無限次,其造成的後果是一樣的,在實際應用中一般針對於介面進行冪等性設計。舉個栗子,在系統中,呼叫方A呼叫系統B的介面進行使用者的扣費操作時,由於網路不穩定,A重試了N次該請求,那麼不管B是否接收到多少次請求,都應該保證只會扣除該使用者一次費用。

列舉三種改進方式:

1、 悲觀鎖,select for update,整個執行過程中鎖定該訂單對應的記錄。 2、樂觀鎖,affectrows = db.update("update payorder set state='已支付' where orderid=$orderid and state='未支付' "),如果affectrows=1,執行充值,否則返回已處理。 3、定義notifylog表,orderid為unique key或者primary key,執行前,先insert,若insert成功則執行充值,否則返回已處理。 以上簡單例子用以說明冪等性常用應用實現,在SOA化系統中,可能很多原子功能都被拆分到不同的程序裡,如charge充值這個函式,可能在另一個程序中,那麼整個業務的鏈路就會更長,可能回撥成功了,但是充值失敗。同理,只要充值介面保證冪等性,對於已經回撥過但是充值結果未返回的請求,回撥接收程式,應當重複發起充值請求。更深入更復雜的應用場景,在資料一致性中再細講。
其實我回答了一種方式,是第三種,用入參中傳值是唯一的一個code,此code將對應DB表中的某個欄位,該欄位設定為unique constraint唯一性約束,面試官表示沒聽懂我說什麼。 也怪我表述不清吧,而且近幾天都在搞cassandra資料庫,cassandra一張表中某個欄位作為primary key後,該欄位partition key,然後還有Clustering Key。然後內心就去想cassandra資料庫了,思緒有點飄~ 後來我解釋了,比如一個註冊介面,20個請求同時註冊,本來註冊介面中又限制手機號/身份證號碼唯一的,但同時註冊20個會員,資料庫最終新增了20個會員。 如果將比如手機號一列作唯一性約束,那就只有一條insert成功,剩餘的19條都會失敗。
面試官聽完,又問我:如果入參中沒有一個唯一的值,要怎麼辦? 暫時沒想到好方法。 網上的solution summary: 業務層設計協議時,要求請求方定義不重複的業務流水號。應用實現時,利用資料庫樂觀鎖、插入unique key的日誌等方式保證併發時的冪等。 冪等性把關環節,在協議設計評審中,評審重要業務RPC或者http介面是否支援冪等,程式碼評審中,重點把關請求併發時,是否仍舊能夠保證冪等性。 設計人員和具體實現人員在實現過程中,也應該時刻自審冪等性的實現是否過關。

2. api介面中返回資訊是很複雜的json格式,有些順序可能有誤,有可能是一層包一層的順序錯誤,要如何檢查驗證,最好能自動化?

回頭試試jmeter能否處理,乾脆一步到位點,將json物件每一個contains做個判斷,只有完全符合,才bellshell斷言成功。

目前限於想法,能否實現再說;

更新20180620:以下隨筆中提到的json提取器或者json斷言,可以解決。主要原理,就是定位json中一層層元素,元素位置即元素層級不正確,會有定位不到的問題,也就會斷言失敗了

3. 效能測試中,如何檢視伺服器的資源情況?如果是4核或者8核,如何具體看每核的資源使用情況?

vmstat -2 每隔2秒輸出伺服器cpu/記憶體等資訊

free

top

uptime

終於明白了,是我理解有問題,有的是VM linux伺服器,有的是physical。

而cat /proc/cpuinfo出來的processerid 是指總共的core核心數。

所有一般命令,比如top ,之後敲一下1,所顯示的cpu0~cpun就是總共的核心數。

附贈一個簡單的指令碼,持續列印top 命令到home 目錄下

top -b -d 5 > ~/cpu_result
grep Cpu cpu_result | awk "{print NR,\$5,\$2,\$3,\$7,\$8}" | sed "s|\%\([a-z]\)\([a-z]\)\,||g"

統計連結數,分別在windows中和linux下

C:\Users\jasqia.AP>netstat -ano | find "10.215.70.172:443" | find "ESTABLISHED" /c
50

C:\Users\jasqia.AP>netstat -ano | find "10.215.70.172:443" | find "TIME_WAIT" /c
2233


[[email protected] apache-tomcat-7.0.42]$ netstat -ano | grep 10.201.10.13 | grep ESTABLISHED | wc -l
302
[[email protected] apache-tomcat-7.0.42]$ netstat -ano | grep 10.201.10.13 | grep TIME_WAIT | wc -l
144

如何判斷當前主機是物理機還是虛擬機器?

 windows中

C:\Users\jasqia.AP>Systeminfo | find "System Model"
System Model: OptiPlex 3020

物理機

mesg | grep -i virtual
DMI: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 09/21/2015
hpet0: at MMIO 0xfed00000 (virtual 0xffffffffff5fe000), IRQs 2, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
Vendor: VMware Model: Virtual disk Rev: 1.0

虛擬機器