上篇介紹的使用python自帶tkinter包,來寫帶界面的工具。
此篇介紹使用pyqt來開發測試工具。
tkinter的好處是python官方自帶,上手容易(但手寫控件復雜),布局和擺放都不直觀和容易,因為是像素坐標定位,需要花較長時間在界面開發上。pyqt是第三方gui開發工具,是目前公認的python上最好的客戶端界面開發工具,因為控件是通過qt設計師的手動拖拽,調整顏色 字體 大小等樣式也很簡單,不需要去代碼層面來寫大量界面代碼,真正的所見即所得。
學習pyqt需要安裝這些文件,pyqt是python第三方包,eric是qt設計界面,sip在工具打包時候需要用到。
安裝好環境后,雙擊運行eric4.bat文件(我這里是eric4版本)
運行eric4.bat文件后的界面,點擊designer圖標,進入qt設計視圖
此圖為qt設計師界面
通過拖拽左側的控件列表中的元件到ui中就可以。布局完成界面達到滿意的效果后,點擊菜單欄的文件另存為,保存為ui文件,文件后綴默認是.ui。
使用cmd 命令將.ui文件轉換為.py文件,命令是
pyuic4 -o syui.py suoyouxiangmu.ui
前面是py文件名稱,后面是剛才保存的ui的文件名,執行此命令后會看到文件夾多了一個叫syui.py的文件。
打開文件,可以看到文件的大致內容,截圖如下
要想把從ui轉換得到的py文件,顯示出界面來,還需要加入代碼
不過,強烈建議不要這么寫,不要把工具的功能代碼和ui轉換得到的py代碼寫在一個文件,因為在開發工具時候可能經常用調整界面不斷的把ui轉換成py代碼 ,如果代碼寫在這文件,那么之前寫的功能代碼將會被覆蓋了,把紅框子中這段代碼和后代功能代碼寫在另外一個文件。
pyqt中將一個函數和按鈕綁定的語法是 mainwindow.pushButton_2.clicked.connect(function)
下面介紹一些獲取控件的值和給控件賦默認值的方法
mainwindow.lineEdit.setText((u"zg 額外abc")) #給輸入框賦值
mainwindow.textEdit.setPlainText('') #給texedit賦值
mainwindow.comboBox.setCurrentIndex(2) #給下拉框賦值
mainwindow.checkBox.setChecked(1) #給復選框checkbox賦值,可以填寫True或者False 或0 ,1
print unicode(QString(mainwindow.lineEdit.text())) #獲取輸入框的值
unicode(QString(mainwindow.textEdit.toPlainText()))#獲textedit的值
print unicode(QString(mainwindow.comboBox.currentText()))#獲取下拉框的值
print mainwindow.comboBox.currentIndex() #獲取下拉框的index
if mainwindow.checkBox.isChecked()==True 獲取復選框checkbox的值
功能代碼該怎么寫就怎么寫,與普通純腳本的代碼沒有區別。如果事先把后台腳本功能寫好了,加入到界面來只需要花很少的時間。需要說明的是,一些執行時間比較長的函數例如循環requests,或者接口的本上響應時間很大,需要用到Qthread子線程,否則使用普通的函數會把客戶端界面卡死一段時間直至函數運行結束。
下面來展示我使用pyqt做的幾個工具。我這幾個工具,都是左邊界面右邊控制台顯示的形式,非常方便在一個界面就能看到運行結果,不需要在界面操作然后去python ide的控制台去看結果。
此工具是將字符串進行base64編碼或解碼的工具,因為我們公司的接口都是前端傳json的base64編碼字符串給后台,后台再進行base64編碼的形式,在做測試時候,經常會發來base64加密的字符串,如果不解密完全看不懂請求的什么意思什么功能。如果你抓我們公司項目的登錄接口的包,會完全不知所措,因為大多數web都是抓包出來可以看到 username:xxxxx password:xxxxx yanzhenma:xxxxx的形式,我們公司的需要base64解碼后才能看得到鍵值對,因為如此原因所以做了一個工具;雖然網上大把的各種轉碼網站,但每次用時候去打開一個網頁不方便,此工具是引用了python 自帶的base64包,不然我自己寫代碼轉換base64,也不知道base64到底是怎么個編碼規則的。
此工具是接口測試,進行get 和post請求,類似postman的功能和jmeter的接口測試功能。工具在后台代碼中已處理cookie,只需要執行一次登錄接口后,就可以操作其他的接口。第二個post的加了個base64的勾選,主要是為考慮工具通用性,不勾選base64適合大部分公司,當我們公司的如果不勾選,后台無法對一個不是base64加密的字符串進行base64解碼,當然會返回錯誤狀態碼。工具是利用reqeusts做的,此工具利用了Qthread,否則遇上響應時間大的接口會卡死界面。
此工具是用客戶端來代替本應該是app端完成的功能。正常測試是需要把txt中的一個字符串用工具生成二維碼圖片,然后用app掃描二維碼,如果子碼和父碼比例是20比1,需要掃每生成一個二維碼然后app掃描一次,完成一個過程需要10分鍾左右。工具是直接一次性賦值txt20行子嗎字符串,然后復制一個父碼字符串到輸入框,點擊確認關聯,后台會自動分割20個子碼的網址,並且取出網址中的碼值,這個地方主要利用正則表達式分割出20個子碼碼值,然后按照接口參數的格式post到服務端,整個過程20秒就可以完成。是很快吧,這個app由於需要掃碼的原因無法使用appium,用接口來代替app的功能,對於測試業務流程節約大量時間。
當然這種工具的方法還是只能一次次的進行關聯,后來因為有了新的需求,我使用的方法是純腳本,讀取兩個記事本,每個記事本20000行,一次性的讀取兩個記事本內容后多次進行指定行的相互自動關聯,假如按20:1的比例關聯,關聯20000個碼值,一個接口一般0.2秒就可以返回接口,使用單線程requests也就幾分鍾吧。
此工具是測試項目的app功能的部分功能,把app多個界面的功能聚合到一個界面,輔助測試,比如測試報警的短信功能,用app填寫各種表單需要2分鍾,用工具只需要2秒鍾,因為后台處理了大量默認參數。
此工具是檢測線上服務器服務運行狀態的工具,可以不間斷的檢測各個接口的返回是否正常,數據庫狀態是否正常,web服務器是否有異常。只需要設置指定的時間就可以自動循環去檢測,把每天的每條命令的請求寫到一個log日志中。一旦有異常將捕獲到的異常,發送給相關的郵件人,並且把每天的每條命令的請求寫到一個log日志中,並發送短信給相關人員,避免出問題了還不知情。其中郵件用的是python的smtlib的郵件功能,短信是讓php做了一個發短信的接口,我只需要按制定的格式post相關內容到php,就可以發短信通知大家了。
之前做這個工具是做成了windows service的形式,把服務安裝到windows的服務中靜默運行,但是沒要這種客戶端方式可控性強。
此工具是給一個朋友做的功能,他需要不在cmd中運行cmd命令。用的是subprocess,代碼比較短在此貼出代碼了。
import subprocess ui.lineEdit_14.setText((u"ping 127.0.0.1")) ui.lineEdit_15.setText((u"https://180.42.98.2/uniform/user-login.action")) class CmdThread(QThread): _signal = pyqtSignal(str) def __int__(self): super(CmdThread,self).__init__() def run(self): cmd_str=unicode(QString(ui.lineEdit_14.text())) print u'\n發送的cmd命令是: ',cmd_str try: ot=subprocess.check_output(cmd_str, shell=True) print ot.decode('gbk').encode('utf8') except Exception,e: print e print '********************************************' cmdThread=CmdThread() cmdThread._signal.connect(chuli) #####cmd某些命令會消耗大量時間,需要用到Qthread,chuli是一個函數,鏈接右邊黑色控制台 def cmd(): cmdThread.start()
此工具是百度發帖,具體的實現代碼在另外的一個百度回帖博客中已經介紹了,由於此賬號是從淘寶買的,並且在調試代碼時候,已經被百度永久性封禁了回帖功能,所以返回的不是errcode0,220012是賬號被禁用回帖功能的意思。
最后介紹下pyqt工具的打包代碼,使用py2exe打包成exe客戶端。在cmd運行
python setup.py py2exe --includes sip就能打包。
1 #coding=utf-8 2 from distutils.core import setup 3 import py2exe 4 import glob 5 6 #python setup.py py2exe --includes sip 圖標要手動復制圖片到dist文件夾去 7 8 setup( 9 # targets to build 10 windows = [{"script":"dysyui.py", "icon_resources": [(1, "logo1.ico")]} ], 11 options = { "py2exe":{"dll_excludes":["MSVCP90.dll"],"bundle_files": 3,}}, 12 data_files = [("imageformats",glob.glob("C:\Python27\Lib\site-packages\PyQt4\plugins\imageformats\*.dll"))] 13 )
好了,關於pyqt就寫這么多了。