上篇介紹的使用python自帶tkinter包,來寫帶界面的工具。 此篇介紹使用pyqt來開發(fā)測試工具。 tkinter的好處是python官方自帶,上手容易(但手寫控件復(fù)雜),布局和擺放都不直觀和容易,因為是像素坐標(biāo)定位,需要花較長時間在界面開發(fā)上。pyqt是第三方gui開發(fā)工具,是目前公認(rèn)的python上最好的客戶端界面開發(fā)工具,因為控件是通過qt設(shè)計師的手動拖拽,調(diào)整顏色 字體 大小等樣式也很簡單,不需要去代碼層面來寫大量界面代碼,真正的所見即所得。
學(xué)習(xí)pyqt需要安裝這些文件,pyqt是python第三方包,eric是qt設(shè)計界面,sip在工具打包時候需要用到。
安裝好環(huán)境后,雙擊運(yùn)行eric4.bat文件(我這里是eric4版本)
運(yùn)行eric4.bat文件后的界面,點擊designer圖標(biāo),進(jìn)入qt設(shè)計視圖
此圖為qt設(shè)計師界面
通過拖拽左側(cè)的控件列表中的元件到ui中就可以。布局完成界面達(dá)到滿意的效果后,點擊菜單欄的文件另存為,保存為ui文件,文件后綴默認(rèn)是.ui。 使用cmd 命令將.ui文件轉(zhuǎn)換為.py文件,命令是 pyuic4 -o syui.py suoyouxiangmu.ui 前面是py文件名稱,后面是剛才保存的ui的文件名,執(zhí)行此命令后會看到文件夾多了一個叫syui.py的文件。 打開文件,可以看到文件的大致內(nèi)容,截圖如下
要想把從ui轉(zhuǎn)換得到的py文件,顯示出界面來,還需要加入代碼
不過,強(qiáng)烈建議不要這么寫,不要把工具的功能代碼和ui轉(zhuǎn)換得到的py代碼寫在一個文件,因為在開發(fā)工具時候可能經(jīng)常用調(diào)整界面不斷的把ui轉(zhuǎn)換成py代碼 ,如果代碼寫在這文件,那么之前寫的功能代碼將會被覆蓋了,把紅框子中這段代碼和后代功能代碼寫在另外一個文件。
pyqt中將一個函數(shù)和按鈕綁定的語法是 mainwindow.pushButton_2.clicked.connect(function) 下面介紹一些獲取控件的值和給控件賦默認(rèn)值的方法 mainwindow.lineEdit.setText((u'zg 額外abc')) #給輸入框賦值 mainwindow.textEdit.setPlainText('') #給texedit賦值 mainwindow.comboBox.setCurrentIndex(2) #給下拉框賦值 mainwindow.checkBox.setChecked(1) #給復(fù)選框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 獲取復(fù)選框checkbox的值
功能代碼該怎么寫就怎么寫,與普通純腳本的代碼沒有區(qū)別。如果事先把后臺腳本功能寫好了,加入到界面來只需要花很少的時間。需要說明的是,一些執(zhí)行時間比較長的函數(shù)例如循環(huán)requests,或者接口的本上響應(yīng)時間很大,需要用到Qthread子線程,否則使用普通的函數(shù)會把客戶端界面卡死一段時間直至函數(shù)運(yùn)行結(jié)束。
下面來展示我使用pyqt做的幾個工具。我這幾個工具,都是左邊界面右邊控制臺顯示的形式,非常方便在一個界面就能看到運(yùn)行結(jié)果,不需要在界面操作然后去python ide的控制臺去看結(jié)果。
此工具是將字符串進(jìn)行base64編碼或解碼的工具,因為我們公司的接口都是前端傳json的base64編碼字符串給后臺,后臺再進(jìn)行base64編碼的形式,在做測試時候,經(jīng)常會發(fā)來base64加密的字符串,如果不解密完全看不懂請求的什么意思什么功能。如果你抓我們公司項目的登錄接口的包,會完全不知所措,因為大多數(shù)web都是抓包出來可以看到 username:xxxxx password:xxxxx yanzhenma:xxxxx的形式,我們公司的需要base64解碼后才能看得到鍵值對,因為如此原因所以做了一個工具;雖然網(wǎng)上大把的各種轉(zhuǎn)碼網(wǎng)站,但每次用時候去打開一個網(wǎng)頁不方便,此工具是引用了python 自帶的base64包,不然我自己寫代碼轉(zhuǎn)換base64,也不知道base64到底是怎么個編碼規(guī)則的。
此工具是接口測試,進(jìn)行g(shù)et 和post請求,類似postman的功能和jmeter的接口測試功能。工具在后臺代碼中已處理cookie,只需要執(zhí)行一次登錄接口后,就可以操作其他的接口。第二個post的加了個base64的勾選,主要是為考慮工具通用性,不勾選base64適合大部分公司,當(dāng)我們公司的如果不勾選,后臺無法對一個不是base64加密的字符串進(jìn)行base64解碼,當(dāng)然會返回錯誤狀態(tài)碼。工具是利用reqeusts做的,此工具利用了Qthread,否則遇上響應(yīng)時間大的接口會卡死界面。
此工具是用客戶端來代替本應(yīng)該是app端完成的功能。正常測試是需要把txt中的一個字符串用工具生成二維碼圖片,然后用app掃描二維碼,如果子碼和父碼比例是20比1,需要掃每生成一個二維碼然后app掃描一次,完成一個過程需要10分鐘左右。工具是直接一次性賦值txt20行子嗎字符串,然后復(fù)制一個父碼字符串到輸入框,點擊確認(rèn)關(guān)聯(lián),后臺會自動分割20個子碼的網(wǎng)址,并且取出網(wǎng)址中的碼值,這個地方主要利用正則表達(dá)式分割出20個子碼碼值,然后按照接口參數(shù)的格式post到服務(wù)端,整個過程20秒就可以完成。是很快吧,這個app由于需要掃碼的原因無法使用appium,用接口來代替app的功能,對于測試業(yè)務(wù)流程節(jié)約大量時間。 當(dāng)然這種工具的方法還是只能一次次的進(jìn)行關(guān)聯(lián),后來因為有了新的需求,我使用的方法是純腳本,讀取兩個記事本,每個記事本20000行,一次性的讀取兩個記事本內(nèi)容后多次進(jìn)行指定行的相互自動關(guān)聯(lián),假如按20:1的比例關(guān)聯(lián),關(guān)聯(lián)20000個碼值,一個接口一般0.2秒就可以返回接口,使用單線程requests也就幾分鐘吧。
此工具是測試項目的app功能的部分功能,把a(bǔ)pp多個界面的功能聚合到一個界面,輔助測試,比如測試報警的短信功能,用app填寫各種表單需要2分鐘,用工具只需要2秒鐘,因為后臺處理了大量默認(rèn)參數(shù)。
此工具是檢測線上服務(wù)器服務(wù)運(yùn)行狀態(tài)的工具,可以不間斷的檢測各個接口的返回是否正常,數(shù)據(jù)庫狀態(tài)是否正常,web服務(wù)器是否有異常。只需要設(shè)置指定的時間就可以自動循環(huán)去檢測,把每天的每條命令的請求寫到一個log日志中。一旦有異常將捕獲到的異常,發(fā)送給相關(guān)的郵件人,并且把每天的每條命令的請求寫到一個log日志中,并發(fā)送短信給相關(guān)人員,避免出問題了還不知情。其中郵件用的是python的smtlib的郵件功能,短信是讓php做了一個發(fā)短信的接口,我只需要按制定的格式post相關(guān)內(nèi)容到php,就可以發(fā)短信通知大家了。 之前做這個工具是做成了windows service的形式,把服務(wù)安裝到windows的服務(wù)中靜默運(yùn)行,但是沒要這種客戶端方式可控性強(qiáng)。
此工具是給一個朋友做的功能,他需要不在cmd中運(yùn)行cmd命令。用的是subprocess,代碼比較短在此貼出代碼了。
import subprocessui.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發(fā)送的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是一個函數(shù),鏈接右邊黑色控制臺def cmd(): cmdThread.start()
此工具是百度發(fā)帖,具體的實現(xiàn)代碼在另外的一個百度回帖博客中已經(jīng)介紹了,由于此賬號是從淘寶買的,并且在調(diào)試代碼時候,已經(jīng)被百度永久性封禁了回帖功能,所以返回的不是errcode0,220012是賬號被禁用回帖功能的意思。
最后介紹下pyqt工具的打包代碼,使用py2exe打包成exe客戶端。在cmd運(yùn)行 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 圖標(biāo)要手動復(fù)制圖片到dist文件夾去 7 8 setup( 9 # targets to build10 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 )
好了,關(guān)于pyqt就寫這么多了。
|
|