python代碼測試
單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。
比如對函數abs(),我們可以編寫出以下幾個測試用例:
輸入正數,比如1、1.2、0.99,期待返回值與輸入相同;
輸入負數,比如-1、-1.2、-0.99,期待返回值與輸入相反;
輸入0,期待返回0;
輸入非數值類型,比如None、[]、{},期待拋出TypeError。
把上面的測試用例放到一個測試模塊里,就是一個完整的單元測試。
如果單元測試通過,說明我們測試的這個函數能夠正常工作。如果單元測試不通過,要麼函數有bug,要麼測試條件輸入不正確,總之,需要修復使單元測試能夠通過。
單元測試通過後有什麼意義呢?如果我們對abs()函數代碼做了修改,只需要再跑一遍單元測試,如果通過,說明我們的修改不會對abs()函數原有的行為造成影響,如果測試不通過,說明我們的修改與原有行為不一致,要麼修改代碼,要麼修改測試。
這種以測試為驅動的開發模式最大的好處就是確保一個程序模塊的行為符合我們設計的測試用例。在將來修改的時候,可以極大程度地保證該模塊行為仍然是正確的。
我們來編寫一個Dict類,這個類的行為和dict一致,但是可以通過屬性來訪問,用起來就像下面這樣:
>>> d = Dict(a=1, b=2)
>>> d['a']
1
>>> d.a
1
mydict.py代碼如下:
class Dict(dict):
def __init__(self, **kw):
super(Dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
為了編寫單元測試,我們需要引入Python自帶的unittest模塊,編寫mydict_test.py如下:
import unittest
from mydict import Dict
class TestDict(unittest.TestCase):
def test_init(self):
d = Dict(a=1, b='test')
self.assertEquals(d.a, 1)
self.assertEquals(d.b, 'test')
self.assertTrue(isinstance(d, dict))
def test_key(self):
d = Dict()
d['key'] = 'value'
self.assertEquals(d.key, 'value')
def test_attr(self):
d = Dict()
d.key = 'value'
self.assertTrue('key' in d)
self.assertEquals(d['key'], 'value')
def test_keyerror(self):
d = Dict()
with self.assertRaises(KeyError):
value = d['empty']
def test_attrerror(self):
d = Dict()
with self.assertRaises(AttributeError):
value = d.empty
編寫單元測試時,我們需要編寫一個測試類,從unittest.TestCase繼承。
以test開頭的方法就是測試方法,不以test開頭的方法不被認為是測試方法,測試的時候不會被執行。
對每一類測試都需要編寫一個test_xxx()方法。由於unittest.TestCase提供了很多內置的條件判斷,我們只需要調用這些方法就可以斷言輸出是否是我們所期望的。最常用的斷言就是assertEquals():
self.assertEquals(abs(-1), 1) # 斷言函數返回的結果與1相等
另一種重要的斷言就是期待拋出指定類型的Error,比如通過d['empty']訪問不存在的key時,斷言會拋出KeyError:
with self.assertRaises(KeyError):
value = d['empty']
而通過d.empty訪問不存在的key時,我們期待拋出AttributeError:
with self.assertRaises(AttributeError):
value = d.empty
運行單元測試
一旦編寫好單元測試,我們就可以運行單元測試。最簡單的運行方式是在mydict_test.py的最後加上兩行代碼:
if __name__ == '__main__':
unittest.main()
這樣就可以把mydict_test.py當做正常的python腳本運行:
$ python mydict_test.py
另一種更常見的方法是在命令行通過參數-m unittest直接運行單元測試:
$ python -m unittest mydict_test
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
這是推薦的做法,因為這樣可以一次批量運行很多單元測試,並且,有很多工具可以自動來運行這些單元測試。
setUp與tearDown
可以在單元測試中編寫兩個特殊的setUp()和tearDown()方法。這兩個方法會分別在每調用一個測試方法的前後分別被執行。
setUp()和tearDown()方法有什麼用呢?設想你的測試需要啟動一個資料庫,這時,就可以在setUp()方法中連接資料庫,在tearDown()方法中關閉資料庫,這樣,不必在每個測試方法中重復相同的代碼:
class TestDict(unittest.TestCase):
def setUp(self):
print 'setUp...'
def tearDown(self):
print 'tearDown...'
可以再次運行測試看看每個測試方法調用前後是否會列印出setUp...和tearDown...。
『貳』 python 測試代碼怎麼管理
你對py2exe生成來的那個.exe文件,右鍵,自用rar之類的解壓縮,就知道了。其實就是個自解壓的壓縮包,裡麵包含了你的代碼,python.exe,python.dll,library等一切所需的東西。執行的時候,其實是它自動把這些東西解壓到硬碟上,再執行。兩三年沒用windows了,以前的認知是這樣的,不知道現在有沒有變化。
我個人建議,用cx_freeze打包更舒服,在windows,linux,osx上都能打成自解壓的包。
『叄』 python測試函數有哪些
測試函數是用於自動化測試,使用python模塊中的unittest中的工具來測試
附上書中摘抄來的代碼:
#coding=utf-8import unittestfrom name_function import get_formatted_nameclass NamesTestCase(unittest.TestCase): def test_first_last_name(self): formatted_name=get_formatted_name('janis','joplin') self.assertEqual(formatted_name,'Janis Joplin') def test_first_last_middle_name(self): formatted_name=get_formatted_name('wolfgang','mozart','amadeus') self.assertEqual(formatted_name,'Wolfgang Amadeus Mozart')#注意下面這行代碼,不寫會報錯哦~~~書中沒有這行if __name__=="__main__": unittest.main()
『肆』 python代碼設計測試用例if〉1)andb==0
1、m=2,n=0,不滿足if(m>1 and n>0)
2、m=2,n=1,滿足if(m>1 and n>0) 但不滿足if(n%2==0)專
3、m=2,n=2,滿足if(m>1 and n>0) 同時屬滿足if(n%2==0)
『伍』 如何檢測 python代碼注入
調用linux系統命令lsof進行專判斷屬 #encoding=utf-8import osdef isOpen(filename): p = os.popen("lsof %s" % filename) content = p.read() p.close() return bool(len(content))print isOpen("a.log")
『陸』 python漏洞檢測代碼怎麼編寫
import socket
import os
import sys
port = 21
banner = "FreeFloat FTP Server"
portList = [21,22,80,110]
portOpen = True
services = {'ftp':21, 'ssh':22, 'smtp':25, 'http':80}
def retBanner(ip,port):
try:
socket.setdefaulttimeout(2)
s = socket.socket()
s.connect((ip,port))
banner = s.recv(1024)
return banner
except:
return
def checkVulns(banner,filename):
f = open(filename,'r')
for line in f.readlines():
if line.strip('\n') in banner:
print '[+] Server is vulnerable: ' + banner.strip('\n')
def main():
if len(sys.argv) == 2:
filename = sys.argv[1]
if not os.path.isfile(filename):
print '[-] ' +filename + ' does not exist.'
exit(0)
if not os.access(filename, os.R_OK):
print '[-] ' +filename + ' access denied.'
exit(0)
else:
print '[-] Usage: ' + str(sys.argv[0]) + ' <vuln filename>'
exit(0)
portList = [21,22,25,80,110,443]
for x in range(147,150):
ip = '192.168.95.' + str(x)
for port in portList:
banner = retBanner(ip,port)
if banner:
print '[+] ' + ip + ': ' + banner
checkVulns(banner, filename)
if __name__ == '__main__':
main()
復制代碼
『柒』 各位同道朋友,請問PC端的應用程序怎麼測試,用Python代碼如何實現呢
看文檔,一般要有類似這樣的步驟:
app = Application(backend="uia").start("notepad.exe")
後續操作都是對app對象的操作
而你上面代碼回一直是答對Application類的操作
『捌』 怎麼用python做自動化測試
用python做自動化測試,主要是介面測試和UI自動化測試。 自動化測試還要學習的有很多,selinum、webdriver、monkey、APP測試等等這些都要學習的,建議你去魯德,課程多樣化,學習比較扎實,自動化測試是主打課程
『玖』 測試新人如何使用Python代碼封裝自動化測試的用例
如何使用Python和實現自動化測試?
本文我將詳細介紹使用Appium下的Python編寫的測試的例子代碼對一個iOS的樣例應用進行測試所涉及的各個步驟,而對Android應用進行測試所需的步驟與此非常類似。
然後按照安裝指南,在你的機器上安裝好Appium。
我還需要安裝Appium的所有依賴並對樣例apps進行編譯。在Appium的工作目錄下運行下列命令即可完成此任務:
$ ./reset.sh --ios
編譯完成後,就可以運行下面的命令啟動Appium了:
$ grunt appium
現在,Appium已經運行起來了,然後就切換當前目錄到sample-code/examples/python。接著使用pip命令安裝所有依賴庫(如果不是在虛擬環境virtualenv之下,你就需要使用sudo命令):
$ pip install -r requirements.txt
接下來運行樣例測試:
$ nosetests simple.py
既然安裝完所需軟體並運行了測試代碼,大致了解了Appium的工作過程,現在讓我們進一步詳細看看剛才運行的樣例測試代碼。該測試先是啟動了樣例應用,然後在幾個輸入框中填寫了一些內容,最後對運行結果和所期望的結果進行了比對。首先,我們創建了測試類及其setUp方法:
classTestSequenceFunctions(unittest.TestCase):
defsetUp(self):
app=os.path.join(os.path.dirname(__file__),
'../../apps/TestApp/build/Release-iphonesimulator',
'TestApp.app')
app=os.path.abspath(app)
self.driver=webdriver.Remote(
command_executor='127.0.0.1:4723/wd/hub',
desired_capabilities={
'browserName':'iOS',
'platform':'Mac',
'version':'6.0',
'app': app
})
self._values=[]
「desired_capabilities」參數用來指定運行平台(iOS 6.0)以及我們想測試的應用。接下來我們還添加了一個tearDown方法,在每個測試完成後發送了退出命令:
deftearDown(self):
self.driver.quit()
最後,我們定義了用於填寫form的輔助方法和主測試方法:
def_populate(self):
# populate text fields with two random number
elems=self.driver.find_elements_by_tag_name('textField')
foreleminelems:
rndNum=randint(0,10)
elem.send_keys(rndNum)
self._values.append(rndNum)
deftest_ui_computation(self):
# populate text fields with values
self._populate()
# trigger computation by using the button
buttons=self.driver.find_elements_by_tag_name("button")
buttons[0].click()
# is sum equal ?
texts=self.driver.find_elements_by_tag_name("staticText")
self.assertEqual(int(texts[0].text),self._values[0]+self._values[1])
本文介紹到此,相信很多朋友都已經明白了。但是如果你對Nose和Python來運行Appium測試有任何問題或看法,可以給我留言,我們可以繼續交流。