python自動化測試面試題整理

1、類的定義:

一般,使用 class 語句來創(chuàng)建一個新類,class之后為類的名稱(通常首字母大寫)并以冒號結(jié)尾。

類的專有方法:

init?構造函數(shù),在生成對象時調(diào)用、del?析構函數(shù),釋放對象時使用、repr?打印,轉(zhuǎn)換

2、構造函數(shù)的定義:

__init__構造函數(shù),在Python中,子類如果定義了構造函數(shù),而沒有調(diào)用父類的,那么Python不會自動調(diào)用,也就是說父類的構造函數(shù)不會執(zhí)行。#構造函數(shù),類接收外部傳入?yún)?shù)全靠構造函數(shù)

3、函數(shù)的定義:

函數(shù)就是一段代碼的集合,并且可以被重復調(diào)用,也可以理解為處理事務的方法。def開頭、函數(shù)名可以由數(shù)字、字母或者下劃線組合而成,但不能以數(shù)字開頭。

4、數(shù)據(jù)結(jié)構的定義:

是將數(shù)據(jù)按照某種邏輯存儲起來。

5、python的標準數(shù)據(jù)類型有哪六個:

不可變數(shù)據(jù)(3個):Number(數(shù)字)、String(字符串)、Tuple(元組)

Number(數(shù)字)支持的類型:int(整型)、float(浮點類型)、complex(復數(shù))

可變數(shù)據(jù)(3個):List(列表)、Dic(字典)、Set(集合)

6、元組、列表、字典的定義:

元組可以由不同的元素組成 ,所有元素通過圓括號()包含起來,并通過逗號隔開。

列表都是一組元素的集合,用方括號[ ],列表可以增刪改的,元組是不可以的。

字典由一系列的鍵--值成對組成,并通過大括號{ }包含起來,用逗號隔開。

字典的讀?。菏峭ㄟ^鍵來作為索引的沒有先后順序之分,列表和元組是通過數(shù)字作為索引有先后順序。

7、Pyton的高階函數(shù)有哪些?分別都有什么作用?

高階函數(shù)就是一個(內(nèi)置)函數(shù)可以用來接收另一個函數(shù)作為參數(shù),這樣的函數(shù)叫做高階函數(shù)。

變量可以指向函數(shù),既然變量可以指向函數(shù),而我們知道函數(shù)的參數(shù)可以接收變量。也就是說一個函數(shù)可以接收另一個函數(shù)作為參數(shù)。如下示例:

def add_number(a, b, func_abs):

# 在本例中,等同于執(zhí)行的是 return abs(a) + abs(b)

? ? return func_abs(a) + func_abs(b)

result = add_number(-10, -20, abs)

print(result)# 輸出內(nèi)容:# 30

python中內(nèi)建(builtins)的高階函數(shù)主要有:

①map()

它接收一個函數(shù)function 和一個 list,并通過把函數(shù) function 依次作用在 list 的每個元素上,得到一個新的 list 并返回。

def format_name(s):

? ? return s.capitalize()

result = map(format_name, ['adam', 'LISA', 'barT'])

print(list(result))

# 輸出內(nèi)容:# ['Adam', 'Lisa', 'Bart']

②filter()

filter()接收一個函數(shù)function 和一個list,這個function 的作用是對list的每個元素進行判斷,返回True或False,filter()根據(jù)判斷結(jié)果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。

def is_contain_s(s):

? ? if 'E' in s:

? ? ? ? return True

? ? else:

? ? ? ? return False

result = filter(is_contain_s, ['sTEst', 'abc', 'str', ' ', 'END'])

print(list(result))

# 輸出內(nèi)容:# ['sTEst', 'END']

③sorted()

reduce()函數(shù)也接收一個函數(shù)function, 和一個list。但reduce()傳入的函數(shù)必須接收兩個參數(shù),reduce()對list的每個元素反復調(diào)用函數(shù)function, 并返回最終結(jié)果值。

from functools import reduce

def f(x, y):

return x + y

result = reduce(f, [1, 3, 5, 7, 9])

print(result) # 輸出內(nèi)容: # 25

8、簡單說說生成器、迭代器、裝飾器是什么?都有哪些作用?

1、迭代器:

迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退迭代器的一大優(yōu)點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀。這個特點使得它特別適合用于遍歷一些巨大的或是無限的集合。

特點:(迭代是訪問集合元素的一種方式。迭代器是一個可以記住遍歷位置的對象。迭代器只能往前不能后退。)

1.訪問者不需要關心迭代器內(nèi)部的結(jié)構,僅需通過next()方法不斷去取下一個內(nèi)容

2.不能隨機訪問集合中的某個值 ,只能從頭到尾依次訪問

3.訪問到一半時不能往回退

4.便于循環(huán)比較大的數(shù)據(jù)集合,節(jié)省內(nèi)存 可被next()函數(shù)調(diào)用并不斷返回下一個值(直到?jīng)]有數(shù)據(jù)時拋出 StopIteration錯誤)的對象稱為迭代器(Iterator)。

5.任何對象,如果它實現(xiàn)了next方法和iter方法,就是迭代器。

例:a = iter([1,2,3,4,5]) print(a) #結(jié)果:<list_iterator object at 0x0044ADFO> print(a.__next__()) #結(jié)果:1 print(a.__next__()) #結(jié)果:2

2.生成器(generator):

一個函數(shù)調(diào)用時返回一個迭代器,那這個函數(shù)就叫生成器(generator),如果函數(shù)中包含yield語法,則這個函數(shù)變成生成器。一邊循環(huán)一邊計算的機制,稱為生成器。

3.裝飾器:

是一個返回函數(shù)的高階函數(shù)。

裝飾器其實就是一個閉包,把一個函數(shù)當作參數(shù)然后返回一個替代版函數(shù)。

裝飾器有2個特性:

1、可以把被裝飾的函數(shù)替換成其他函數(shù)

2、可以在加載模塊時候立即執(zhí)行

12、Python中,如何將字符串轉(zhuǎn)化為整型?

①將字符串數(shù)組 轉(zhuǎn)化為 整型數(shù)組

>>> arr = ['22','44','66','88']

>>> arr = list(map(int,arr))

>>> print(arr)

②數(shù)字字符串初始化int類,就可以將整數(shù)字符串(str)轉(zhuǎn)換成整數(shù)(int):int(“112321”)

③相反用整數(shù)初始化str類,就可以將整數(shù)(int)轉(zhuǎn)換為對應的字符串(str):string(123213)

④如果字符串是浮點數(shù),可以用字符串初始化float類,把浮點數(shù)字符串(str)轉(zhuǎn)換成浮點數(shù)(float):float(“12.23”)

9、TCP三次握手和四次揮手,請分別直接寫出來?

三次握手:

瀏覽器向服務器發(fā)起 tcp 連接,與瀏覽器建立 tcp 三次握手。

SYN是同步序列編號,是TCP/IP建立連接時使用的握手信號。

第一次握手:客戶機首先發(fā)出一個SYN(syn=j)消息到服務器,(并進入SYN_SENT)狀態(tài),等待服務器確認。

第二次握手:服務器收到SYN消息,必須確認客戶的SYN(ack=j+1),同時發(fā)送一個SYN+ack應答表示接受到了此消息。(服務器進入到了SVN_RECV狀態(tài))

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器端發(fā)送確認消息ACK(ack=k+1),發(fā)送完畢之后,客戶端和服務器進入TCP連接成功狀態(tài)。完成三次握手。

四次揮手:

第一次揮手:客戶端向服務器端發(fā)送一個FIN,請求關閉數(shù)據(jù)傳輸

第二次揮手:服務器接收到客戶端的FIN,向客戶端發(fā)送一個ACK,其中ack的值等于FIN+SEQ

第三次揮手:服務器向客戶端發(fā)送一個FIN,告訴客戶端應用程序關閉

第四次揮手:客戶端收到服務器端的FIN,回復一個ACK給服務器端。其中ack的值等于FIN+SEQ

TCP 三次握手和四次揮手簡易版:

客戶端向服務端發(fā)送一個請求, syn -----服務端返回一個 應答 ack+syn? -----客戶端收到后返回一個確認 ack

客戶端向服務器發(fā)送一個關閉連接請求 fin? m----服務端應答返回ack m+1---服務端返回一個fin n ----客戶端收到后發(fā)一個確認---ack n+1

10、HTTP常見的狀態(tài)碼有哪些?都是什么含義?

? 200 請求已成功,請求所希望的響應頭或數(shù)據(jù)體將隨此響應返回。

? 201 請求已經(jīng)被實現(xiàn),而且有一個新的資源已經(jīng)依據(jù)請求的需要而建立, 且其 URI 已經(jīng)隨 Location 頭信息返回

? 202 服務器已接受請求,但尚未處理

? 301 (永久移動) 請求的網(wǎng)頁已永久移動到新位置。 服務器返回此響應 (對 GET 或 HEAD 請求的響應)時,會自動將請求者轉(zhuǎn)到新位置。

? 302 (臨時移動) 服務器目前從不同位置的網(wǎng)頁響應請求,但請求者應繼續(xù)使用原有位置來進行以后的請求。

? 303 (查看其他位置) 請求者應當對不同的位置使用單獨的 GET 請求來檢索響應時,服務器返回此代碼。

? 304 (未修改) 自從上次請求后,請求的網(wǎng)頁未修改過。 服務器返回此響應時,不會返回網(wǎng)頁內(nèi)容。

? 305 (使用代理) 請求者只能使用代理訪問請求的網(wǎng)頁。 如果服務器返回此響應,還表示請求者應使用代理。

? 307 (臨時重定向) 服務器目前從不同位置的網(wǎng)頁響應請求,但請求者應繼續(xù)使用原有位置來進行以后的請求。

? 401 當前請求需要用戶驗證。如果當前請求已經(jīng)包含了 Authorization證書,那么 401 響應代表著服務器驗證已經(jīng)拒絕了那些證書

? 403 服務器已經(jīng)理解請求,但是拒絕執(zhí)行它。與 401 響應不同的是,身份驗證并不能提供任何幫助,而且這個請求也不應該被重復提交

? 404 請求失敗,請求所希望得到的資源未被在服務器上發(fā)現(xiàn)

? 500 服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在服務器的程序碼出錯時出現(xiàn)。

? 501 服務器不支持當前請求所需要的某個功能。當服務器無法識別請求的方法,并且無法支持其對任何資源的請求。

? 502 作為網(wǎng)關或者代理工作的服務器嘗試執(zhí)行請求時,從上游服務器接收到無效的響應。

? 503 由于臨時的服務器維護或者過載,服務器當前無法處理請求。這個狀況是臨時的,并且將在一段時間以后恢復。

200 - 請求成功301 - 資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其它URL404 - 請求的資源(網(wǎng)頁等)不存在500 - 內(nèi)部服務器錯誤

11、webdriver的核心原理是什么?

1.Webdriver啟動瀏覽器

2.Webdriver將瀏覽器綁定到特定的端口,綁定完成后該瀏覽器實例便作為webdriver的remote server存在;

3.客戶端(也就是測試腳本)創(chuàng)建1個session,在該session中通過http請求向remote server發(fā)送restful的請求,remote server解析請求,完成相應操作并返回response給瀏覽器

4.客戶端接受response,并分析其返回值以決定是轉(zhuǎn)到第3步還是結(jié)束腳本;

1.測試人員運行腳本,由于客戶端腳本(java, python, ruby)不能直接與瀏覽器通信,這時候webdriver啟動了一個remote-WebService當做一個翻譯器,

它可以把客戶端代碼翻譯成瀏覽器可以識別的代碼(比如js)。webdriver 通過瀏覽器監(jiān)聽這個端口。

2.客戶端(也就是測試腳本)創(chuàng)建1個session,

在該session中通過http請求向WebService發(fā)送restful的請求,WebService翻譯成瀏覽器懂得腳本傳給瀏覽器,

3.瀏覽器把執(zhí)行的結(jié)果返回給WebService,WebService把返回的結(jié)果做了一些封裝(一般都是json格式),

然后返回給client,根據(jù)返回值就能判斷對瀏覽器的操作是不是執(zhí)行成功

總結(jié): webdriver就是基于Http 協(xié)議來進行底層的客戶端與服務端通信的。

12、Appium是什么?主要用來做什么的?它的核心原理是什么?

1》Appium是一個開源、跨平臺的,適用于原生或混合移動應用(hybrid mobile apps)的自動化測試平臺。Appium使用WebDriver(JSON wire protocol)驅(qū)動安卓和iOS移動應用.

2》核心原理:

appium則是基于WebDriver協(xié)議,并通過 post 發(fā)送一個 json 告知服務端相關測試信息,利用Bootstrap.jar的java文件集成包,最后通過調(diào)用輸入UiAutomator的命令,從而實現(xiàn)App的自動化測試。

13、selenium常見的元素定位方法有哪些?

Id、By.ID、name、classname、tag、xpath、css、link_text等

14、直接手寫一個冒泡排序 和 快速排序,時間復雜度是多少,空間復雜度是多少,是否穩(wěn)定?

冒泡排序:穩(wěn)定

def?bubble_sort(li):

????for?i?in?range(len(li)):

????????for?j?in?range(len(li)-i-1):

????????????if?li[j]?>?li[j+1]:

????????????????li[j],li[j+1]?=?li[j+1],li[j]

????print(li)

a?=?bubble_sort([50,23,45,16,7,38])

快速排序:不穩(wěn)定

def partition(arr,low,high):

? ? i = ( low-1 )? ? ? ? # 最小元素索引

? ? pivot = arr[high]? ?

? ? for j in range(low , high):

? ? ? ? # 當前元素小于或等于 pivot

? ? ? ? if? arr[j] <= pivot:

? ? ? ? ? ? i = i+1

? ? ? ? ? ? arr[i],arr[j] = arr[j],arr[i]

? ? arr[i+1],arr[high] = arr[high],arr[i+1]

? ? return ( i+1 )

# arr[] --> 排序數(shù)組

# low? --> 起始索引

# high? --> 結(jié)束索引

# 快速排序函數(shù)

def quickSort(arr,low,high):

? ? if low < high:

? ? ? ? pi = partition(arr,low,high)

? ? ? ? quickSort(arr, low, pi-1)

? ? ? ? quickSort(arr, pi+1, high)

arr = [10, 7, 8, 9, 1, 5]

n = len(arr)

quickSort(arr,0,n-1)

print ("排序后的數(shù)組:")

for i in range(n):

? ? print ("%d" %arr[i])

15、如何查詢Linux的后臺日志,命令是什么?

cat demo.log

more demo.log

// 查詢包含關鍵字`123456`且包含`aa`的日志內(nèi)容

grep?"123456" demo.log |?grep?"aa"

Tail -f

16、如何查看當前Linux的進程?

netstat

17、Dockerfile是什么?如何去創(chuàng)建一個Dockerfile?

Dockerfile 是一個文本文件,其內(nèi)包含了一條條的指令(Instruction),每一條指令構建一層,因此每一條指令的內(nèi)容,就是描述該層應當如何構建。

??此處以定制 nginx 鏡像為例,使用 Dockerfile 來定制。

??在一個空白目錄中,建立一個文本文件,并命名為 Dockerfile :

$ mkdir mynginx

$ cd mynginx

$ touch Dockerfile

其內(nèi)容為:

FROM nginx

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

18、Python有沒有垃圾回收機制?它又是通過什么來處理的?

1、為什么會有垃圾機制,主要是為了有效的釋放內(nèi)存(內(nèi)存溢出與內(nèi)存泄露)。

內(nèi)存溢出 out of memory是指程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用。當發(fā)生內(nèi)存溢出時,程序?qū)o法進行,強制終止。

內(nèi)存泄露 memory leak,是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間。如果發(fā)生內(nèi)存泄露,那么可用內(nèi)存會逐漸減少,從而降低性能。

memory leak會最終會導致out of memory!

2、為什么需要Garbage collection?

為了防止內(nèi)存泄露. 對編程語言來說,GC 就是一個無名英雄,默默地做著貢獻。

打個比方,天鵝在水面優(yōu)雅地游動時,實際上腳蹼?yún)s在水下拼命地劃水。GC 也是如此。

在由編程語言構造的美麗的源代碼這片水下,GC在拼命地將垃圾回收再利用。

3、python采用的是引用計數(shù)機制為主,標記-清除和分代收集兩種機制為輔的策略。

4、垃圾回收:計數(shù)機制

1》GC 原本是一種“釋放怎么都無法被引用的對象的機制”。那么人們自然而然地就會想到,可以讓所有對象事先記錄下“有多少程序引用自己”。讓各對象知道自己的“人氣指數(shù)”,從而讓沒有人氣的對象自己消失,這就是引用計數(shù)法(Reference Counting).清除這些無用的垃圾對象,把它們送回到可用列表。

2》引用計數(shù)法的優(yōu)點:高效、實時性、對象有確定的生命周期、易于實現(xiàn)。

3》缺點:維護引用計數(shù)消耗資源、無法解決循引用的問題。

5、垃圾回收:標記-清除

1》如它的字面意思一樣,GC 標記 - 清除算法由標記階段和清除階段構成。標記階段是

把所有活動對象都做上標記的階段。清除階段是把那些沒有標記的對象,也就是非活動對象回收的階段。通過這兩個階段,就可以令不能利用的內(nèi)存空間重新得到利用。

6、垃圾回收:分代收集

1》分代垃圾回收(Generational GC)在對象中導入了“年齡”的概念,通過優(yōu)先回收容

易成為垃圾的對象,提高垃圾回收的效率。

2》gc的邏輯

分配內(nèi)存

-> 發(fā)現(xiàn)超過閾值了

-> 觸發(fā)垃圾回收

-> 將所有可收集對象鏈表放到一起

-> 遍歷, 計算有效引用計數(shù)

-> 分成 有效引用計數(shù)=0 和 有效引用計數(shù) > 0 兩個集合

-> 大于0的, 放入到更老一代

-> =0的, 執(zhí)行回收

-> 回收遍歷容器內(nèi)的各個元素, 減掉對應元素引用計數(shù)(破掉循環(huán)引用)

-> 執(zhí)行-1的邏輯, 若發(fā)現(xiàn)對象引用計數(shù)=0, 觸發(fā)內(nèi)存回收

-> python底層內(nèi)存管理機制回收內(nèi)存

7、gc模塊

gc模塊提供操作垃圾回收的接口,包括禁用gc,調(diào)整回收頻率,配置debug選項,同時提供對無法釋放內(nèi)存對象的訪問權。

19、熟悉TestNG,說明一下用法?

TestNG的注釋非常強大和方便,TestNG允許并行測試,并可以基于group的方式執(zhí)行測試,還可以生成測試報表,并且報告展示多樣化,可在其基礎上自行開發(fā)測試報告插件以及測試監(jiān)聽器。

20、數(shù)據(jù)庫的增刪改查,手寫sql

21、Redis是做什么用的?ElasticSearch是什么?做什么用的?

Redis是內(nèi)存中的數(shù)據(jù)結(jié)構存儲, 用作數(shù)據(jù)庫, 緩存和消息代理。

Elasticsearch是基于Apache Lucene的現(xiàn)代搜索和分析引擎。

22、接口測試的定義,接口測試是怎么做的?如何存在接口依賴關系,怎么處理?

接口測試主要用于外部系統(tǒng)與系統(tǒng)之間以及內(nèi)部各個子系統(tǒng)之間的交互點,定義特定的交互點,然后通過這些交互點來,通過一些特殊的規(guī)則也就是協(xié)議,來進行數(shù)據(jù)之間的交互。

23、Python中,“arg”和“kwarg”分別代表什么含義,都有哪些作用?

如果我們不確定要往函數(shù)中傳入多少個參數(shù),或者我們想往函數(shù)中以列表和元組的形式傳參數(shù)時,那就使要用*args;

如果我們不知道要往函數(shù)中傳入多少個關鍵詞參數(shù),或者想傳入字典的值作為關鍵詞參數(shù)時,那就要使用**kwargs;

1.*args的使用方法

*args用來將參數(shù)打包成tuple(元組)給函數(shù)體調(diào)用

舉個栗子:

>> def func2(*args):

>> print(args,type(args))

>>>> func2("a")

>> ('aa',) <class 'tuple'>

>>> func2(1,2,3)

>> (1, 2, 3) <class 'tuple'>

2.**kwargs的使用方法

**kwargs 打包關鍵字參數(shù)成dict(字典)給函數(shù)體調(diào)用

舉個栗子:

>> def func(**kwargs):

? ? print(kwargs,type(kwargs))

>> func(a=1,b=2)>> {'a': 1, 'b': 2} <class 'dict'>

24、冒煙測試的定義:

冒煙測試(smoketest)在測試中發(fā)現(xiàn)問題,找到了一個Bug,然后開發(fā)人員會來修復這個Bug。這時想知道這次修復是否真的解決了程序的Bug,或者是否會對其它模塊造成影響,就需要針對此問題進行專門測試,這個過程就被稱為SmokeTest。在很多情況下,做SmokeTest是開發(fā)人員在試圖解決一個問題的時候,造成了其它功能模塊一系列的連鎖反應,原因可能是只集中考慮了一開始的那個問題,而忽略其它的問題,這就可能引起了新的Bug。SmokeTest優(yōu)點是節(jié)省測試時間,防止build失敗。缺點是復蓋率比較低。

25、session、cookie的區(qū)別:

? cookies 數(shù)據(jù)保存在客戶端,session 數(shù)據(jù)保存在服務器端;

? cookies 可以減輕服務器壓力,但是不安全,容易進行 cookies 欺騙;

? session 較安全,但占用服務器資源

26、壓力測試匯總:(高并發(fā)的情況下,看響應情況)

壓力測試,需要先了解壓測的場景、壓測的參數(shù),然后準備好要壓測的工具,代碼和數(shù)據(jù)。

壓力測試之前要明確壓測的功能和壓測的指標:

①固定接口參數(shù)進行壓測還是進行接口參數(shù)隨機化壓測?

②要求支持多少并發(fā)數(shù)?

③TPS(每秒鐘處理事務數(shù))目前是多少?響應時間要達到多少?

④被壓的服務器名稱或者被壓的服務器IP?

壓測完畢之后,需要出具壓力測試的測試報告,通過報告來分析是否壓測達到標準:

查看聚合報告中的:

TPS吞吐量能不能達到呀唔要求,響應時間、錯誤率。

27、python中對多態(tài)的理解

多態(tài)是指一類事物有多種形態(tài),比如動物類,可以有貓,狗,豬等等。(一個抽象類有多個子類,因而多態(tài)的概念依賴于繼承)

多態(tài)性是指具有不同功能的函數(shù)可以使用相同的函數(shù)名,這樣就可以用一個函數(shù)名調(diào)用不同內(nèi)容的函數(shù)。

28、postman中請求報文有哪四種

POST請求一:表單提交

請求頭中的Content-Type與請求參數(shù)的格式之間是有關聯(lián)關系

post參數(shù)格式:表單提交:application/x-www-form-urlencoded

Json提交:application/json

xml提交:text/xml

POST請求二:json提交

POST請求三:xml提交

POST請求四:二進制文件提交

請求Body里面:

1. form-data

就是http請求中的multipart/form-data,它會將表單的數(shù)據(jù)處理為一條消息,以標簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件。當上傳的字段是文件時,會有content-type來說明文件類型;content-disposition用來說明字段的一些信息;由于有boundary隔離,所以multipart/form-data既可以上傳文件,也可以上傳鍵值對,它采用了鍵值對的方式,所以可以上傳多個文件。

2.x-www-form-urlencoded:

就是application/x-www-from-urlencoded,會將表單內(nèi)的數(shù)據(jù)轉(zhuǎn)換為鍵值對

3.raw

可以上傳任意格式的文本,可以上傳text、json、xml、html等

4.binary

相當于content-type:application/octet-stream,從字面意思得知,只可以上傳二進制數(shù)據(jù),通常用來上傳文件,由于沒有鍵值,所以,一次只能上傳一個文件。

29、selenium的簡介和原理

Selenium是一個用于Web應用程序自動化測試工具。Selenium測試直接運行在瀏覽器中,就像真正的用戶在操作一樣。支持的瀏覽器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。

主要功能包括:測試與瀏覽器的兼容性——測試你的應用程序看是否能夠很好得工作在不同瀏覽器和操作系統(tǒng)之上。

Selenium原理,主要需要三個東西:

1.自動化測試代碼:自動化測試代碼發(fā)送請求給瀏覽器的驅(qū)動(比如火狐驅(qū)動、谷歌驅(qū)動)

2.瀏覽器驅(qū)動:它來解析這些自動化測試的代碼,解析后把它們發(fā)送給瀏覽器

3.瀏覽器:執(zhí)行瀏覽器驅(qū)動發(fā)來的指令,并最終完成工程師想要的操作。

30、monkey命令三個-v的含義、monkey中-v的命令

①需要有l(wèi)og日志輸出,可以加上-v參數(shù)。-v表示輸出的Log級別,-v最低,-v -v -v最高。adb shell monkey -v? <event -count> 包名

②Monkey也提供了這樣的參數(shù) -s----復現(xiàn)隨機點擊事件。

adb shell monkey -s <seed> <event-count> 包名

31、Linux命令vi與vim的區(qū)別

vi與vim

vi編輯器是所有Unix及Linux系統(tǒng)下標準的編輯器,他就相當于windows系統(tǒng)中的記事本一樣,它的強大不遜色于任何最新的文本編輯器。他是我們使用Linux系統(tǒng)不能缺少的工具。由于對Unix及Linux系統(tǒng)的任何版本,vi編輯器是完全相同的,學會它后,您將在Linux的世界里暢行無阻。

vim 具有程序編輯的能力,可以以字體顏色辨別語法的正確性,方便程序設計;

因為程序簡單,編輯速度相當快速。

vim可以當作vi的升級版本,他可以用多種顏色的方式來顯示一些特殊的信息。

vim會依據(jù)文件擴展名或者是文件內(nèi)的開頭信息, 判斷該文件的內(nèi)容而自動的執(zhí)行該程序的語法判斷式,再以顏色來顯示程序代碼與一般信息。

vim里面加入了很多額外的功能,例如支持正則表達式的搜索、多文件編輯、塊復制等等。 這對于我們在Linux上進行一些配置文件的修改工作時是很棒的功能。

32、jmeter的分布式壓測

Jmeter做分布式測試的原因:

測試機器的配置低,對服務器進行壓測時,造成不了壓力。

jmeter并發(fā)10000后,測試機就已經(jīng)卡頓了,而且測試結(jié)果有大量失?。ê雎粤薺meter自身問題=。=|||)~ 此現(xiàn)象又稱:Jmeter內(nèi)存溢出。

https://www.cnblogs.com/UncleYong/p/10854152.html

33、MVC模式的定義:

邏輯層與數(shù)據(jù)層分開

34、web端測試與app端測試的區(qū)別

系統(tǒng)架構方面:

web項目,一般都是b/s架構,基于瀏覽器的

app項目,則是c/s的,必須要有客戶端,用戶需要安裝客戶端。

web測試只要更新了服務器端,客戶端就會同步會更新。

App項目則需要客戶端和服務器都更新。

性能方面:

web頁面主要會關注響應時間

而app則還需要關心流量、電量、CPU、GPU、Memory這些。

它們服務端的性能沒區(qū)別,都是一臺服務器。

兼容方面:

web是基于瀏覽器的,所以更傾向于瀏覽器和電腦硬件,電腦系統(tǒng)的方向的兼容

app測試則要看分辨率,屏幕尺寸,還要看設備系統(tǒng)。

web測試是基于瀏覽器的所以不必考慮安裝卸載。

而app是客戶端的,則必須測試安裝、更新、卸載。除了常規(guī)的安裝、更新、卸載還要考慮到異常場景。包括安裝時的中斷、弱網(wǎng)、安裝后刪除安裝文件

此外APP還有一些專項測試:如網(wǎng)絡、適配性。。。

APP測試特點

(除了按需求說明書外的 功能測試 之外還需要進行如下測試)

1、適配性測試(也叫兼容性測試,不同的安卓版本,不同廠商,不同手機品牌)

2、不同網(wǎng)絡測試 (2G網(wǎng)絡/3G網(wǎng)絡/4G網(wǎng)絡/WIFI網(wǎng)絡)

3、在線升級測試

4、中斷測試(電話、短中消息打擾)

5、耗電量測試

6、弱網(wǎng)測試(信號差,信號屏蔽實驗室)

7、安裝卸載 (C/S)

8、流量測試

35、js的彈框的按鈕的定位

Alert()、

36、jmeter的定時器的作用

在默認情況下,jmeter發(fā)送每個請求之間是沒有延時的,如果線程數(shù)足夠大,瞬間就會將服務器壓死。

在實際的業(yè)務過程中,請求之間是有一定時間的停頓的,比如登錄網(wǎng)站時輸入用戶名和密碼需要時間(用戶會確認下輸入的對不對),所以在請求之間設置合理的延時是必須的,也更接近用戶的真實業(yè)務情況。

在jmeter中,定時器組件提供了系列不同類型的延時控制。合理使用定時器組件,能讓你的性能測試更接近真實,更能挖掘出系統(tǒng)的瓶頸和評估系統(tǒng)的性能指標。

37、sql命令:左鏈接、右鏈接、分頁、去重

Join.left、Join.right、distinct、limit

38、linux命令中,操作管理文件權限

Sudo chmod 777 -R 文件名

39、appium的原理:

appium則是基于WebDriver協(xié)議,并通過 post 發(fā)送一個 json 告知服務端相關測試信息,利用Bootstrap.jar的java文件集成包,最后通過調(diào)用輸入UiAutomator的命令,從而實現(xiàn)App的自動化測試。

40、函數(shù)式編程

函數(shù)式編程是指用一系列函數(shù)決定問題。

函數(shù)是一等公民(我們程序的基本單位是用函數(shù)來組成的),函數(shù)本身可以賦值給變量,賦值后變量綁定函數(shù),允許將函數(shù)本身作為參數(shù)傳入另一個函數(shù)并返回一個函數(shù)。

函數(shù)式編程要求函數(shù)可重入性:即一個函數(shù)傳的參數(shù)一定,則結(jié)果必須一定;要求def定義的函數(shù)不要訪問除局部變量以外的變量。

示例:

def myadd(x, y)

return x + y

print(myadd(10, 20))

41、瀏覽器輸入 url 按回車背后經(jīng)歷了哪些?

1、首先,在瀏覽器地址欄中輸入 url,先解析 url,檢測 url 地址是否合法

2、瀏覽器先查看瀏覽器緩存-系統(tǒng)緩存-路由器緩存,如果緩存中有,會直接在屏幕中顯示頁面內(nèi)容。若沒有,則跳到第三步操作。

瀏覽器緩存:瀏覽器會記錄 DNS 一段時間,因此,只是第一個地方解析 DNS 請求;

操作系統(tǒng)緩存:如果在瀏覽器緩存中不包含這個記錄,則會使系統(tǒng)調(diào)用操作系統(tǒng),獲取操作系統(tǒng)的記錄(保存最近的 DNS 查詢緩存);

路由器緩存:如果上述兩個步驟均不能成功獲取 DNS 記錄,繼續(xù)搜索路由器緩存;

ISP 緩存:若上述均失敗,繼續(xù)向 ISP 搜索。

3、在發(fā)送 http 請求前,需要域名解析(DNS 解析),解析獲取相應的 IP 地址。

4、瀏覽器向服務器發(fā)起 tcp 連接,與瀏覽器建立 tcp 三次握手。

5、握手成功后,瀏覽器向服務器發(fā)送 http 請求,請求數(shù)據(jù)包。

6、服務器處理收到的請求,將數(shù)據(jù)返回至瀏覽器

7、瀏覽器收到 HTTP 響應

8、瀏覽器解碼響應,如果響應可以緩存,則存入緩存。

9、 瀏覽器發(fā)送請求獲取嵌入在 HTML 中的資源(html,css,javascript,圖片,

音樂..........),對于未知類型,會彈出對話框。

10、 瀏覽器發(fā)送異步請求。

11、頁面全部渲染結(jié)束。

50、GET 和 POST 有一個重大區(qū)別,簡單的說:

GET 產(chǎn)生一個 TCP 數(shù)據(jù)包;POST 產(chǎn)生兩個 TCP 數(shù)據(jù)包。

對于 GET 方式的請求,瀏覽器會把 http header 和 data 一并發(fā)送出去,服務器響應 200(返回數(shù)據(jù));

而對于 POST,瀏覽器先發(fā)送 header,服務器響應 100 continue,瀏覽器再發(fā)送data,服務器響應 200 (返回數(shù)據(jù))。

42、什么是閉包?

內(nèi)部函數(shù)對外部函數(shù)作用域里變量的引用(非全局變量),則稱內(nèi)部函數(shù)為閉包。

閉包三要素:

1、嵌套函數(shù) 2、變量的引用? 3、返回內(nèi)部函數(shù)

43、測試流程:

需求評審、需求落實、制定測試計劃、設計測試用例、用例評審、冒煙測試、測試執(zhí)行、alpha、beta測試、驗收測試、風險評估、上線\測試觀察、問題跟進、提出問題解決方案、測試報告、復盤會議。

44、super 是干嘛用的?在 Python2 和 Python3 使用,有什么區(qū)別?為什么要使用 super?請舉例說明。

答:

super 用于繼承父類的方法、屬性。

super 是新式類中才有的,所以 Python2 中使用時,要在類名的參數(shù)中寫 Object。Python3 默認是新式類,不用寫,直接可用。

使用 super 可以提高代碼的復用性、可維護性。修改代碼時,只需修改一處。

代碼舉例:

class baseClass:

? ? ? def test1(self, num):

? ? ? ? ? ? ? print(num)

class?sonClass(baseClass):

def?test2(self):

super().test1(num)

son = sonClass()

son.test1(11)

3、快速編寫前端 HTML、JavaScript、Vue 代碼。

答:

HTML、JavaScript 代碼:

<!DOCTYPE html><html? lang="en"><head>

? ? <meta? charset="utf-8"></head><body>

? ? <h1? id="title">xxx公司</h1>

? ? <p>xxx公司是一家......</p>

? ? <div? id="mybox">

? ? ? ? <h1>{{a}}</h1>

? ? ? ? <input? type="button"? value="按我"? v-on:click="add()">

? ? </div>

? ? <script? type="text/javascript"? src="public/bundle.js"></script></body></html><script>

? ? var title = document.getElementById("title");

title.onclick =? function()? {

alert('我愛xxx公司,祝我面試成功');

? ? }</script>

Vue 代碼編寫:

import? Vue? from? "vue";new? Vue({

? ? el :? "#mybox",

? ? data :? {

? ? ? ? a :? 100

? ? },

? ? methods :? {

? ? ? ? add :? function(){

? ? ? ? this.a ++;

? ? }

? }

});

45、L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3],用一行代碼得出 [11, 1, 2, 3, 5]

答:?list(set(L))

46、L = [1, 2, 3, 4, 5],L[10:]的結(jié)果是?

答:?空列表

47、L = [1, 2, 3, 5, 6],如何得出 '12356'?

答:

s =? ''for i in L:

? ? s = s + str(i)print(s)? # 12356print(type(s))? # <class 'str'>

48、列表和字典有什么區(qū)別?

答:?一般都是問列表和元組有什么不同。

(1)獲取元素的方式不同。列表通過索引值獲取,字典通過鍵獲取。

(2)數(shù)據(jù)結(jié)構和算法不同。字典是 hash 算法,搜索的速度特別快。

(3)占用的內(nèi)存不同。

49、如何結(jié)束一個進程?

答:

(1)調(diào)用 terminate 方法。

(2)使用 subProcess 模塊的 Popen 方法。使用簡單,具體用法,這里不展開。

50、進程、線程有什么區(qū)別?什么情況下用進程?什么情況下用線程?

答:

(1)區(qū)別:

① 地址空間和其它資源(如打開文件):進程之間相互獨立,同一進程的各線程之間共享。某進程內(nèi)的線程在其它進程不可見。

② 通信:進程間通信 IPC,線程間可以直接讀寫進程數(shù)據(jù)段(如全局變量)來進行通信——需要進程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性。

③ 調(diào)度和切換:線程上下文切換比進程上下文切換要快得多。

④ 在多線程操作系統(tǒng)中,進程不是一個可執(zhí)行的實體。

(2)使用場景:同時操作一個對象的時候,比如操作的是一個全局變量,我用線程,因為全局變量是所有線程共享的。

51、什么是ORM?為什么要用ORM?不用ORM會帶來什么影響?

答:

ORM 框架可以將類和數(shù)據(jù)表進行對應,只需要通過類和對象就可以對數(shù)據(jù)表進行操作。

通過類和對象操作對應的數(shù)據(jù)表,類的靜態(tài)屬性名和數(shù)據(jù)表的字段名一一對應,不需要寫 SQL 語句。

ORM 另外一個作用,是根據(jù)設計的類生成數(shù)據(jù)庫中的表。

52、寫一段代碼,ping 一個 ip 地址,并返回成功、失敗的信息。

答:?使用 subProcess 模塊的 Popen 方法

53、說說接口測試的流程,介紹一下request有哪些內(nèi)容。

答:

(1)流程:獲取接口文檔,依據(jù)文檔設計接口參數(shù),獲取響應,解析響應,校驗結(jié)果,判斷測試是否通過。

(2)request 內(nèi)容:

① 封裝了各種請求類型,get、post 等;

② 以關鍵字參數(shù)的方式,封裝了各種請求參數(shù),params、data、headers、token 等;

③ 封裝了響應內(nèi)容,status_code、json()、cookies、url 等;

④ session 會話對象,可以跨請求。

54、UI 自動化,如何做集群?

答:?Selenium Grid。

55、移動端 UI 自動化,經(jīng)常會自動安裝 2 個程序,你知道那兩個程序是什么東西不?

答:?守護精靈,和 Python 并發(fā)編程中的 daemon 原理一樣,父進程/父線程的代碼執(zhí)行完畢,它就終止,要寫在 start 方法前面。另外,要找到配置文件,注釋掉兩行代碼。

56、說5個以上 Linux 命令。

答:

ls?列出目錄下的文件和文件夾?

cd?切換目錄?

cd ..? 返回上一級目錄

rm?刪除目錄和文件?

cat??查看文件內(nèi)容?

ps?可以看那個進程再跑?

ps?-x?[PID]?查看單個進程的狀態(tài)?

top?可以看那個進程的占用率最高?

su?切換到root用戶?

kill?[pid]?殺死一個進程?

chmod?777?<file>?修改該文件為可執(zhí)行權限?

57、自動化代碼中,用到了哪些設計模式?

答:自動化代碼用到過的設計模式:

①單例設計模式

②工廠模式

③PO設計模式

④數(shù)據(jù)驅(qū)動模式

⑤面向接口編程設計模式

58、什么是Selenium

答:Selenium是一個開源的web自動化測試框架,支持多種編程語言開發(fā)自動化測試腳本,支持跨瀏覽器平臺進行測試

58、什么是斷言?

答:斷言Assert用于在代碼中驗證實際結(jié)果是不是符合預期結(jié)果,如果測試用例執(zhí)行失敗會拋出異常并提供斷言日志

59、TestNG有哪些有點?

答:TestNG的注釋非常強大和方便,TestNG允許并行測試,并可以基于group的方式執(zhí)行測試,還可以生成測試報表,并且報告展示多樣化,可在其基礎上自行開發(fā)測試報告插件以及測試監(jiān)聽器

60、什么是web自動化測試?

答:web自動化測試指的是從UI(用戶界面)層面進行的自動化測試,測試人員通過編程自動化程度(測試用例腳本)來打開瀏覽器測試網(wǎng)站的業(yè)務邏輯

61、寫出Selenium中你最熟悉的接口或類?

答:webDriver、lnternetExplorerDriver、FirefoxDriver、ChromeDriver、WebElement、WebDriverWait、By

62、元素定位類型有哪些?

答:By類一共有8中元素定位方式,他們都是靜態(tài)方法:

By.id(),By.name(),By.tagName(),By.className(),By.cssSelector(),By.linkText(),By.partialLinText(),By.xpath()

63、登錄按鈕除了用click方法進行點擊以外還有其他方式么?

答:還可以使用submit()方法,前提是input元素的type為submit

64、怎么對含有驗證碼的功能進行自動化測試的?

答:1)圖像識別,技術難度大,效果不佳,不推薦

2)屏蔽驗證,邀請開發(fā)處理,但在預生產(chǎn)環(huán)境或者生產(chǎn)環(huán)境不推薦

3)萬能驗證碼,使用一個負責的其他人無法猜到的驗證碼

65、怎么驗證復選按鈕是不是被選中?

答:可以使用元素的isSelected()方法,如果返回的是true則說明被選中,否則表明未被選中

66、如何處理alert彈窗?

答:處理alert彈窗首先需要先跳轉(zhuǎn)到alert上,然后在點擊確定或者取消按鈕,

Alert alet=driver.switchTo().alert();//切換到alert

alert…accept();//確定

alert.dismiss();//取消

67、如何用webdriver進行鼠標右鍵點擊操作?

答:使用Actions類

Actions actions=new Actions(driver);

actions.moveToElement(element).perform();

actions.contextClick().perform();

68、舉一個webDriver中方法重載的例子?

答:frame(string nama),frame(int index),

frame(WebElement element)

69、下拉菜單中如何去選擇一個菜單項?

答:如果下拉菜單是select標簽,使用方法:

selectByValue()或者是selectBylndex()或者selectByVisibleText()即可

如果這個下拉菜單不是通過select標簽創(chuàng)建,則直接通過xpath定位元素然后去點擊選擇

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容