1.下列哪個語句在Python中是非法的?
A、x = y = z =1 B、x = (y = z + 1)
C、x, y = y, x D、x += y
答案:B
2.關於Python內存管理,下列說法錯誤的是
A、變量不必事先聲明 B、變量無須先創建和賦值而直接使用
C、變量無須指定類型 D、可以使用del釋放資源
答案:B. (不先賦值會報錯,is not defined)
3、下面哪個不是Python合法的標識符
A、int32 B、40XL C、self D、name
答案:B(合法的標識符不能以數字開頭)
4、下列哪種說法是錯誤的
A、除字典類型外,所有標准對象均可以用於布爾測試
B、空字符串的布爾值是False
C、空列表對象的布爾值是False
D、值為0的任何數字對象的布爾值是False
答案:D (a=0,0, bool(a)為True)
5、下列表達式的值為True的是
A、5+4j >2-3j B、3>2>2
C、(3,2)<(‘a’,‘b’) D、’abc’ > ‘xyz’
答案:C (在Py2.x版本中正確,在Py3.x運行錯誤)
6、Python不支持的數據類型有
A、char B、int C、float D、list
答案:A(python里無char型數據,有string字符串類型;但C語言中有char數據類型)
7、關於Python中的復數,下列說法錯誤的是
A、表示復數的語法是real + imagej B、實部和虛部都是浮點數
C、虛部必須后綴j,且必須是小寫 D、方法conjugate返回復數的共軛復數
答案:C(復數虛部的后綴也可以是大寫的J)
8、關於字符串下列說法錯誤的是
A、字符應該視為長度為1的字符串
B、字符串以\0標志字符串的結束
C、既可以用單引號,也可以用雙引號創建字符串
D、在三引號字符串中可以包含換行回車等特殊字符
答案:B(python因為字符串有長度限制,到了長度就標志字符串的結束)
9、以下不能創建一個字典的語句是
A、dict1 = {} B、dict2 = { 3 : 5 }
C、dict3 ={[1,2,3]: “uestc”} D、dict4 = {(1,2,3): “uestc”}
答案:C(字典的鍵必須是不變的,而列表是可變的)
10、下列Python語句正確的是:
A、min = x if x< y = y
B、max = x > y ?x:y
C、if (x >y) print x
D、while True :pass
答案:D
python常見的命令行交互自動化模塊有哪些?
答案:a)Import module
b) Import module1,module2
c) From module import *
d) Frommodule import m1,m2,m3
e) From module import logger asmodule_logger
12.python的底層網絡交互模塊有哪些?
答案:socket, urllib,urllib3 , requests, grab, pycurl
13.python網絡交互時,二進制打包解包的模塊有哪些
打包:pack(), 解包:upk()
14.python的測試框架有哪些?試列出常用的3個或更多
答案:unittest, nose,unittest2, doctest, pytest
15.一行把[1,2,3,1,2,3] 中的重復元素剔除。
答案:list(set([1,2,3,1,2,3]))
16.現在要你使用pyDes(DES加密)和標准庫中的namedtuple,假設你之前沒有接觸過,你如何快速上手?
答案:仔細閱讀官方文檔中namedtuple庫和pyDes的使用。下載pyDes和namedtuple庫,借鑒網上的使用教程,摸索實踐。
17.Python到底是什么樣的語言?你可以比較其他技術或者語言來回答你的問題。
這里是一些關鍵點:Python是解釋型語言。這意味着不像C和其他語言,Python運行前不需要編譯。其他解釋型語言包括PHP和Ruby。
Python是動態類型的,這意味着你不需要在聲明變量時指定類型。你可以先定義x=111,然后 x=”I’m a string”,一點問題也不會有。
Python是面向對象語言,所有允許定義類並且可以繼承和組合。Python沒有訪問訪問標識如在C++中的public, private, 這就非常信任程序員的素質,相信每個程序員都是“成人”了~
在Python中,函數是一等公民。這就意味着它們可以被賦值,從其他函數返回值,並且傳遞函數對象。類不是一等公民。
寫Python代碼很快,但是跑起來會比編譯型語言慢。幸運的是,Python允許使用C擴展寫程序,所以瓶頸可以得到處理。Numpy庫就是一個很好例子,因為很多代碼不是Python直接寫的,所以運行很快。
Python使用場景很多 – web應用開發,自動化,科學建模,大數據應用,等等。它也經常被看做“膠水”語言,使得不同語言間可以銜接上。
Python能夠簡化工作 ,使得程序員能夠關心如何重寫代碼而不是詳細看一遍底層實現。
18.Python和多線程,是不是個好主意?列舉你覺得可以讓Python代碼並行運行的方法?
Python實際上不允許多線程。它有一個threading包但是如果你想加快代碼運行速度,或者想並行運行,這不是一個好主意。Python有一個機制叫全局解釋器鎖(GIL)。GIL保證每次只有一個線程在解釋器中跑。一個線程獲得GIL,之后再交給下一個線程。所以,看起來是多個線程在同時跑,但是實際上每個時刻只有CPU核在跑一個線程,沒有真正利用多個CPU核跑多個線程。就是說,多個線程在搶着跑一個CPU核。
但是還是有使用threading包的情況的。比如你真的想跑一個可以線程間搶占的程序,看起來是並行的。或者有很長時間的IO等待線程,這個包就會有用。但是threading包不會使用多核去跑代碼。
真正的多核多線程可以通過多進程,一些外部庫如Spark和Hadoop,或者用Python代碼去調用C方法等等來實現
19.你怎么對你的代碼進行跟蹤,協同寫代碼?
使用版本控制:git
20.下面這段代碼的輸出是什么
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)
f(2)
f(3,[3,2,1])
f(3)
1
2
3
4
5
6
7
8
[0, 1]
[3, 2, 1, 0, 1, 4]
[0, 1, 0, 1, 4]
因為Python內存還是存了第一次殘留的l值,所以它以0和1開頭。
21.猴子補丁是什么?它是不是一個好主意?
猴子補丁是在一個函數或者對象已經存在的基礎上,改變它的行為。比如:
import datetime
datetime.datetime.now = lambda: datetime.datetime(2012, 12, 12)
1
2
大多數時候這不是一個好主意 – 如果早就設計好,不是更好?一個可以使用猴子補丁的地方是做測試,著名的包mock,就是一個很好的例子。
22.*args, **kwargs是什么東西? 我們為什么會用它?
我們用 args 當我們不知道要有多少個參數傳給函數,或者我們想把一個列表或者tuple存起來以后傳給函數。我們用**kwargs當我們不知道有多少個關鍵字參數要傳給函數,或者我們想把字典存起來以后傳給函數。args 和 kwargs的名字是以前遺留下來的,你用bob 和**billy也沒關系但是這樣不太好,嘿嘿。
23.@classmethod, @staticmethod, @property都是什么意思?
修飾器的概念要懂。拿到一個函數,返回一個函數,或者拿到一個類,返回另一個類。
@my_decorator
def my_func(stuff):
do_things
1
2
3
以上代碼相當於:
def my_func(stuff):
do_things
my_func = my_decorator(my_func)
1
2
3
你可以在這里找到修飾器的一般用法。
@classmethod, @staticmethod 和 @property修飾器是使用在類中的。
24.簡介地描述下Python的垃圾回收機制
這里可以說許多東西,有幾個重點你可以提到:
Python在內存中維護對象的引用次數。如果一個對象的引用次數變為0,垃圾回收機制會回收這個對象作為他用。
有時候會有“引用循環”的事情發生。垃圾回收器定期檢查回收內存。一個例子是,如果你有兩個對象 o1 和 o2,並且o1.x == o2 and o2.x == o1. 如果 o1 和 o2 都沒有被其他對象使用,那么它們都不應該存在。但是它們的應用次數都是1,垃圾回收不會起作用。
一些啟發算法可以用來加速垃圾回收。比如,最近創建的對象更可能是無用的。用創建時間來度量對象的生命時長,生命越長,越可能是更有用的對象。
CPython的說明文檔中有相關解釋。
25.python中有哪些基礎類型
有5個標准數據庫類型:Numbers(數字) String(字符串) List(列表) Tuple(元組) Dictionary(字典)
26.python里面的深拷貝,淺拷貝
在Python中對象的賦值其實就是對象的引用。當創建一個對象,把它賦值給另一個變量的時候,python並沒有拷貝這個對象,只是拷貝了這個對象的引用而已。
淺拷貝:拷貝了最外圍的對象本身,內部的元素都只是拷貝了一個引用而已。也就是,把對象復制一遍,但是該對象中引用的其他對象我不復制
深拷貝:外圍和內部元素都進行了拷貝對象本身,而不是引用。也就是,把對象復制一遍,並且該對象中引用的其他對象我也復制。
1,深淺拷貝都是對源對象的復制,占用不同的內存空間。
2,不可變類型的對象,對於深淺拷貝毫無影響,最終的地址值和值都是相等的。
3,可變類型:
=淺拷貝: 值相等,地址相等
copy淺拷貝:值相等,地址不相等
deepcopy深拷貝:值相等,地址不相等
27.實現一個字典數據結果的深拷貝
copy淺拷貝
deepcopy深拷貝
from copy import deepcopy
深拷貝和淺拷貝的例子:
data = {'user':'admin','num':[1,2,3]}
data2 = data.copy()
data3 = deepcopy(data)
1
2
3
查看結果
data['user']='root'
data['num'].remove(1)
print(data)
print(data2)
print(data3)
5
輸出結果為:
{'user': 'root', 'num': [2, 3]}
{'user': 'admin', 'num': [2, 3]}
{'user': 'admin', 'num': [1, 2, 3]}
1
2
3
總結:
如果源拷貝對象只有一級目錄的話,源做任何改動,不影響深淺拷貝對象
如果源拷貝對象不止一級目錄的話,源對一級目錄的子目錄做任何改動,都會影響淺拷貝,但不影響深拷貝
28.循環 迭代 遍歷 遞歸
循環 指的是在滿足條件的情況下,重復執行同一段代碼。比如,while語句。
[ 循環則技能對應集合,列表,數組等,也能對執行代碼進行操作。
迭代(iterate),指的是按照某種順序逐個訪問列表中的每一項。比如,for語句。
[迭代只能對應集合,列表,數組等。不能對執行代碼進行迭代。]
遍歷(traversal),指的是按照一定的規則訪問樹形結構中的每個節點,而且每個節點都只訪問一次。
[遍歷同迭代一樣,也不能對執行代碼進行遍歷。]
遞歸(recursion),指的是一個函數不斷調用自身的行為。比如,以編程方式輸出著名的斐波納契數列。
[線性遞歸和尾遞歸。]
29.異常處理機制
捕捉異常可以使用try/except 語句。
try/except 語句用來檢測try語句塊中的錯誤,從而讓except 語句捕獲異常信息並處理。
如果你不想在異常發生時結束你的程序,只需要try 捕獲里捕獲它。
使用以下語法:
try …except …else 的語法
try:
<語句> #運行別的代碼
except <名字>:
<語句> #如果在try部份引發了’name’異常
except <名字>,<數據>:
<語句> #如果引發了’name’異常,獲得附加的數據
else:
<語句> #如果沒有異常發生
try的工作原理是,當開始一個try語句后,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這里,try子句先執行,接下來會發生什么依賴於執行時是否出現異常。
如果當try后的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
如果在try后的語句里發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並打印缺省的出錯信息)。
如果在try子句執行時沒有發生異常,python將執行else語句后的語句(如果有else的話),然后控制流通過整個try語句
30.class類中(self)指的是什么
self 指的是類本身。
31.range 函數的使用,其中有那兩個參數
函數語法:
range(start, stop[,step])
參數說明:
start: 計數從 start 開始。默認是從 0 開始。例如range(5)等價於range(0, 5);
stop: 計數到 stop 結束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]沒有5
step:步長,默認為1。例如:range(0, 5) 等價於 range(0, 5, 1)
我們可以從以下幾個方面來提高速度:
一,減少操作步驟,如經過三四步才能打開我們要測試的頁面的話,我們就可以直接通過網址來打開,減少不必要的操作。
二,中斷頁面加載,如果頁面加載的內容過多,我們可以查看一下加載慢的原因,如果加載的內容不影響我們測試,就設置超時時間,中斷頁面加載。
三,在設置等待時間的時候,可以sleep固定的時間,也可以檢測某個元素出現后中斷等待也可以提高速度。
四,配置testNG實現多線程。在編寫測試用例的時候,一定要實現松耦合,然后在服務器允許的情況下,盡量設置多線程運行,提高執行速度。
一,網速問題:有的時候網頁加載的比較慢,在程序執行的時候要操作的元素沒有顯示出來。這種情況比較常見,運行一次網速好的時候通過了,再運行一次,頁面沒有打開,就不通過了。為了提高穩定性,我們只能犧牲運行時間了,在經常檢測失敗的元素前加上等待時間,等要操作的元素出現之后再執行下面的操作。
二,Selelnium的原因:Selenium1.0和2.0還是有區別的,有些兒函數在2.0下運行確實有時而有效,時面無效。如果mouseover()函數,就是這種情況, 我們需要避免使用這類的函數。
三,多線程的時候,測試用例間相互影響。雖然多線程的時候運行速度比較快,但是如果用例之間的耦合性沒有設計好,也會影響的,如果用例A先於用例B執行的時候,就會影響到用例B;反之則沒有問題。這種情況,如果你的自動化測試工程打算多線程的時候,提前就要把測試用例測試的耦合度比較松,盡量沒有任何關系,因為多線程的執行順序是不受控制的。
一,自動化測試用例是用來監控的,在此目的下,我們就把自動化測試用例設置成定時執行的,如果每五分鍾或是一個小時執行一次,在jenkins上創建一個定時任務即可。
二,必須回歸的用例。有些兒測試用例,如BVT測試用例,我們在公司產品任何變動上線之前都需要回歸執行。那我們就把測試用例設置成觸發式執行,在jenkins上將我們的自動化測試任務綁定到開發的build任務上。當開發人員在仿真環境上部代碼的時候,我們的自動化測試用例就會被觸發執行。
三,不需要經常執行的測試用例。像全量測試用例,我們沒有必要一直回歸執行,必竟還是有時間消耗的,有些非主要業務線也不需要時時回歸。這類測試用例我們就采用人工執行,在jenkins創建一個任務,需要執行的時候人工去構建即可。
通過研究selenium-webdriver的源碼,筆者發現其實webdriver的實現原理並不高深莫測無法揣度。在這里以webdriver ruby binding的firefox-webdriver實現為例,簡單介紹一下webdriver的工作原理。
-
當測試腳本啟動firefox的時候,selenium-webdriver 會首先在新線程中啟動firefox瀏覽器。如果測試腳本指定了firefox的profile,那么就以該profile啟動,否則的話就新啟1個profile,並啟動firefox;
-
firefox一般是以-no-remote的方法啟動,啟動后selenium-webdriver會將firefox綁定到特定的端口,綁定完成后該firefox實例便作為webdriver的remote server存在;
-
客戶端(也就是測試腳本)創建1個session,在該session中通過http請求向remote server發送restful的請求,remote server解析請求,完成相應操作並返回response;
-
客戶端接受response,並分析其返回值以決定是轉到第3步還是結束腳本;
這就是webdriver的工作流程,看起來很復雜實際上當了解了webdriver的實現原理后,理解上述問題應該比較簡單。
webdriver是按照server – client的經典設計模式設計的。
server端就是remote server,可以是任意的瀏覽器。當我們的腳本啟動瀏覽器后,該瀏覽器就是remote server,它的職責就是等待client發送請求並做出相應;
client端簡單說來就是我們的測試代碼,我們測試代碼中的一些行為,比如打開瀏覽器,轉跳到特定的url等操作是以http請求的方式發送給被 測試瀏覽器,也就是remote server;remote server接受請求,並執行相應操作,並在response中返回執行狀態、返回值等信息;
28、get和post 的區別?(感覺可能答案不對)
-因為使用GET請求不會產生什么動作。不會產生動作意味着GET的HTTP請求不會在服務器上產生任何結果。但是安全方法並不是什么動作都不產生,這里的安全方法僅僅指不會修改信息。POST可能會修改服務器上的資源的請求。比如CSDN的博客,用戶提交一篇文章或者一個讀者提交評論是通過POST請求來實現的,因為再提交文章或者評論提交后資源(即某個頁面)不同了,或者說資源被修改了。
兩種請求方式的區別:
1、GET請求,請求的數據會附加在URL之后,以?分割URL和傳輸數據,多個參數用&連接。URL的編碼格式采用的是ASCII編碼,而不是uniclde,即是說所有的非ASCII字符都要編碼之后再傳輸。
POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。因此,GET請求的數據會暴露在地址欄中,而POST請求則不會。
2、傳輸數據的大小
在HTTP規范中,沒有對URL的長度和傳輸的數據大小進行限制。但是在實際開發過程中,對於GET,特定的瀏覽器和服務器對URL的長度有限制。因此,在使用GET請求時,傳輸數據會受到URL長度的限制。
對於POST,由於不是URL傳值,理論上是不會受限制的,但是實際上各個服務器會規定對POST提交數據大小進行限制,Apache、IIS都有各自的配置。
3、安全性
POST的安全性比GET的高
29、公司內一直在使用的測試系統(B/S架構)突然不能訪問了,需要你進行排查並恢復,說出你的檢查方法
答:一、網站輸入域名直接無法訪問,網站之前還正常,突然就無法訪問