Python+unittest+requests+HTMLTestRunner介面自動化測試框架
簡介:
在介面測試工作中為大家所熟知的工具有很多,如postman、soupUI、jmeter、RF框架......,其大多使用簡單且功能強大,但為何還要進行介面測試框架的開發呢?原因如下:
1、測試資料不可控,無法進行資料的初始化操作或操作較複雜
2、對於加密介面限制較多
3、擴充套件能力不足,測試報告的多樣性收集及持續整合能力較弱
介面自動化測試框架搭建:
1).unittest 是來解決用例的組織與執行
2).HTMLTestRunner 基於unittest單元測試框的擴充套件,生成HTML測試報告,可以自己定製
3).requests 傳送HTTP介面的庫,主要是對post,get,PUT, DELETE, HEAD等請求的模擬
步驟一:安裝Python
Python下載地址:https://www.python.org/downloads/
可自行選擇python 3.x的版本進行安裝,當前選擇的版本為python3.6
步驟二:安裝requests擴充套件庫
可下載安裝:https://www.pypi.python.org/pypi/requests/
也可線上安裝(cmd 命令列執行):pip install requests
步驟三: 安裝xlrd庫 和 xlwt庫
線上安裝:pip install xlrd/xlwt
步驟四:安裝HTMLTestRunner擴充套件
下載地址:ofollow,noindex">http://tungwaiyip.info/software/HTMLTestRunner.html
將下載的HTMLTestRunner.py檔案放在python安裝目錄的...\Lib目錄下
以下是HTMLTestRunner.py針對Python 3.x版本需要修改的地方(轉自:部落格園-微微笑):
問題一:No module named StringIO
原因:python 3 中 沒有 StringIO 這個模組。這裡我們需要使用io 這個模組來代替。
解決方法:
第94行引入的名稱要改,從 import StringIO 改成import io。
相應的,539行 self.outputBuffer = StringIO.StringIO() 要改成self.outputBuffer = io.BytesIO()
問題二:AttributeError: 'dict' object has no attribute 'has_key'
原因:python 3 字典型別的object 已經不支援 has_key函式,我們需要使用in 來進行遍歷。
解決方法:
定位到642行,if not rmap.has_key(cls): 需要換成 if not cls in rmap:
問題三:'str' object has no attribute 'decode'
原因:python3 裡面對字元的操作中,decode已經拿掉了。
解決方法:
定位到772行,把 ue = e.decode('latin-1') 直接改成 ue = e 。
另外766還有類似的uo = o.decode('latin-1'),改成 uo=o ;
問題四 :TypeError: can't concat bytes to str
原因:定位一下,報在了778行的內容escape(uo+ue) 。這是因為我們上面給uo賦值的時候,走的是else流程,uo被賦值的是bytes型別的值。 而bytes型別不能直接轉化為str型別。所以我們需要在前面給uo賦值的時候先將bytes型別轉換為 str型別。
解決方法:
修改768行的 uo = o ,直接改成 uo = o.decode('utf-8') 。
另外 774還有類似的 ue = e, 改成 ue = e.decode('utf-8')。
問題五:TypeError: unsupported operand type(s) for >>: 'builtin_function_or_method' and 'RPCProxy'
原因: python3 不支援 print >> sys.stderr 這種寫法,這裡定義輸出流的話,採用print("This is print str",file=sys.stderr) 這種方式。
解決方法:
定位到631行,把print的語句修改掉,原來是print >>sys.stderr, '\nTime Elapsed: %s' % (self.stopTime-self.startTime), 可改成 print('\nTime Elapsed: %s' % (self.stopTime-self.startTime),file=sys.stderr)
問題六:TypeError: 'str' does not support the buffer interface
原因:定位一下,問題出在118行,這裡s是str型別,我們需要把傳過來的s轉化為bytes型別。
解決方法:
定位到118行,把 self.fp.write(s) 修改為 self.fp.write(bytes(s,'UTF-8')) 即可。