python挖礦測試程序
Ⅰ 用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如何檢測當前運行的程序
p
=
subprocess.popen(start_proqual,stdout
=
subprocess.pipe,shell=true)
p.stdout.read()
#讀取輸出的內容但不顯示
一個外部程序的運行時間你在啟動前是檢測不到的,只要運行後才知道
Ⅲ 編寫python測試程序,導入相關模塊,以主程序運行,用戶輸入四個數字分別輸出最大值以及最小值
s=input('請輸入4個數,用英文逗號分隔:')
l=s.split(',')
l=[int(x) for x in l]
print('最大值:',max(l),'最小值:',min(l))
Ⅳ 如何對Python寫的程序進行 GUI 自動化測試
python實現的UI,用wxpython?操作系統有要求嗎?
https://pypi.python.org/pypi/PyAutoGUI
https://pypi.python.org/pypi/pywinauto
https://pypi.python.org/pypi/PyAutoIt/0.3
用過pywinauto
Ⅳ Python做軟體自動化測試的入門提問
同在軟體測試崗位。由於同樣初學python,所以沒有太多的實踐經驗。
使用python的單元測試框架,可以建立測試類,構造測試集。
測試類中包含了common的測試方法定義,包括測試開始前建立測試環境的setUp方法和測試完成後清理還原環境的tearDown方法,最好按照約定規則(以test開頭)來命名所有的測試方法。
測試集允許你根據測試策略組合不同的測試用例並實施。
下面兩篇文章推薦看看:
http://www.ibm.com/developerworks/cn/linux/l-pyunit/
http://www.cnblogs.com/coderzh/archive/2010/08/23/custom-python-unittestoutput-as-gtest.html
有一個問題我還沒找到答案,就是如何讓單元測試框架的log輸出到文件(默認輸出到控制台)。
Ⅵ 做了一些Python的小練習題,如何實現自動讀取txt文件中的測試數據進行測試。
一些經驗,僅供參考:
方法1、可以使用CSV文件格式記錄數據,這時候可以視為一種簡易資料庫來處理數據;
方法2:按行讀取數據,每行進行解析;符合預定規則的則分解行信息為數據集,進行後續處理;
方法3:基於方法2,但有可能數據是有狀態的。這時候需要記錄狀態信息,在狀態分支裡面按規則處理;
具體處理方法的選用,還是要根據源數據格式的特徵分析。
#輸入參數就是源數據文件名
#返回值就是讀取出來的行集合,在後面循環從頭到尾處理即可。
defgetlines(fn):
f=open(fn,"r")
lines=f.readlines()
f.close()
returnlines
Ⅶ 怎麼用python代碼運行一個程序,我這個代碼有什麼問題么
先試著調調計算器,OK就是你1111的問題
importsubprocess
subprocess.call("C:WindowsSystem32calc.exe")
Ⅷ 各位同道朋友,請問PC端的應用程序怎麼測試,用Python代碼如何實現呢
看文檔,一般要有類似這樣的步驟:
app = Application(backend="uia").start("notepad.exe")
後續操作都是對app對象的操作
而你上面代碼一直是對Application類的操作
Ⅸ 怎麼用python寫一個抽獎程序,是抽取圖片或視頻
16年年會抽獎網上有人對公司的抽獎結果又偏見,於是全員進行了抽獎代碼的review,好像是愛奇藝公司的,下面用python來實現一個抽獎程序。
主要功能有
1.從一個csv文件中讀入所有員工工號
2.將這些工號初始到一個列表中
3.用random模塊下的choice函數來隨機選擇列表中的一個工號
4.抽到的獎項的工號要從列表中進行刪除,以免再次抽到
初級版
這個比較簡單,缺少定製性,如沒法設置一等獎有幾名,二等獎有幾名
import csv#創建一個員工列表emplist = []#用with自動關閉文件with open('c://emps.csv') as f:
empf = csv.reader(f) for emp in empf:
emplist.append(emp)
print("進行一等獎抽獎,共有一名")import random#利用random模塊的chice函數來從列表中隨機選取一個元素e1 = random.choice(emplist)#將中獎的員工從列表中剔除emplist.remove(e1)
print('一等獎得主的號碼是 %s' % e1)
print('進行三個二等獎的號碼抽獎')
e2_1 = random.choice(emplist)
emplist.remove(e2_1)
e2_2 = random.choice(emplist)
emplist.remove(e2_2)
e2_3 = random.choice(emplist)
emplist.remove(e2_3)
print('獲得3個二等獎是 %s %s %s',(e2_1,e2_2,e2_3))#下面依次類推可以設置三等獎的抽獎
改進版
上面的那個初級版,假如要設置個三等獎一百名那麼將要重新維護幾百行代碼,下面用比較高級點的辦法實現.
我們考慮用面向對象來實現,設計一個抽獎類,類中包含一個屬性(號碼來源),一個方法:產生所有抽獎層次指定個數的抽獎號碼。
用到如下知識點:
1. csv模塊部分函數用法
2. sys模塊讀取輸入
3. random模塊函數choice函數用法
4. 列表和字典元素的添加、刪除
6. for循環中range用法
7. 類和面向對象
8. 字元列印,print中的計算
9.open中with
#!/usr/bin/python#coding=utf-8import csvimport sysimport random
reload(sys)
sys.setdefaultencoding('utf8')#coding=utf-8print("開始進行抽獎")#定義個抽獎類,功能有輸入抽獎級別和個數,列印出每個級別的抽獎員工號碼class Choujiang:
#定義scv文件路徑
def __init__(self,filepath):
self.empfile = filepath def creat_num(self):
emplist = [] with open(self.empfile) as f:
empf = csv.reader(f) for emp in empf:
emplist.append(emp)
print('共有%s 人參與抽獎' % len(emplist))
levels = int(input('抽獎分幾個層次,請輸入:')) #定義一個字典
level_dict = {} for i in range(0,levels):
print('請輸入當前獲獎層次 %s 對應的獎品個數' % ( i + 1))
str_level_dict_key = sys.stdin.readline()
int_level_dict_key = int(str_level_dict_key)
level_dict[i] = int_level_dict_key #循環完成後抽獎層次字典構造完畢
#進行抽獎開始
print('抽獎字典設置為: %s' % level_dict) for i in range(0,len(level_dict)):
winers = [] #產生當前抽獎層次i對應的抽獎個數
for j in range(0,int(level_dict[i])): #利用random模塊中的choice函數從列表中隨機產生一個
winer = random.choice(emplist)
winers.append(winer)
emplist.remove(winer)
print('抽獎層次 %s 下產出的獲獎人員有:' % (i + 1 ))
print(winers)#類功能定義完畢,開始初始化並使用if __name__ == '__main__':
peoples = Choujiang('c://emps.csv')
peoples.creat_num()
該段程序在python 2.6 以上及 3中均可以運行,運行結果如下圖:
Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:44:40) [MSC v.1600 64 bit (AMD64)] on win32
Type "right", "credits" or "license()" for more information.>>> ================================ RESTART ================================>>> 開始進行抽獎
共有24790 人參與抽獎
抽獎分幾個層次,請輸入:2請輸入當前獲獎層次 1 對應的獎品個數1請輸入當前獲獎層次 2 對應的獎品個數3抽獎字典設置為: {0: 1, 1: 3}
抽獎層次 1 下產出的獲獎人員有:
[['張三19826']]
抽獎層次 2 下產出的獲獎人員有:
[['張三18670'], ['張三23235'], ['張三15705']]>>> 1234567891011121314151617
Ⅹ 運行igraph測試程序出錯,python下的程序代碼如下: import igraph.test igraph.test.run_tests()
看情況似乎是某個數據結構的解析出了錯。看起來象是嚴重的錯誤。
先試試看它的例子能不能用。如果能用,則不用理這個錯誤, 如果不能用考慮以下幾個原因:
版本,你盡量用源代碼安裝。或者用apt-get 安裝。我習慣用apt-get
是否是因為你的ubuntu太舊了?好象現在大部分人都在用12版本,13版本。11版本是一個過渡版本。你升級一下也許就解析了。可以這個就是主要問題
底層的問題,我猜還是某個依賴庫的版本問題