⑴ 軟體測試面試題
第一題:我認為需要在測試前需要先寫好測試計劃,其中最重要的是本次測試使用的測試方法、使用的測試工具、測試環境。人員方面需要進行人員及進度的安排,每個測試階段後的輸出工件,還要有風險評估。在測試前將這些准備工作做到位,這樣在測試的時候就會比較有條理。
第二題:控制測試質量,我認為最好是做好測試用例的設計,這樣可以對測試的覆蓋率進行控制。
補充:如果時間充裕的話可以在設計用例後對其進行評審,這樣可以提高測試質量。不過這個在實際的工作當中一般實現不了。。。。
下面列出的是網上的一個軟測筆試題,好多單位在筆試的時候都會下來作為筆試題,我至少遇到兩次了,其他的筆試題還有,但不一一列出了。
一、判斷題(每題1分,12 分,正確的√,錯誤的╳)
1.軟體測試的目的是盡可能多的找出軟體的缺陷。()
2.Beta 測試是驗收測試的一種。()
3.驗收測試是由最終用戶來實施的。()
4.項目立項前測試人員不需要提交任何工件。()
5.單元測試能發現約80%的軟體缺陷。()
6.代碼評審是檢查源代碼是否達到模塊設計的要求。()
7.自底向上集成需要測試員編寫驅動程序。()
8.負載測試是驗證要檢驗的系統的能力最高能達到什麼程度。()
9.測試人員要堅持原則,缺陷未修復完堅決不予通過。()
10.代碼評審員一般由測試員擔任。() 1
11.我們可以人為的使得軟體不存在配置問題。()
12.集成測試計劃在需求分析階段末提交。()
二、不定項選擇題(每題2 分,10分)
1.軟體驗收測試的合格通過准則是:()
A. 軟體需求分析說明書中定義的所有功能已全部實現,性能指標全部達到要求。
B. 所有測試項沒有殘餘一級、二級和三級錯誤。
C. 立項審批表、需求分析文檔、設計文檔和編碼實現一致。
D. 驗收測試工件齊全。
2.軟體測試計劃評審會需要哪些人員參加?()
A.項目經理
B.SQA 負責人
C.配置負責人
D.測試組
3.下列關於alpha 測試的描述中正確的是:()
A.alpha 測試需要用戶代表參加
B.alpha 測試不需要用戶代表參加
C.alpha 測試是系統測試的一種
D.alpha 測試是驗收測試的一種
4.測試設計員的職責有:()
A.制定測試計劃
B.設計測試用例
C.設計測試過程、腳本
D.評估測試活動
5.軟體實施活動的進入准則是:()
A.需求工件已經被基線化
B.詳細設計工件已經被基線化
C.構架工件已經被基線化
D.項目階段成果已經被基線化
三、填空題(每空1分,24 分)
1.軟體驗收測試包括(正式驗收測試)、(非正式驗收測試和Alpha測試)、(Beta測試)三種類型。
2.系統測試的策略有功能測試、(性能測試)、(負載測試)、(壓力測試)、易用性測試、(容量測試)、(強度測試)、 (兼容性測試又稱)、(本地化測試)、(BVT測試)、(裸機測試)、(安全性測試)、()、(容錯性測試)、(恢復測試)、()等15 種方法。
3.設計系統測試計劃需要參考的項目文檔有(需求規格說明書)、()和迭代計劃。
4.對面向過程的系統採用的集成策略有()、()兩種。
5.通過畫因果圖來寫測試用例的步驟為、、、及把因果圖轉 換為狀態圖共五個步驟。
四、簡答題(共37分)
1. 階段評審與同行評審的區別。(4 分)
2 . 什麼是軟體測試。(3 分)
答:通過人工或自動化手段對系統進行測試,目的是為了驗證系統是否滿足預定功能或者是為了弄清楚實際結果與預期結果之間的差別。
3 . 簡述集成測試的過程。(5 分)
答:將通過單元測試的單元模塊按照設計要求組合起來再進行測試。重點檢查程序介面處是否有問題。
過程:首先進行集成測試的測試計劃測試設計測試開發測試用例執行測試評估,並且進行全程的缺陷跟蹤。
4 . 怎樣做好文檔測試?(4 分)
答:文檔測試要注意一下幾點:文檔的讀者群、文檔的術語、文檔的正確性、文檔的完整性、文檔的一致性、文檔的易用性、樣例與示例、文檔的語言
5. 白盒測試有那幾種方法?(6 分)
答:白盒測試方法分為:靜態測試和動態測試
靜態測試方法:①編碼標准與准則 ②走查 ③審查 ④評審
動態測試方法:①語句覆蓋 ②判定覆蓋 ③條件覆蓋 ④判定-條件覆蓋 ⑤條件組合覆蓋 ⑥路徑覆蓋
⑦條件組合+路徑覆蓋
6. 系統測試計劃是否需要同行評審,為什麼?(4 分)
答:系統測試計劃需要進行同行評審,因為如果對一個系統長時間進行測試可能會出現測試疲勞甚至出現
對系統的免疫現象,因此可以進行同行評審,減少對相同系統的疲勞測試。
7. Alpha 測試與beta 測試的區別。(4 分)
8 . 比較負載測試、容量測試和強度測試的區別。(6 分)
9 . 測試結束的標準是什麼?(3 分)
⑵ python後端開發工程師面試
第一步:自我介紹
第二步:公司介紹
第三步:技術基礎
第四步:項目介紹
第五步:待遇
自我介紹,簡單直接,姓名,籍貫,大學,工作經歷
示例如下:
你好,面試官,我叫XX,來自XX,本科畢業於XX,主修XX專業,有X年工作經驗,在上一家公司擔任python後端開發工程師的職位。
公司名稱是XX、公司主要做外包軟體、都有軟體定製/商城定製、前端2個後端2個運維1個
主要是根據你簡歷中填寫的技術,根據我的簡歷中所寫的,總結幾點如下:
字典的查詢流程:
不可變對象可哈希, str , fronzenset , tuple ,自己實現的類,要重載 __hash__ 方法。
dict內存花銷大,但是查詢速度快,自定義的對象或者python內部的對象都是dict包裝的。
dict的存儲順序和元素添加順序有關,添加順序可能改變已有數據的順序。
集合:是一個可以存放任意數據類型的可變無序的映射集合。
set和dict類似,set的核心也是散列表,但是表元只包含值的引用。 由於散列表的特性,set的元素不能重復,且無序。 內部由哈希實現,查找的時間復雜度為O(1),所以性能很高,實現了魔法函數 __contains__ 可以使用in來查找。 set的去重是通過兩個函數 __hash__ 和 __eq__ 實現的。
(1)淺拷貝
定義:淺拷貝只是對另外一個變數的內存地址的拷貝,這兩個變數指向同一個內存地址的變數值。
淺拷貝的特點:
(2)深拷貝:
定義:一個變數對另外一個變數的值拷貝。
深拷貝的特點:
Python GC主要使用引用計數(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,通過「標記-清除」(mark and sweep)解決容器對象可能產生的循環引用問題,通過「分代回收」(generation collectio n)以空間換時間的方法提高垃圾回收效率。
GIL全稱 Global Interpreter Lock ,中文解釋為全局解釋器鎖。它並不是Python的特性,而是在實現python的主流Cpython解釋器時所引入的一個概念,GIL本質上就是一把互斥鎖,將並發運行變成串列,以此來控制同一時間內共享數據只能被一個任務所修改,從而保證數據的安全性。
GIL保護的是解釋器級別的數據,但是用戶自己的數據需要自己加鎖處理。
既然有了GIL的存在,一個進程中同一時刻只有一個線程能夠被執行,無法利用cpu的多核機制,導致多線程用於I/O密集型,多進程用於計算密集型,如金融分析等。
死鎖:兩個或兩個以上的進程或者線程在執行過程中,因為爭奪資源而造成的互相等待現象,若無外力的作用,都將一直處於阻塞狀態,這些互相等待的進程或者線程就被稱為死鎖。
解決方法,使用遞歸鎖(RLock)
這個RLock內部有一個Lock和一個counter變數,counter記錄著acquire的次數,從而使得資源可以被多次require。直到一個線程所有的acquire都被release,其他的線程才能獲得資源。上面的例子如果使用RLock代替Lock,則不會發生死鎖
可以直接認為是linux,畢竟搞後端的多數是和linux打交道。
那麼如何避免粘包問題呢? 歸根結底就是一句話, 明確兩個包之間的邊界.
UDP不存在粘包問題,是由於UDP發送的時候,沒有經過Negal演算法優化,不會將多個小包合並一次發送出去。另外,在UDP協議的接收端,採用了鏈式結構來記錄每一個到達的UDP包,這樣接收端應用程序一次recv只能從socket接收緩沖區中讀出一個數據包。也就是說,發送端send了幾次,接收端必須recv幾次(無論recv時指定了多大的緩沖區)。
存儲可能包含rdbms,nosql以及緩存等,我以mysql,redis舉例**
⑶ BAT面試題28:Python是如何進行內存管理的
Python的內存管理,一般從以下三個方面來說:
1)對象的引用計數機制(四增五減)
2)垃圾回收機制(手動自動,分代回收)
3)內存池機制(大m小p)
1)對象的引用計數機制
要保持追蹤內存中的對象,Python使用了引用計數這一簡單的技術。sys.getrefcount(a)可以查看a對象的引用計數,但是比正常計數大1,因為調用函數的時候傳入a,這會讓a的引用計數+1
2)垃圾回收機制
吃太多,總會變胖,Python也是這樣。當Python中的對象越來越多,它們將占據越來越大的內存。不過你不用太擔心Python的體形,它會在適當的時候「減肥」,啟動垃圾回收(garbage
collection),將沒用的對象清除
從基本原理上,當Python的某個對象的引用計數降為0時,說明沒有任何引用指向該對象,該對象就成為要被回收的垃圾了
比如某個新建對象,它被分配給某個引用,對象的引用計數變為1。如果引用被刪除,對象的引用計數為0,那麼該對象就可以被垃圾回收。
然而,減肥是個昂貴而費力的事情。垃圾回收時,Python不能進行其它的任務。頻繁的垃圾回收將大大降低Python的工作效率。如果內存中的對象不多,就沒有必要總啟動垃圾回收。
所以,Python只會在特定條件下,自動啟動垃圾回收。當Python運行時,會記錄其中分配對象(object
allocation)和取消分配對象(object deallocation)的次數。當兩者的差值高於某個閾值時,垃圾回收才會啟動。
我們可以通過gc模塊的get_threshold()方法,查看該閾值。
3)內存池機制
Python中有分為大內存和小內存:(256K為界限分大小內存)
1、大內存使用malloc進行分配
2、小內存使用內存池進行分配
python中的內存管理機制都有兩套實現,一套是針對小對象,就是大小小於256K時,pymalloc會在內存池中申請內存空間;當大於256K時,則會直接執行系統的malloc的行為來申請內存空間。
⑷ 面試題:你為什麼選擇python
為什麼Python比MATLAB、R語言好呢?
其實,這三種語言都很多數據分析師在用,但更推薦python,主要是有以下幾點:
1、python易學、易讀、易維護,處理速度也比R語言要快,無需把資料庫切割;
2、python勢頭猛,眾多大公司需要,市場前景廣闊;而MATLAB語言比較局限,專注於工程和科學計算方面,而且MATLAB價格貴,免費版或盜版都只能玩玩學慣用;
3、python具有豐富的擴展庫,這個是其他兩個不能比的;
python版本選擇
初學者版本選擇是很多人都會問的,我們也不會偏向某個版本,主要根據自己的所需,但建議是選擇最新版本Python3.x,這樣很多新功能和舊功能都會有的,但是目前很多第三方庫仍然不支持Python3,因為Python2.x已經停止繼續開發,不意味著不能使用。
⑸ Python面試題,線程與進程的區別,Python中如何創建多線程
進程和線程這兩個概念屬於操作系統,我們經常聽說,但是可能很少有人會細究它們的含義。對於工程師而言,兩者的定義和區別還是很有必要了解清楚的。
首先說進程,進程可以看成是 CPU執行的具體的任務 。在操作系統當中,由於CPU的運行速度非常快,要比計算機當中的其他設備要快得多。比如內存、磁碟等等,所以如果CPU一次只執行一個任務,那麼會導致CPU大量時間在等待這些設備,這樣操作效率很低。為了提升計算機的運行效率,把機器的技能盡可能壓榨出來,CPU是輪詢工作的。也就是說 它一次只執行一個任務,執行一小段碎片時間之後立即切換 ,去執行其他任務。
所以在早期的單核機器的時候,看起來電腦也是並發工作的。我們可以一邊聽歌一邊上網,也不會覺得卡頓。但實際上,這是CPU輪詢的結果。在這個例子當中,聽歌的軟體和上網的軟體對於CPU而言都是 獨立的進程 。我們可以把進程簡單地理解成運行的應用,比如在安卓手機裡面,一個app啟動的時候就會對應系統中的一個進程。當然這種說法不完全准確, 一個應用也是可以啟動多個進程的 。
進程是對應CPU而言的,線程則更多針對的是程序。即使是CPU在執行當前進程的時候,程序運行的任務其實也是有分工的。舉個例子,比如聽歌軟體當中,我們需要顯示歌詞的字幕,需要播放聲音,需要監聽用戶的行為,比如是否發生了切歌、調節音量等等。所以,我們需要 進一步拆分CPU的工作 ,讓它在執行當前進程的時候,繼續通過輪詢的方式來同時做多件事情。
進程中的任務就是線程,所以從這點上來說, 進程和線程是包含關系 。一個進程當中可以包含多個線程,對於CPU而言,不能直接執行線程,一個線程一定屬於一個進程。所以我們知道,CPU進程切換切換的是執行的應用程序或者是軟體,而進程內部的線程切換,切換的是軟體當中具體的執行任務。
關於進程和線程有一個經典的模型可以說明它們之間的關系,假設CPU是一家工廠,工廠當中有多個車間。不同的車間對應不同的生產任務,有的車間生產汽車輪胎,有的車間生產汽車骨架。但是工廠的電力是有限的,同時只能滿足一個廠房的使用。
為了讓大家的進度協調,所以工廠需要輪流提供各個車間的供電。 這里的車間對應的就是進程 。
一個車間雖然只生產一種產品,但是其中的工序卻不止一個。一個車間可能會有好幾條流水線,具體的生產任務其實是流水線完成的,每一條流水線對應一個具體執行的任務。但是同樣的, 車間同一時刻也只能執行一條流水線 ,所以我們需要車間在這些流水線之間切換供電,讓各個流水線生產進度統一。
這里車間里的 流水線自然對應的就是線程的概念 ,這個模型很好地詮釋了CPU、進程和線程之間的關系。實際的原理也的確如此,不過CPU中的情況要比現實中的車間復雜得多。因為對於進程和CPU來說,它們面臨的局面都是實時變化的。車間當中的流水線是x個,下一刻可能就成了y個。
了解完了線程和進程的概念之後,對於理解電腦的配置也有幫助。比如我們買電腦,經常會碰到一個術語,就是這個電腦的CPU是某某核某某線程的。比如我當年買的第一台筆記本是4核8線程的,這其實是在說這台電腦的CPU有 4個計算核心 ,但是使用了超線程技術,使得可以把一個物理核心模擬成兩個邏輯核心。相當於我們可以用4個核心同時執行8個線程,相當於8個核心同時執行,但其實有4個核心是模擬出來的虛擬核心。
有一個問題是 為什麼是4核8線程而不是4核8進程呢 ?因為CPU並不會直接執行進程,而是執行的是進程當中的某一個線程。就好像車間並不能直接生產零件,只有流水線才能生產零件。車間負責的更多是資源的調配,所以教科書里有一句非常經典的話來詮釋: 進程是資源分配的最小單元,線程是CPU調度的最小單元 。
啟動線程Python當中為我們提供了完善的threading庫,通過它,我們可以非常方便地創建線程來執行多線程。
首先,我們引入threading中的Thread,這是一個線程的類,我們可以通過創建一個線程的實例來執行多線程。
from threading import Thread t = Thread(target=func, name='therad', args=(x, y)) t.start()簡單解釋一下它的用法,我們傳入了三個參數,分別是 target,name和args ,從名字上我們就可以猜測出它們的含義。首先是target,它傳入的是一個方法,也就是我們希望多線程執行的方法。name是我們為這個新創建的線程起的名字,這個參數可以省略,如果省略的話,系統會為它起一個系統名。當我們執行Python的時候啟動的線程名叫MainThread,通過線程的名字我們可以做區分。args是會傳遞給target這個函數的參數。
我們來舉個經典的例子:
import time, threading # 新線程執行的代碼: def loop(n): print('thread %s is running...' % threading.current_thread().name) for i in range(n): print('thread %s >>> %s' % (threading.current_thread().name, i)) time.sleep(5) print('thread %s ended.' % threading.current_thread().name) print('thread %s is running...' % threading.current_thread().name) t = threading.Thread(target=loop, name='LoopThread', args=(10, )) t.start() print('thread %s ended.' % threading.current_thread().name)我們創建了一個非常簡單的loop函數,用來執行一個循環來列印數字,我們每次列印一個數字之後這個線程會睡眠5秒鍾,所以我們看到的結果應該是每過5秒鍾屏幕上多出一行數字。
我們在Jupyter里執行一下:
表面上看這個結果沒毛病,但是其實有一個問題,什麼問題呢? 輸出的順序不太對 ,為什麼我們在列印了第一個數字0之後,主線程就結束了呢?另外一個問題是,既然主線程已經結束了, 為什麼Python進程沒有結束 , 還在向外列印結果呢?
因為線程之間是獨立的,對於主線程而言,它在執行了t.start()之後,並 不會停留,而是會一直往下執行一直到結束 。如果我們不希望主線程在這個時候結束,而是阻塞等待子線程運行結束之後再繼續運行,我們可以在代碼當中加上t.join()這一行來實現這點。
t.start() t.join() print('thread %s ended.' % threading.current_thread().name)join操作可以讓主線程在join處掛起等待,直到子線程執行結束之後,再繼續往下執行。我們加上了join之後的運行結果是這樣的:
這個就是我們預期的樣子了,等待子線程執行結束之後再繼續。
我們再來看第二個問題,為什麼主線程結束的時候,子線程還在繼續運行,Python進程沒有退出呢?這是因為默認情況下我們創建的都是用戶級線程,對於進程而言, 會等待所有用戶級線程執行結束之後才退出 。這里就有了一個問題,那假如我們創建了一個線程嘗試從一個介面當中獲取數據,由於介面一直沒有返回,當前進程豈不是會永遠等待下去?
這顯然是不合理的,所以為了解決這個問題,我們可以把創建出來的線程設置成 守護線程 。
守護線程守護線程即daemon線程,它的英文直譯其實是後台駐留程序,所以我們也可以理解成 後台線程 ,這樣更方便理解。daemon線程和用戶線程級別不同,進程不會主動等待daemon線程的執行, 當所有用戶級線程執行結束之後即會退出。進程退出時會kill掉所有守護線程 。
我們傳入daemon=True參數來將創建出來的線程設置成後台線程:
t = threading.Thread(target=loop, name='LoopThread', args=(10, ), daemon=True)這樣我們再執行看到的結果就是這樣了:
這里有一點需要注意,如果你 在jupyter當中運行是看不到這樣的結果的 。因為jupyter自身是一個進程,對於jupyter當中的cell而言,它一直是有用戶級線程存活的,所以進程不會退出。所以想要看到這樣的效果,只能通過命令行執行Python文件。
如果我們想要等待這個子線程結束,就必須通過join方法。另外,為了預防子線程鎖死一直無法退出的情況, 我們還可以 在joih當中設置timeout ,即最長等待時間,當等待時間到達之後,將不再等待。
比如我在join當中設置的timeout等於5時,屏幕上就只會輸出5個數字。
另外,如果沒有設置成後台線程的話,設置timeout雖然也有用,但是 進程仍然會等待所有子線程結束 。所以屏幕上的輸出結果會是這樣的:
雖然主線程繼續往下執行並且結束了,但是子線程仍然一直運行,直到子線程也運行結束。
關於join設置timeout這里有一個坑,如果我們只有一個線程要等待還好,如果有多個線程,我們用一個循環將它們設置等待的話。那麼 主線程一共會等待N * timeout的時間 ,這里的N是線程的數量。因為每個線程計算是否超時的開始時間是上一個線程超時結束的時間,它會等待所有線程都超時,才會一起終止它們。
比如我這樣創建3個線程:
ths = [] for i in range(3): t = threading.Thread(target=loop, name='LoopThread' + str(i), args=(10, ), daemon=True) ths.append(t) for t in ths: t.start() for t in ths: t.join(2)最後屏幕上輸出的結果是這樣的:
所有線程都存活了6秒。
總結在今天的文章當中,我們一起簡單了解了 操作系統當中線程和進程的概念 ,以及Python當中如何創建一個線程,以及關於創建線程之後的相關使用。
多線程在許多語言當中都是至關重要的,許多場景下必定會使用到多線程。比如 web後端,比如爬蟲,再比如游戲開發 以及其他所有需要涉及開發ui界面的領域。因為凡是涉及到ui,必然會需要一個線程單獨渲染頁面,另外的線程負責准備數據和執行邏輯。因此,多線程是專業程序員繞不開的一個話題,也是一定要掌握的內容之一。
⑹ 軟體測試面試題:WEB+網路|介面測試|性能測試|自動化測試
1. http代碼表,常考題目
404:找不到資源
500:伺服器內部錯誤,無法完成請求。
501:伺服器不支持請求的功能,無法完成請求。
502:充當網關或代理的伺服器,從遠端伺服器接收到了一個無效的請求。
301:永久移動。請求的資源已被永久的移動到新URI,返回信息會包括新的URI,瀏覽器會自動定向到新URI,今後任何新的請求都應使用新的URI代替。
302:臨時移動。與301類似。但資源只是臨時被移動,客戶端應繼續使用原有URI。
200:成功。
2. TCP/IP四層網路模型
鏈路層、網路層、傳輸層、應用層。
3. TCP/UDP區別?
TCP: 可靠傳輸協議,需要三次握手連接,有確認重傳機制,特點是可靠、准確、有擁塞控制,缺點就是比較慢,傳輸量比較小,適用於升級、下載;一句話:TCP是可靠的傳輸。
UDP: 不可靠傳輸協議,面向非連接的協議,優點是傳輸量大、速度快,缺點是已丟失、沒有擁塞控制,適用於直播、視頻等。一句話:UDP是不可靠的傳輸。
4. html css js運行的先後順序是什麼?
界面載入的時候先載入html在載入css最後載入js
5. session和cookie的區別是什麼
1. session存放在伺服器端用來校驗客戶端的身份
2. cookie存放在客戶端,每次從客戶端往伺服器發請求時,將cookie帶到伺服器端,用來校驗客戶端的身份
1. 怎麼用JMeter測試介面?
如果使用JMeter進行介面測試:
1) 測試前了解需求,根據介面規格說明書梳理業務;
2) 接下來設計用例,分析介面的入參和出參,分清楚有哪些有效輸入和無效輸入,設計用例(原則:用最少的用例覆蓋所有有效輸入,針對每一個無效的輸入設計一個測試用例,如果有錯誤碼沒有覆蓋到,還要對每個未覆蓋的錯誤碼分別設計一個用例);
3) 准備測試數據,比如:測試所需的賬號、密碼、key 等信息;
4) 打開JMeter,創建一個線程組,根據介面類型,填寫好對應的介面地址和請求方式等;
5) 參數化配置,添加配置元件CSV Data Set Config,定義變數,並准備CSV格式的數據,變數的引用用${變數名}的格式;
6) 添加斷言來判斷測試結果的正確性,用得最多的是響應斷言;
7) 添加監聽器,比如查看結果樹,對測試結果進行監聽;
8) 運行測試用例;
9) 查看監聽器結果,來判斷用例的執行是成功還是失敗,針對失敗的用例,分析其失敗原因;
10) 針對測試中發現的問題,給開發提單,直到問題最終解決。
11) 最後輸出測試報告。
2. 怎麼用Postman測試介面?
如果使用Postman測試介面:
其中1,2,3點相同,工具使用方面則比JMeter跟簡單,工具的主要的步驟是添加對應的請求、填寫主機URL及入參、添加測試套、運行測試套、分析結果出報告。
3. 在JMeter上如何把上一個請求的結果作為下一個請求的參數?
使用正則表達式提取器提取上一個請求的響應中的信息,保存一個引用名稱比如abc,在下一個請求的參數中,用${abc}的格式來引用提取的結果。
常用的正則表達式格式:(.+?),其中.表示匹配任意字元串,+表示只匹配一次,?表示匹配到就停下來。
一般是我們功能測試完成最後兩三天時間測試性能。
1、先是分析需求計算出並發數,TPS,響應時間和 CPU,內存,硬碟和網路IO這些指標。
2、制定測試方案,主要包括環境,計劃和具體測試那些場景(如可靠性,並發,負載,壓力測試等)
3、根據場景用Badboy錄制腳本,導出為JMeter工具支持的腳本。
4、用JMeter工具打開腳本,進行腳本調試,加一些斷言,監聽器,參數化等。
5、接下來執行性能測試,然後主要收集監聽器和收集伺服器CPU,內存,硬碟和網路IO等分析是否滿足需求,如果滿足就輸出性能測試報告。
6、如果指標不能滿足,反饋給開發進行調優。調優後繼續測試,一直到滿足需求後最終輸出測試報告。
1. Python怎麼定義一個函數?
你可以定義一個由自己想要功能的函數,以下是簡單的規則:
1) 函數代碼塊以def關鍵詞開頭,後接函數標識符名稱和圓括弧()。
2) 任何傳入參數和自變數必須放在圓括弧中間。圓括弧之間可以用於定義參數。
3) 函數的第一行語句可以選擇性地使用文檔字元串—用於存放函數說明。
4) 函數內容以冒號起始,並且縮進
5) return[表達式]結束函數,選擇性地返回一個值給調用方。不帶表達式的return相當於返回None
2 Python切片
3. Python上用過什麼庫/模塊?
webdriver:定位和操作元素
time:設置等待時間
ActionChains:動作鏈,完成滑鼠的相關操作
Keys:鍵盤的相關操作
WebDriverWait:設置顯式等待
Expect_Conditions:針對單個元素,設置顯式等待的場景
PIL:截圖
Select:下拉選擇框的操作
unittest python:自帶的單元測試框架
HTMLTestRunner:運行腳本,生成報告
ddt:實現數據驅動測試,行為和數據分離
4. 你做過自動化測試嗎?
我在上一份工作中,公司去年下半年也開始規劃做Web 自動化,採用Python作為開發語言,通過Selenium WebDriver定位和操作頁面元素,自動化框架用的是unittest。我主要負責寫測試腳本。
假設一個測試團隊有5個人:1資深(測試經理)+2~3個中級(自動化+手動)+1 個初級(手動)
5. 使用什麼工具進行的自動化測試
使用的工具是Selenium(Web自動化工具)
6. 用的什麼編程語言
用的Python
7. Selenium 用的是哪個版本的的?Python用的是哪個版本的?
用的是selenium 3.11.0和Python2.7.10
8. Selenium的工作原理?
1)對html元素定位
2)模擬對第一步定位到的元素進行點擊、輸入、選擇等操作一句話:定位元素,操作元素。
9. 元素定位方法有哪些?
要點:8種定位方法
1) 根據元素的屬性值定位,比如 id、name、class、標簽名、鏈接文字和部分鏈接文字;
2) 根據CSS選擇器定位;
3) 根據 XPath 定位;
10. 子頁面里的元素怎麼定位?
先切換到框架里,然後再定位,用switch_to_frame函數根據子頁面id或name,切換到子頁面;定位完了如果要再定位主頁面的元素,要用switch_to_default_content 函數先返回主頁面。
11. 怎麼定位alert彈窗?或者這樣問:怎麼處理JS原生窗口?
要點:主要涉及點擊彈窗確認按鈕、強行關閉彈窗、獲取彈窗中的文字等操作。
1) 點擊彈窗的確定按鈕,用如下函數:
driver.switch_to_alert().accept()
2) 強行關閉,點擊右上角的叉叉,用如下函數:
driver.switch_to_alert().dismiss()
3) 獲取彈窗里的文字,用如下函數:
driver.switch_to_alert().text
12. 怎麼運行自動化用例並生成測試報告?
以unittest為例,我通常的做法是把用例載入到測試套中,做成一個腳本,在命令窗口下運行腳本,報告的生成用第三方模塊HTML TestRunner來生成。
13. 怎麼定位/操作圖片中的驗證碼?
用tesseract OCR引擎處理圖片中的驗證碼,步驟:
(1)對整個屏幕截屏,保存成png格式的圖片;
(2)在截取的圖片中定位驗證碼圖片的位置坐標;
(3)根據坐標對驗證碼截圖;
(4)在圖片中提取驗證碼,輸入到輸入框。