題外話
測驗入門
很多受過高等教育的大學生經常問要不要去報測驗培訓班來入門測驗,
答案是否,
高等教育的合格畢業生要具備自學能力,如果你不具備自學能力,要好好地反省一下,為什么自己受了高等教育迷戀于各種入門級別的培訓?是沒有毅力還是不知道學習方法?
沒有毅力的話,要自己多看些勵志的書,多想想社會的殘酷,親人的失望等來勉勵自己,畢竟企業多半也不會喜歡懶散的人的,
不知道學習方法的話,讀《軟體評測師教程》(國內軟體評測師教材),《Software Testing Foundations 4th》(強烈推薦 國外測驗認證ISTQB教材),《谷歌測驗之道》是通常比培訓機構更好地入門測驗,
以上書籍及測驗標準等后續將陸續上傳:https://github.com/china-testing/python-testing-examples

我身邊碰到比較有水平的軟體測驗,沒有一個是什么石、testing、林、鳥、*內等入門測驗的,而且這些機構經常打著包就業的名義騙人去培訓,培訓的老師通常口才很好,善于包裝,但是關鍵的一點,這些老師多數自己都不是合格的測驗,培訓完之后有些學生重學幾次又無法就業,甚至出現學生和培訓機構對簿公堂的情況(這種情況通常是培訓機構敗訴,如果你身邊有這樣的被騙朋友可以建議他們先交涉不行再找律師保護自己),
物體培訓業尤其成為打著就業的幌子進行行騙的重災區,導致現在主流企業一看到有某些機構經歷的簡歷直接連面試機會都沒有了,
當然不是一棍子打死所有的測驗培訓,比如斯特沃克的培訓,google的gtac等分享是做得相當不錯,建議自己先對測驗有一定的了解,了解測驗培訓授課老師的水平之后再選擇培訓,盡量自學為主,在身邊找有經驗的實際測驗人員稍微帶下,
測驗的方向整體是功能測驗的作業崗位逐漸減小,facebook就沒有測驗人員,google也沒有專職的功能測驗,功能測驗由開發、產品、用戶等分擔會降低溝通等成本,未來的測驗人員更加需要開發技能,
對于太極,推拿之類的,視頻是很好的學習方法,但是對于軟體自動化測驗,最好的學習方法不是聽課,也不是看視頻,而是在有經驗的專業人士指導下進行專案實戰、發現問題、解決問題,實戰實戰再實戰!
本人曾在公司專案中曾手把手教剛畢業的毫無編程基礎的技校生介面、性能、自動化等測驗,結果3個月之后他們都跳槽,薪水從4k漲到10k以上(2015年),
自動化測驗進階
IT主要技術體現大多先用英文描述,要想提升到比較高的水平,必須要有流利的英文閱讀能力,
搜索引擎方面要珍惜生命,遠離競價排名,做個有良知不受騙的人,從不用死不悔改的*度開始,優選google,其他的還有 必應 雅虎 oscobo, 很多QQ群還有免費fanqiang工具,google的搜索通常能直中目標,stackoverlow的回答通常是首選方案,
選擇有水平的業內人士幫助是掌握linux、python和測驗基礎之后一個迅速提升的方法,
自動化測驗的層次

從圖看出自動化盡量以單元、介面為主,如果你有志在自動化測驗深入,還在死磕QTP,selenium等的話,建議看下pytest、pexpect、API測驗、單元測驗等,
腳本
1-1 不要在實際專案中使用錄制和回放
大多數自動化工具(特別是商業工具)具有記錄和播放功能,這個功能的表面簡單,實際有陷阱,錄制和回放在廣告視頻和演示文稿中看起來非常棒,但錄制的腳本不使用變數,回圈和條件,自動創建的程式和函式的名稱通常不直觀,通常所有操作都錄在一個函式中(可能很大),執行不穩定,維護成本也高,
- 錄制和回放適用點
- 在學習自動化工具
- 不重用的作業
- 很難識別和處理的控制元件
1-2 不要使用暫停
暫停,比如python中的:
import time
time.sleep(5)
定義全域變數可以避免大量代碼修改,如下
WAIT_TIME = 5
...
time.sleep(WAIT_TIME)
上述等待不利于快速執行,較快出現的控制元件同樣需要常見等待,等待物件或物件屬性是更好的選擇,比如selenium中的顯式等待:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
又如selenium中的隱式等待:
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
以WebDriverWait一定的時間間隔檢查物件的存在(例如每秒一次),如果象出現,則回傳true,如果物件在timeout引數指定的時間內沒有出現,則回傳false,因此,如果控制元件一秒鐘內出現,那么等待時間將會是 1秒,
當然短時間的等待,有時也是必要的,比如降低CPU使用率,短時間等待狀態改變等,
1-3 在回圈中超時退出
以常量的形式定義超時,例如定義兩種型別的短超時(3秒)和長超時(3分鐘),
1-4 不要將自動化測驗完全等同于開發
雖然自動化需要編程技巧,但它通常不是完整的開發專案,自動化常由初級程式員開發,因為作業簡單得多,并一般為內部需求,在99%的情況下不需要大多數設計模式,在使用資料庫時不會使用事務,測驗資料量一般不會很大,
代碼要力求簡單,快速開發,即使使用了行為驅動開發(BDD:behavior-driven development)或關鍵字驅動的測驗(KDT:keyword-driven testing)等方法也要盡量保證代碼簡單,
1-5 不要寫復雜的代碼
在使用條件和條件時,盡量遵循“不超過三個嵌套級別”的規則,
代碼嵌套超過三層非常難以除錯,寧肯代碼多重復也不要嵌套超過三層,
1-6 驗證邏輯條件的所有選項
if A and B or C:
# if (A and B) or (C and D)
定要檢查這些代碼的每個條件(在這個例子中的A,B,C)和所有可能的True和False,添加括號能增加可讀性,
1-7 使用編程規范
初學者通常不太關注變數和函式的名稱使用任何規則,盡管如此,幾乎所有的語言都有所謂的編碼標準,比如python的PEP8, google的編程規范,
在大專案中這些標準成為強制性規則,方便互相理解代碼,
1-8 使用靜態代碼分析器
對于流行的編程語言,有特殊的代碼分析器,例如Python的pylint,JavaScript語言的jslint等,
特別指出對python這樣的動態型別的語言更加重要,
pylint通常有很多誤報,但是mypy的檢查則比較實用,參考:python代碼分析和lint,
1-9 隨機
比如打開選單有快捷鍵、下拉選單、圖示等多種方式,盡量寫方法隨機呼叫各種方式,以求覆寫各種場景,不過要記得添加日志以便跟蹤錯誤,
1-10 不要使用坐標
非標準控制元件盡量不要使用坐標,可以用影像識別的方法:
Window.Toolbar.Click(135, 15)
替換為:
toolbar_click_button_by_image(Window.Toolbar, "Button Caption")
1-11 學習和使用庫
比如:
full_name = '{0}\\{1}'.format(file_path, file_name)
在linux上就比較尷尬,可以替換為:
full_name = os.path.join(file_path, file_name)
附: python自動化測驗開發庫
1-12 避免復制和粘貼
復制的代碼維護成本很高,盡量提取為公共庫,
公共測驗庫示例
1-13 例外捕捉到具體的類
例外通常是程式考慮不周到才會發生:
try:
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x/y
except Exception as e:
pass
上述捕捉所有例外并忽略例外的代碼通常只在臨時代碼中使用,通常也要把例外例外資訊顯示出來,比如
import sys
try:
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x/y
except Exception as e:
print e
for item in sys.exc_info():
print item
又如:
import traceback
import cv2
import numpy as np
def raw2jpg(filename, height=480, width=640):
try:
img = np.fromfile(filename, dtype=np.uint16)
img = img.reshape( (height, width) )
img.astype(np.float)
img = np.sqrt(img)
img = img * (255 / img.max())
#img.astype(np.uint8)
cv2.imwrite(filename+'.jpg', img)
except Exception as info:
print('Error: {}'.format(filename))
print(info)
traceback.print_exc()
return False
return True
更佳的方式是捕捉到具體例外:
try:
x = input('Enter the first number: ')
y = input('Enter the second number: ')
print x/y
except ZeroDivisionError as e1:
print("ZeroDivisionError")
except TypeError as e2:
print("TypeError")
另外一種例外處理方式:
far = 0 if not no_number else far_number/float(no_number)
1-14 代碼與資料分離
對于小資料集可以使用陣列或串列,大資料可以使用資料驅動測驗(DDT:data-driven testing),資料源可能為資料庫,Excel或CSV檔案等,
注意點:
- 以讀模式打開資料檔案,
- 每列只存盤一種型別的資料,在資料庫的情況下,
- 用完關閉與資料源
- 資料檔案中不要用空行
1-15 除錯
簡單的可以多使用print或者logging列印一些資訊,更高級的內容有
?斷點 ?單步執行 ?查看本地和全域變數的值 ?觀察變數和運算式
1-16 不要為未來撰寫代碼
專案的變化是很頻繁,可以做一些自動化測驗的技術預研,但一般不要書寫有些只供未來使用的代碼,
1-17 讓代碼更好
在不影響性能的情況下提高可讀性,
1-18 測驗選擇適當的語言
語言上手的難易程式和流行度及庫支持,一般而言python因為其容易上手、是膠水語言(與其他語言呼叫方便)、語法簡潔、維護成本低、方便除錯,是目前自動化測驗占有率最高的首選語言,但是c#在windows平臺、java、c++等也有一定的市場,雖然python的占有率最高,但是一定要考慮到有些自動化測驗開發可能已經有c++,go,java之類的現成的工具,
盡量不要使用新的編程語言, 咨詢開發,可以和開發采用同一種語言,尤其是單元測驗,一般為采用和開發一樣的語言,
值得注意的是TCL(Tool Command Language)早起因為expect的命令自動化擁有一定的名聲,且testcenter、smartbits等儀表一度不支持python等主流語言,但是TCL的語法晦澀,功能弱小,是能不用就不要去用的語言,
參考資料: 編程流行度 tiobe
1-19 使用變數前要初始化
這個在python中可以用mypy檢查,
測驗最佳實踐
2-1 不要實作被測應用的功能
因為:
?計算和邏輯可能很復雜,且開發已經實作了 ?計算和邏輯可能會更改 ?使用浮點數的精度可能和語言有關,
白盒和灰盒測驗中一般是知道輸入和預期結果就好,不要知道具體內部實作程序,
例外:大資料、搜索引擎中間演算法等不明確預期結果的測驗,經常用python快速實作一遍,與開發用c++等語言實作得結果進行比對,
2-2 測驗的獨立性
2-3 哪些不應該自動化
主要是基于成本考慮
?難以維護的自動化, ?盡量多做單元測驗和介面測驗的自動化,少做UI層的自動化 ?重復使用次數不多的自動化
有些手工不能做的必要測驗,即便自動化的成本很高,也是需要自動化,
2-4 向開發人員尋求幫助
開發在具體的開發方面可以值得學習,但是在自動化測驗很方案方面自己定奪比較好,比如結果驗證,開發大多喜歡直接從資料庫中讀資料,但是實際上展示資料庫資料的應用也是可能出問題的,
2-5 云測驗
云測驗
?要測驗桌面應用程式,必須打開會話,作業系統是否支持 ?硬體相關的測驗云測驗支持并不方便, ?移動設備的云服務通常比較貴 ?Web應用程式的自動化比較適合在云中執行, ?手機兼容性的測驗可以考慮云,功能自動化測驗則不用云比較好,
2-6 充分利用邊界值和等價類
2-7 錯誤與警告
注意區分自動化測驗平臺或工具的錯誤和被測應用的bug,
2-8 使用合適的技術
在測驗自動化中使用了許多特定的方法:ODT,DDT,KDT,BDD,頁面物件,基于模型的測驗等等,比如那么對KDT一般需要一部分寫測驗平臺,一部分寫測驗庫,一部分寫測驗用例,
2-9 特殊錯誤的驗證
可以書寫一個臨時的測驗來處理某些特定的bug,
2-10 在寫真實測驗之前做POC
環境
軟體測驗自動化中有兩種主要的環境型別,一個創建和除錯測驗,另一個用于運行測驗,
3-1 為您的需要選擇一套適當的工具
以介面自動化測驗為例,一些團隊,執著的認為java是最好的語言,要用java去發HTTP請求,更有甚者,用jmeter去做介面自動化測驗,不排除個別場景,這可能是合適的方式,但是通常的HTTP介面測驗,用requests,代碼行數通常比java少一個數量級,還不用編譯,
python是主流語言中的膠水語言,和其他語言配合都比較完美,通常情況下是自動化測驗的首選語言,但是python未必適用所有地方,還需要其他工具和語言進行補充,不過不要太多,學習很多語言也是一件痛苦的事情,
現在還有很多培訓機構在鼓吹UI自動化就是自動化測驗的全部,一說自動化就是QTP,一問Selenium,Testcomplete之類的都不知為何物,更不用說什么junit,pytest之類的了,
3-2 慎用自動提交bug
配置錯誤,測驗代碼錯誤經常導致測驗失敗,
測驗代碼有時難以描述清楚測驗步驟
注意不要提交重復的bug,
在沒有十足的把握的情況下可以用半自動的方式,發送郵件給測驗人員,然后又測驗人員提交bug,
3-3 不要使用欺騙的結果
避免注釋測驗代碼的問題部分或改變預期的結果,以便測驗不會出現失敗,
如果實在用禁用,要知道禁用用例的比例,后面定期檢查修改,
3-4 熟練使用工具
比如wingide中Ctrl + \為注釋代碼的快捷鍵
3-5 使用版本控制系統
避免檔案丟失,方便協作,盡快使用hg、git之類的,
3-6 避免自定義表單
本來自動化就是為了把頁面的東西盡可能走后臺,你為了取悅領導(附:大陸目前多數測驗領導是不太合格的)還是什么原因,搞成形式主義了,當然資料報表是另外一回事,
引數可以用組態檔等方式,
3-7 自動化所有能自動化的東東
比如:測驗,代碼,測驗環境,虛擬機,SQL查詢,測驗資料,報告等等
運行,日志記錄,驗證
4-1 盡可能經常運行腳本
4-2 測驗失敗時重新執行
當出現錯誤時應用程式運行很長一段時間,或特定情況下要盡量定位問題,
一般而言失敗的測驗先記錄下來,所有測驗執行完之后在重新執行一次,
4-3 豐富的日志內容
錯誤日志盡量包含:預期值,實際值,地點和操作,
引數盡量用引號等括起來,以免把包含空格的引數當成多個引數,
4-4 截圖
UI測驗必要的時候可以截圖,同時處理好滾動,
4-5 盡量避免比較影像
審查
審查是保持碼清晰易懂的好方法,要做代碼的互相評審,
5-1 讓非自動化者也可以看懂代碼
def test_login(url, user, password, text):
open_page(url)
login_as(login=user, password=password)
verify_page_opened(text)
5-2 避免不必要的優化
在開始執行任何優化之前如需要慎重考慮,
通常不需要的優化作業看起來像這樣:
1.應用程式啟動3秒鐘,然后進行5秒鐘的測驗腳本填充搜索欄位,還有5秒鐘搜索程序,之后腳本用1秒鐘讀取找到的資料并進行驗證, 2.測驗人員開始優化讀取和驗證 3.測驗人員花費一天時間進行優化并達到目標:閱讀和閱讀每次運行時間為半秒
事實上,測驗工程師的代碼生產力已經翻了一番,但是結果是他整體方案取得了約5%的收益,花一天時間是不值得的,一般需要綜合考慮,涉及腳本、被測應用、環境、執行頻率等,
建議你在兩種情況下優化測驗:
?如果測驗運行時間過長,并且測驗的應用程式是在測驗執行期間空閑, ?如果您在代碼中看到明顯的問題,請更正其中的問題,
pandas大資料分析性能優化實體-read_csv引擎和分組等,這里是一個必要的優化實體,
5-3 定期審查別人的代碼
定期審查別人的新代碼,可以結對編程,甚至是同時一個人寫,一個人看,
5-4 參與論壇和討論
如果您是自動化領域的初學者,并且在自動化團隊中作業,那么會從你的同事那里學到很多東西,如果你是唯一的自動化工程師在公司或你的部門沒有人能幫助你?
stackoverflow等社區常常可以找到自己問題滿意的答案,同時試圖幫助別人也可以擴展自己的眼見,
5-5 執行重構
重構是對現有代碼的簡化,功能和應用程式不會改變,盡管測驗自動化中的代碼通常很多實際應用更簡單,有時候你仍然需要重構,
?您可能會發現您所支持的代碼太復雜, ?可能有撰寫新測驗的請求,需要修改代碼 ?可能需要重構來改進已撰寫的代碼
重構后可以執行所有測驗來驗證,也可以在公共庫等地方添加必要的單元測驗,
5-6 洗掉低收益的測驗
?測驗執行了多少次; ?測驗發現了多少實際問題; ?測驗需要多久進行一次維護,
參考資料
-
本文涉及的python測驗開發庫 請在github上點贊,謝謝!
-
python精品書籍下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
-
本文英文原版:
Software Testing Automation Tips 50 Things Automation Engineers Should Know.pdf https://url97.ctfile.com/f/18113597-843298101-6b3224
訪問密碼在公眾號 輸入 密碼 即可獲取,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/551103.html
標籤:其他
下一篇:返回列表
