來,一起做個測試小工具
- 2019 年 10 月 6 日
- 筆記
曾經我們測試組有幾十條甚至近百條的測試腳本,每次測試都在茫茫腳本海中尋求自己所需的那一個……
有一天,我們突發奇想,為什麼不給它們穿上「衣服」,讓它們「可視化」。
預覽
hello, hello, 不知道大家記不記得曾經的《小白的極簡介面「自動化」》那篇文章。文中用到的介面是這樣子的一個get請求
http://notify.mse.sogou.com/weather?city=天津
今天我們談一下它的進階,給這個極簡腳本「穿上衣服」,變成一個有介面的工具。
是不是已經不像是一個腳本了呢,可視化之後通用性更強了,甚至可以讓產品、運營等不懂程式碼、不會抓包的同學排查常用的用戶介面的問題。

No.1
準備腳本
這次我們要做的這個介面測試/驗證的腳本生成就不詳細說明了,通過Postman就可以生成一個。
小編經常折騰各種語言,對比C/C++、Java、Python這四個使用率最高的語言,在做介面上,Python可以說是最簡單的了。
所以本文也就用Python語言生成腳本,然後封裝成一個類。
# -*- coding: UTF-8 -*- import requests class WeatherTest: def __init__(self): self def testWeather(self, city): url = "http://notify.mse.sogou.com/weather" querystring = {"city": city} headers = { 'User-Agent': "PostmanRuntime/7.16.3", 'Accept': "*/*", 'Cache-Control': "no-cache", 'Postman-Token': "de3c837b-6f0c-48c8-a49d-1ca310c98917,d028ac2b-f12f-4fbd-ab4a-2aabfb32ab13", 'Host': "notify.mse.sogou.com", 'Accept-Encoding': "gzip, deflate", 'Cookie': "IPLOC=CN1100", 'Connection': "keep-alive", 'cache-control': "no-cache" } response = requests.request("GET", url, headers=headers, params=querystring) print(response.text)
No.2
「畫」介面
雖然Python用PyQt完成介面十分簡單,但是也依賴一些插件。
這裡我們需要安裝兩個插件Qt Designer和PyUIC。Qt Designer可實現拖拽控制項生成介面,避免了複雜的布局管理,而PyUIC可將Qt Designer拖拽生成的.ui文件轉化為.py文件。之後直接將轉化得到的.py文件引入到Projects裡面就可以了。

用Qt Designer,通過簡單的控制項拖拽就可以生成一個工具的小介面了

No.3
事件綁定
事件綁定的目的是將介面上的控制項和執行層面的方法結合起來。這樣就能做到點擊→觸發→輸出→展示的過程了。
0.介面初始化
目的:
A. 給下拉列表增加選項
B. 將輸出流重定向到文本區域
C. 指定按鈕事件對應的方法
def __init__(self,): super(MyWindow, self).__init__() self.setupUi(self) # 添加下拉列表選項 self.comboBox.addItem("北京") self.comboBox.addItem("上海") # 此處省略了部分item的添加code # 重定向輸出流 sys.stdout = EmittingStr(textWritten=self.outputWritten) sys.stderr = EmittingStr(textWritten=self.outputWritten) # 綁定按鈕事件 self.pushButton.clicked.connect(self.buttClicked)1.綁定按鈕事件 - 獲取參數&觸發請求
目的: 將腳本封裝的類中對外輸出的方法與按鈕的點擊事件綁定,即點擊按鈕觸髮腳本執行。
def buttClicked(self): test = WeatherTest() selectedCity = self.comboBox.currentText() test.testWeather(city=selectedCity)
2.重定向輸出流 - 展示在文本區域內
目的: 將輸入輸出流指向文本區域,並在文本區域添加滾動條。
def outputWritten(self, text): cursor = self.textBrowser.textCursor() cursor.movePosition(QtGui.QTextCursor.End) cursor.insertText(text) self.textBrowser.setTextCursor(cursor) self.textBrowser.ensureCursorVisible()
No.4
運行
運行程式之後,選擇一個城市,點擊按鈕就能看到介面請求的結果了~

到這裡,這個簡單的小腳本有了「衣服」,客戶端的測試同學們也可以輕鬆地看到一些看不到的服務端介面(如服務端系統和系統之間的介面)的詳細資訊。當然這個可視化的頁面還只能算是及格,它還能夠通過進一步擴展腳本、優化介面增添更多對這個介面不同層次的檢查點。

Ending
本文只是一個極簡「小教程」,測試工具、自動化腳本可遠遠不止於此。
小編想通過這篇文章分享一個思路: 用可視化的方法把常用的介面腳本、資料庫腳本甚至伺服器腳本封裝起來,開發成本並不高且能很大提高通用性和效率。
對於測試工具,小編做東西有兩個原則一是盡量通用和易擴展,另一個原則就是在力所能及之外多加至少1點。在沒有這1點的想法時,可視化介面就可以算是這額外的1點,多1點開發會方便更多人使用;多考慮至少1點,也督促自己每次都能在開發時學到新的東西。
PS. 對於介面的深入是很難的,學過Swing並用它寫過介面的人都吐槽又丑又難寫。但是,小編曾經看過一個介紹,JetBrains系列(Intellij IDEA, Pycharm, DataGrip)就是 Swing 開發的。
UI實現這個東西是門檻低,但是瓶頸也很高很長的。