1、自動化代碼中,用到了哪些設計模式?
- 單例設計模式
- 工廠模式
- PO設計模式
- 數據驅動模式
- 面向接口編程設計模式
2、什么是斷言( Assert) ?
- 斷言Assert用於在代碼中驗證實際結果是不是符合預期結果,
- 如果測試用例執行失敗會拋出異常並提供斷言日志
3、什么是web自動化測試
- Web自動化測試是從UI (用戶界面)層面進行的自動化測試,
- 測試人員通過編程自動化程序(測試用例腳本)來打開瀏覽器測試網站的業務邏輯。
4、什么是Selenium?
- Selenium是一個開源的web自動化測試框架,支持多種編程語言開發自動化測試腳本,支持跨瀏覽器平台進行測試
5、寫出Selenium中你最熟悉的接口或類
- WebDriver、InternetExplorerDriver、 FirefoxDriver、 ChromeDriver、 WebElement、WebDriverWait、 By
6、元素定位類型有哪些?
By類一共有8種元素定位方式,它們都是靜態方法:
- By.id():
- By.name():
- By.tagName():
- By.className():
- By.cssSelector():
- By linkText():
- By partialLinkText():
- By.xpath():
7、Xpath是什么?
- 它是查找web頁面元素的一種方式,相當於元素在dom中間的一個路徑,可以采用絕對路徑和相對路徑的方式進行定位
- 它對於定義動態的頁面元素有很大的幫助,同時也需要謹慎使用,因為如果頁面結構發生變化,那么定位信息也可能需要變化。
8、findElement()和findElements(方法有什么區別
- 兩個都是查找頁面元素的方法
- findElement():查找一個頁面元素,只會返回一個WebElement對象
- findElements() :查找頁面上所有符合匹配的元素,返回元素集合
9、登錄按鈕除了用click方法進行點擊以外還有其他方式嗎?
- 還可以使用submit()方法,前提是input元素的type為submit
10、怎么提高Selenium腳本的執行速度
- 優化等待時間:使用 WebDriverWait 智能等待來代替線程等待 sleep 和 隱式等待 implicityWait
- 減少不必要的操作:如直接進入某頁面代替經過一系列自動化操作進入某頁面在服務器允許的情況下,使用多線程實現並發執行測試用例.
11、怎么對含有驗證碼的功能進行自動化測試的
- 1) :圖像識別,技術難度大,效果不佳,不推薦
- 2) :屏蔽驗證碼,邀請開發處理,但在預生產環境或者生產環境不推薦
- 3) :萬能驗證碼,使用一個復雜的其他人無法猜到的驗證碼
12、怎么驗證復選按鈕是不是被選中
- 可以使用元素的 isSelected() 方法,如果返回的是 true 則說明被選中,否則表明未被選中
13、如何處理alert彈窗?
- 處理 alert 彈窗首先需要先跳轉到 alert 上,然后在點擊確定或者取消按鈕,
- Alert alert = driver.switchTo().alert(); //切換到alert
- alert.accept0; //確定
- alert.dismiss0; //取消
14、下拉菜單中如何去選擇一個菜單項?
- 如果下拉菜單是select標簽,使用方法: selectByValue() 或者 selectByIndex() 或者 selectByVisibleText() 即可
- 如果這個下拉菜單不是通過 select 標簽創建,則直接通過 xpath 定位元素然后去點擊選擇
15、如何模擬瀏覽器的前進和后退、刷新操作
- driver.navigate().back()://后退
- driver. navigate().forward()://前進
- driver.navigate0.efresh()://刷新
16、怎么獲得當前頁面的URL?
- String url = driver.getCurrentUrl();
17、WebDriver的close()和quit(方法的區別是什么?
- close()方法只是關閉當前正在操作的窗口
- quit()是關閉了所有已經打開的窗口
18、你覺得自動化測試用哪些缺陷
- 成本比較大,而成效可能並不高
- 適合自動化測試的功能有限
- 某些功能操作相對復雜,比如驗證碼
- 維護成本高,一旦項目需求變更,自動化測試腳本和用例就需要改進
19、Web端功能自動化,如何實現(非input型上傳)上傳文件
- 與windows窗口進行交互,可以使用 pywin32庫 實現。
20、遇到<d1 class="inf-bar clearfix"> 這種class中間有空格的控件,如何通過class定位?
- xpath定位:直接//d1 [@class="inf_bar clearfx"]
- css定位: d1.inf_bar.clearfix
21、Selenium自動化,遇到 iframe 如何處理?
- 使用switch_ to.frame 切換進 iframe 當中后 ,再去定位其中的元素並操作
22、Web端功能自動化中,如何切換句柄。
- 先獲取所有窗口句柄,然后使用 switch_ to.window() 切換到指定窗口
23、測試中遇到 readonly 屬性的控件,需要如何處理?簡述一下思路
- 先修改關閉r eadonly 屬性,然后再操作元素。
需求:給定一個只包含正整數且非空的數組,返回該數組中重復次數最多的前N個數字(返回結果按重復次數從多到少降序), 請用熟悉的語言實現該需求。10分鍾內寫出來
a = [1, 6, 7, 4, 4, 5, 4, 5, 4, 5, 5, 6, 7, 8, 5, 6, 7, 3, 4, 2, 2, 1, 4, 8, 9, 4, 5, 6] def get_datas(a): result = [] data_dict = {} # 鍵值對:鍵:數字,值:在列表中的次數 for item in set(a): data_dict[str(item)] = a.count(item) print(data_dict) # 將鍵值對按值(數字出現的次數)排序 ---從高到低排序 res = sorted(data_dict.values(),reverse=True) for num in res: for key,value in data_dict.items(): # 如果值在列表中不存在,則添加到結果列表中 if num == value and key not in result: result.append(key) return result a1 = get_datas(a)
執行結果:
25、例如: passwd={"admin'":"123321","user1":" 123456"} 滿足一下條件?
- 1、設計一個登陸程序,不同的用戶名和對應密碼存在一一個字典里面,輸入正確的用戶和密碼去登陸,
- 2、首先輸入用戶名,如果用戶名不存在或者為空,則一直提示輸入正確的用戶名
- 3、 當用戶名正確的時候,提示去輸入密碼,如果密碼跟用戶名不對應,則提示密碼錯誤請重新輸入。
- 4、如果密碼輸入錯誤超過三次,中斷程序運行。
- 5、當輸入密碼錯誤時,提示還有幾次機會
- 6、用戶名和密碼都輸入成功的時候, 提示登陸成功!
users = {"admin": "123456", "user1": " 123456"} count = 0 def login(): global count username = input("請輸入用戶名:") if username == None or username == "": login() if username not in users.keys(): print("用戶名輸入不正確,請重新輸入用戶名:") login() while (count < 3): passwd = input("請輸入密碼:") if passwd == users[username]: print("登錄成功!!") count = 3 else: count += 1 print("密碼輸入錯誤,您還有{0}次機會。".format(3 - count)) login()
26、編寫一個程序:---沒弄懂
1、能在當前目錄以及當前目錄的所有子目錄下查找文件名包含指定字符串的文件;
2、並打印出相對路徑。
import os paths = [] def get_paths(dir, relate_dir=None, search_str=None): global paths if search_str == None: return os.listdir(dir) for item in os.listdir(dir): if relate_dir == None: relate_dir == os.curdir if os.path.isfile(os.path.join(dir, item)): if item.find(search_str) != -1: paths.append(os.path.join(relate_dir, item)) elif os.path.isdir(os.path.join(dir, item)): paths = get_paths(os.path.join(dir, item), os.path.join(relate_dir, item), search_str) return paths dir = os.getcwd() search_str = "fun" print(get_paths(dir, search_str=search_str))
27、請寫出下列代碼的運行結果
def f(str1, *args, **kwargs): print(str1, args, kwargs) l = [1, 2, 3] t = [4, 5, 6] d = {"a": 7, "b": 8, "c": 9} f(1, 2) f(1, 2, 3, "python") f("python", l, d) f("python", *t) f("python", *l, **d) f("python", q="winning", **d)
執行結果:
1 (2,) {} 1 (2, 3, 'python') {} python ([1, 2, 3], {'a': 7, 'b': 8, 'c': 9}) {} python (4, 5, 6) {} python (1, 2, 3) {'a': 7, 'b': 8, 'c': 9} python () {'q': 'winning', 'a': 7, 'b': 8, 'c': 9}
28、請寫下列代碼的運行結果
import copy a = [1, 2, 3, 4, ["a", "b"]] b = a c = copy.copy(a) d = copy.copy(a) a.append(5) a[4].append("c") # 請根據以上規則填寫一下輸出內容 print('a=', b) print('b=', b) print('c=', c) print('d=', d)
執行結果:
a= [1, 2, 3, 4, ['a', 'b', 'c'], 5] b= [1, 2, 3, 4, ['a', 'b', 'c'], 5] c= [1, 2, 3, 4, ['a', 'b', 'c']] d= [1, 2, 3, 4, ['a', 'b', 'c']]
29、等長的兩個列表合並到一個字典,要求:合並成{'A': 1, 'B': 2, 'C': 3},請用一行代碼實現
keys = ["A", "B", "C"] values = ["1", "2", "3"] print(dict(zip(keys, [int(x) for x in values])))
30、合並兩個列表並消除重復值
list_1 = ["a", "b", "c", "1", "A", "winning"] list_2 = ["a", "python", "string"] print(set(list_1 + list_2)) # 執行結果:{'c', 'winning', '1', 'string', 'b', 'a', 'python', 'A'}
31、已知一個列表,根據字典中的x ,由大到小排序這個列表
a = [{"x": 1, "y": 2}, {"x": 2, "y": 3}, {"x": 3, "y": 4}] aa1 = sorted(a, key=lambda item: item["x"], reverse=True) print(aa1) # 執行結果:[{'x': 3, 'y': 4}, {'x': 2, 'y': 3}, {'x': 1, 'y': 2}]
32、Html的基本結構是怎么樣的,如何繪制一個2X2的表格
<html> <head> <title>兩行量列的表格</title> -<head> <body> <tatle width="200" border="1"> <tr><td> </td> <td> </td> -</tr> <td> </td> <td> </td> -</tr> -</table> -</body>
</html>
33、寫出語句打印" let's go", she said
print("\"let's go\",she said")
34、請寫一段代碼,隨機生成10個數並寫入文件
import random fs = open("num.txt", "a") list1 = [] for index in range(10): num = random.randint(0, 10) list1.append(str(num)) print(list1) fs.write(",".join(list1)) fs.close()
執行結果:
35、請分別寫出代碼執行結果
a = 1 def fun(a): a = 2 fun(a) print(a) # 執行結果:1
===============
b = [] def fun(b): b.append(1) fun(b) print(b) 執行結果:[1]
36、自動化測試分為哪幾類:AB
- A,UI自動化
- B,接口自動化
- C, Web自動化
- D,終端自動化
37、什么是會話?
- 所謂會話就是session ,而session是一種服務器的緩存技術,由服務器端創建,
- 用戶登錄了系統,一般就會把登錄用戶的信息保存到這個session對象中,然后把此會話對應的id ( JSESSIONID )返回,
- 因此大部分系統都會用到session機制來實現鑒權。Session保存數據方式也是以key-value的形式。
38、什么是token?
- 所謂token其實就是服務器端返回的一個字符串(有點類似於: xys73494954sdhcdr83435這么一串),這個數據是基於什么算法生成的需要找開發確認,一般這個數據是唯一的,服務器每次返回的token都會不一樣。
Token之所以可以用來做鑒權,原理如下:
- 用戶 a 調用了登錄接口 ---》登錄了系統b ---》服務器端生成了一個唯一的 token 信息(假設為c) ,
- 然后會拿用戶的編號id(假設為d)做了一個映射:c - d,
- 然后將這樣的映射關系存到數據庫或 redis 等緩存中,
- 然后再返回這個token給客戶端 ---》客戶端再調用其他需要鑒權的接口時,
- 只需要將緩存起來的這個token帶過去驗證 --》服務器根據此token檢查是否有登錄用戶信息來判斷此請求是否是一個已登錄授權的用戶。( 這里客戶端怎么取到這個token ,怎么存,再次請求時怎么帶過去,上面接口鑒權部分已解釋)。
39、你做接口自動化,項目用的是什么數據庫,用什么來操作的這個數據庫
- Mysql ,可以通過jdbc來實現數據庫的增刪查改等操作。
40、你用過單元測試框架嗎,是什么框架,有哪些常用注解
- 用過, junit (不熟的話就可以不用說) , testng ,這些測試框架都支持我們去定義測試套件,達到管理我們測試用例代碼的作用,同時這些測試框架提供的一些豐富注解不僅能很方便的控制測試用例的執行順序來控制整個測試流程,還能為各種測試場景的實現提供支撐。
常用注解:
- @Test ,用來標記測試方法
- @BeforeSuite ,適合套件的全局初始化,在整個套件執行前先執行
- @BeforeTest ,適合Test測試集的初始化,在測試集執行前先執行
- @BeforeClass ,適合Class測試類的初始化,在測試類被調用時執行
- @BeforeMethod ,適合測試方法執行前的初始化,在測試方法前先執行
- @After... ,對比上面的來回答, 執行順序跟上面的剛好相反,作用適合做一些回收資源。
- @Parameters :參數化注解,方便實現參數化
- @DataProvider :數據提供者,可以用來提供測試用的批量測試數據
41、說說你對接口的理解
- 接口是服務,是功能點實現,是數據傳遞的通道,也是服務器端的一個實現了某種協議(比如http協議.. )和映射機制(當訪問一個urlI時就會通過服務器端的映射處理機制解析后,落到對應的處理函數)的函數,接口參數就是函數的參數,接口的響應數據就是函數的返回值。
41、做過接口測試嗎,有哪些熟悉的工具。
- 做過(即時你之前沒有用過可視化工具做過接口測試,但你現在學了接口自動化測試就算有經驗了)。
熟悉的工具:
- 可視化工具比如: jmeter,postman , soapui等(用過哪些說哪些)
- 代碼: httpclient發包技術來實現接口測試。
42、工具已經可以完成自動化測試了,為啥還要用到代碼去完成?
- 工具做自動化測試依賴和局限性和強,有些工具提供了斷言方法和表達式,但是上手成本高,而且已經提供的現有的斷言表達式可能無法滿足某些特殊規則的數據驗證,而代碼的話就相當靈活更多,斷言方式可以隨便按照自己的想法去設計。
43、請簡單說一說get、post這 兩種請求方法的區別?
Get :
- a. 一般對於從服務器取數據的請求可以設置為get方式
- b.Get方式在傳遞參數的時候,一般都會把參數直接拼接在url上(例如:http://xxx?id=1&type=2 )
- c.Get請求方法可以傳遞的參數數據量是有限的(因為一般參數是拼接在url上,而瀏覽器對於url的長度是有限制的)
- d.Get請求因為是直接將數據拼接在url上,所以安全性不如post強(相對) , 但是get的執行效率要快於post
Post :
- a.一般往服務器提交數據的請求會設置為post方式
- b.Post方式傳遞參數一般都會把參數放在請求體,而不會拼接在url
- c.Post請求方法可以提交的數據量不受限制
- d.Post請求傳參相對於get要安全(相對不是絕對) , 但是post的執行效率不如get。
44、簡述你所知道的延時等待方式
強制等待:
- 也叫線程等待, 通過線程休眠的方式完成的等待,如等待5秒: Thread sleep(5000),
隱式等待:
- 通過implicitly Wait完成的延時等待,注意這種是針對全局設置的等待,如設置超時時間為10秒,使用了implicitlyWait后,如果第一次沒有找到元素,會在10秒之內不斷循環去找元素,如果超過10秒還沒有找到,則拋出異常
顯式等待:
- 也稱為智能等待,針對指定元素定位指定等待時間,在指定時間范圍內進行元素查找,找到元素則直接返回,如果在超時還沒有找到元素,則拋出異常
45、輸出結果是什么?
def f(x, l=[]): for i in range(x): l.append(i * i) print(l) f(2) f(3, [3, 2, 1]) f(3) 結果: [0] [0, 1] [3, 2, 1, 0] [3, 2, 1, 0, 1] [3, 2, 1, 0, 1, 4] [0, 1, 0] [0, 1, 0, 1] [0, 1, 0, 1, 4]
46、你是怎么做接口自動化的?
- 參考答案:會根據接口文檔設計接口用例,然后利用 python 的 requests 庫實現接口請求,利用excel來管理測試數據。並在代碼當中利用 unittest 測試框架實現接口用例的斷言處理。
47、如何用webdriver進行鼠標右鍵點擊操作?
使用ActionChains類
ac= ActionChains(driver);
ac.context _click(元素對象).perform()
48、你在寫自動化框架的時候,測試用例保存到哪里?用什么去讀取?
- 測試用例保存到Excel中,使用第三方庫openpyxI完成對Excel的操作
49、用python寫一段代碼,計算1-1000以內能被7整除,除以5余3的整數,並按行打印
for i in range(1, 1000): if i % 7 == 0 and i % 5 ==3: print(i) 執行結果: 28 63 98 133 168 ........
50、小明有一百元,他想買一百本書,英語書5元一本,數學書3元一本,語文書0.5元一本,請問他有多少種買法。請編程解決這個問題,可以使用任何編程語言,包括偽語言。
根據題意是要買一百本書,一百塊錢,看有多少種買法(錢不一定非要花完 ,只要能買到一百本書) :
三本書的價格分別為: 5,3,0.5,那么能買到最多的數學書為20本,英語書33本,語文書200本。但是也有組合的買法,所以可以通過一個三重for循環來實現, ijk分別代表購買數學,英語,語文書的數量,循環條件分別是i<=20,j<=33,k<=200,那么只要滿足 i+j+k == 100,5*i+3*j+0.5*k<= 100即可。最后統計所有的組合就是買法的數量。
n = 0 for i in range(21): for j in range(34): for k in range(201): if 5 * i + 3 * j + k * 0.5 <= 100 and i + j + k == 100: n += 1 print(n)
51、使用monkey測試到了bug怎么提交的?
- monkey對APP進行我們在測試的時候,會利用adb shell monkey-p包名-f腳本-V-V -v >D:log.txt把日志輸出到本地,並且將出現錯誤時候的日志截圖,把日志截圖以及bug描述提交到禪道,指派給對應的開發。但是在提交bug之前會手動去重現下這個bug。
52、在一個HTML頁面中想要創建超鏈接, 有哪種實現方法?
- 超鏈接:<a href="網址”target=". blank">內容</a>
- target="_ blank"為新窗口打開。
- JS跳轉鏈接:<a href="#" onclick="javascript:location.href='網址";">內容</a>
- meta 標簽跳轉鏈接:<meta http-equiv="refresh" content="3;URL =網址">
- (數字3為秒)
53、下面哪些關於自動化測試的說法是錯誤的: (ABCD )
A、自動化測試可以完全取代手工測試
B、自動化測試可以大幅度減少測試團隊的工作量
C、性能測試不能自動化
D、自動化測試能夠發現大量的新缺陷
Python中自定義的函數如何傳遞動態參數?
- 參數使用*args或者*kwargs
55、什么是lambda函數?它有什么好處?
- lambda函數:沒有函數名稱,是匿名函數。
- 好處:只做簡單運算,接收任何多參數並返回值,沒有復雜的函數體。可以作為回調函數,傳遞給某些應用,比如消息處理.
56、Python語言中子類如何調用父類的構造函數?
- 如果子類沒有定義構造函數,則子類默認會調用父類的構造函數;
- 如果子類定義了構造函數,那么在子類的構造函數中,調用父類的構造函數: python3中,使用super()._ _init_ _()
57、已知L = ["a", "b", "c", "d", "e", "f", "g"],則L[3]的值是_ L[::5]的值是__L[::2]值是_
L = ["a", "b", "c", "d", "e", "F", "g"] print(L[3]) print(L[::5]) print(L[::2]) 執行結果: d ['a', 'F'] ['a', 'c', 'e', 'g']
58、已知列表x=[1, 2],那么表達式 list(enumerate(x)) 的值
x = [1, 2] a1 = list(enumerate(x)) print(a1) # 執行結果:[(0, 1), (1, 2)]
59、查看變量類型的python內置函數是 type
60、查看變量內存地址的python函數是 id
61、表達式sum(range(1, 10, 2)) 的值為25
print(sum(range(1, 10, 2))) # 各兩位取一個之和:1,3,5,7,9 # 執行結果:25
62、Python的有序序列是:列表、元祖、字符
小飛飛買好多瓶子,每對瓶子上會有一個相同的數字。小飛飛數了一遍自己的瓶子發現瓶子的個數是奇數N ,也就是有-個沒有配對的瓶子。現在小飛飛要去再拿一個新瓶子,請問他給新瓶子要標幾號才能讓所有瓶子都有配對的。比如說他有七個瓶子( N=7 ),那么標號可以是:1,6,13,1,6,13,13
那么新瓶子就要標記為13,加入后就有(1,1),(6,6),(13,13),(13,13 )這4對
輸入:測試數據的第一行一個正整數 N (1<=N<=1000 )表示有N個數, N保證是奇數,第二行N個自然數,每個數都小於10^9
輸出:輸出一行一個整數,新瓶子的號碼
樣例:
- 輸入:
- 9
- 121233441
- 輸出:1
def func(n, data): if 0 <= n <= 1000 and n % 2 == 1 and len(data) == n: for i in data: if 0 < i < (10 ** 9): if data.count(i) % 2 != 0: return i else: print("瓶子的號碼值為自然數,並且小於10^9") else: print("傳入的參數有誤") res = func(7, [1, 6, 1, 6, 13, 13, 13]) print(res)
63、用python寫一個函數,將一個字符串中給定的子串字符按從小到大的輸出,第一個字符的位置為0
- 如: myOrder( abejykhsesm',2,5)
- 輸出: ehjky
def my_order(s, start, len): # 先切片 s = s[start:start + len] # 強制轉換為列表 li = list(s) # 排序 li.sort() # 在拼接為字符串 res = "".join(li) print("輸出結果為:", res) my_order("abcedfgh", 2, 4) 結果為:cdef
64、對輸入的整數數組,輸出數組元素中的最大值、最大值的個數、最小值和最小值的個數
函數名稱: max_ and_ min(list)
輸入參數: list整數數組
輸出: list整數數組,有四個值,分別表示最大值、最大值的個數、最小值和最小值的個數
- 示例: max and. min([1,4,21,5,6,1,1]) => [21,1,1,3]
- max_ and. min(1]) => [1,1,1,1]
def max_and_min(a): b = sorted(a, reverse=True) max = b[0] max_num = b.count(max) min = b[-1] min_num = b.count(min) return [max, max_num, min, min_num] a = [5, 5, 5, 4, 3, 2, 2] print(max_and_min(a)) # 執行結果:[5, 3, 2, 2]
65、字符串右補齊,根據len長度補齊str到src中
函數名稱: rpad(src,len,str)
輸入參數::src原字符串, len目標字符串長度, str用來填充的字符串
輸出:補齊后的字符串
示例:
- rpad ("abcd",10,"12") =>"abcd121212"
- rpad ("abcd",11,"12") =>"abcd1212121"
- rpad ("abcd",10,"12") =>"abcd121212”
- rpad ("abd",12,"0") =>*"bd0000000”
- rpad ("abcd",12,") =>"abcd
def rpad(src, length,string): while len(src) < length: for i in string: src += i if len(src) >= length: return "" + src else: return "" + src print(rpad("abcd", 10, "12")) # 10位 print(rpad("bbbb", 11, "12")) # 11位 print(rpad("cccc", 12, "12")) # 12位 print(rpad("dddd", 13, "0")) # 13位 print(rpad("ffff", 13, " ")) # 13位有空格 # 執行結果: abcd121212 bbbb1212121 cccc12121212 dddd000000000 ffff
66、基於Web端呈現的產品可以如何做自動化測試,談談你的思路和方向。
參考:
- web端的自動化測試,基本就是模擬手工測試人員來做功能測試。
- 用機器的自動執行代替人的操作。
- web端呈現的產品有兩個方向可以做自動化測試:接口層和界面操作層,且接口層自動化的比例要高於界面操作層。
- 並且主要對產品穩定的功能進行自動化測試,主要用於產品的核心功能冒煙測試、回歸測試。
- 從系統最最核心的功能開始做,再根據情況慢慢鋪開。
67、請描述實現用戶登陸模擬自動化測試的思路
參考:
基於用戶登陸的自動化測試思路:
- 使用 python+selenium 框架來編寫登陸的所有測試用例,
- 使用unittest框架來組織測試用例。
- 使用Htmltestrunner來形成html版的測試報告,並使用郵件模塊來發送測試報告給項目組相關人員。