测试如何学python_学习Python:如何测试函数和类,快学,与
編寫代碼離不開寫測試,只有通過測試才知道代碼的邏輯有沒有問題,健壯性好不好等,測試讓你深信,即便有越來越多的人使用你的程序,它也能一如既往正確地工作。
1.測試函數(shù)
Python標(biāo)準(zhǔn)庫中的模塊unittest提供了代碼測試工具。要進行相關(guān)測試,必須要有待測試的函數(shù),創(chuàng)建文件name_function.py,其內(nèi)容如下:
def get_formatted_name(first,last,middle = ''):
"""生成整潔的姓名"""
if middle:
full_name = f"{first} {middle} {last}"
else:
full_name = f"{first} {last}"
return full_name.title()
1.1單元測試和測試用例
1)單元測試
用于核實某個函數(shù)的某個方面沒有問題。
2)測試用例
是一組單元測試,它們一起核實函數(shù)在各種情況下的行為都符合要求。
3)全覆蓋測試
測試用例包含一整套單元測試,涵蓋了各種可能函數(shù)使用的方式。
1.2可通過的測試
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""Test the name_function.py"""
def test_first_last_name(self):
"""能夠正確處理姓名嗎?"""
formatted_name = get_formatted_name('sun','wukong')
self.assertEqual(formatted_name,'Sun Wukong')
if __name__ == '__main__':
unittest.main()
運行上面測試用例,運行結(jié)果:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
1.3未通過的測試
為通過測試很簡單,將待測試的函數(shù)稍微修改下:
def get_formatted_name(first,last,middle = ''):
"""生成整潔的姓名"""
full_name = f"{first} {middle} {last}"
return full_name.title()
運行1.2中的測試用例,則會輸出為通過的測試返回。筆者不再嘗試。
1.4添加新測試
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""Test the name_function.py"""
def test_first_last_name(self):
"""能夠正確處理姓名嗎?"""
formatted_name = get_formatted_name('sun','wukong')
self.assertEqual(formatted_name,'Sun Wukong')
def test_first_last_middle_name(self):
"""測試三個名字"""
formatted_name = get_formatted_name('sun','wu','kong')
self.assertEqual(formatted_name,'Sun Kong Wu')
if __name__ == '__main__':
unittest.main()
運行結(jié)果:
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
2.測試類
2.1各種斷言方法
Python在unittest.TestCase類中提供了很多斷言方法。下面列舉幾個常用的斷言方法。
方法
用途
assertEqual(a,b)
核實a == b
assertNotEqual(a,b)
核實a != b
assertTrue(x)
核實x為True
assertFalse(x)
核實x為False
assertIn(item,list)
核實item在list中
assertNotIn(item,list)
核實item不在list中
2.2一個要測試的類
類的測試與函數(shù)的測試相似,類的測試基本上都是對方法的測試,不過也存在一些不同之處,下面創(chuàng)建一個匿名調(diào)查類來進行測試。
class AnonymousServey:
"""收集匿名調(diào)查問卷的答案"""
def __init__(self,question):
"""存儲一個問題,并為存儲答案做好準(zhǔn)備"""
self.question = question
self.responses = []
def show_question(self):
"""顯示調(diào)查問卷"""
print(self.question)
def store_response(self,new_response):
"""存儲單份問卷調(diào)查"""
self.responses.append(new_response)
def show_result(self):
"""顯示收集到的所有答案"""
print("Survey results:")
for response in self.responses:
print(f"- {response}")
下面編寫一個測試,對
AnonymousServey
類的行為一個方面進行驗證:核實答案列表中是否有指定答案。
import unittest
from survey import AnonymousServey
class TestAnonymousServey(unittest.TestCase):
"""針對AnonymousServey進行測試"""
def test_store_single_response(self):
question = "What language did you first learn to speak?"
self.my_survey = AnonymousServey(question)
self.my_survey.store_response('python')
self.assertIn('python',self.my_survey.responses)
if __name__ == '__main__':
unittest.main()
上面的測試類先導(dǎo)入
unittest
和要測試的
AnonymousServey
,測試調(diào)查問卷的被存儲后,測試指定數(shù)據(jù)是否包含在存儲的列表中。我們還可以添加更多維度的測試case,例如測試指定某列表是否包含在存儲的列表中。
2.3方法setUp()
如果繼續(xù)添加測試方法,會有很多重復(fù),如何讓公共的變量或者測試數(shù)據(jù),在用例執(zhí)行前就能聲明好,而且其他方法都可以公用,如何解決呢?可以使用
setUp()
函數(shù)。結(jié)合上面的測試用例,看看如何使用
setUp()
函數(shù)
import unittest
from survey import AnonymousServey
class TestAnonymousServey(unittest.TestCase):
"""針對AnonymousServey進行測試"""
def setUp(self):
"""創(chuàng)建一個調(diào)查對象和一組答案,供測試方法使用"""
question = "What language did you first learn to speak?"
self.my_survey = AnonymousServey(question)
self.tree_responses = ['java','php','python']
def test_store_single_response(self):
self.my_survey.store_response(self.tree_responses[0])
self.assertIn(self.tree_responses[0],self.my_survey.responses)
def test_store_tree_response(self):
for response in self.tree_responses:
self.my_survey.store_response(response)
for response in self.tree_responses:
self.assertIn(response,self.my_survey.responses)
if __name__ == '__main__':
unittest.main()
方法
setUp()
做了兩件事:創(chuàng)建一個調(diào)查對象,以及創(chuàng)建一個答案列表。存儲這兩樣?xùn)|西的變量名包含前綴
self
(即存儲在屬性中),因此可以類的任何地方進行使用。
注意
:單元測試對于一個程序的健壯形特別重要。但是要想要自己的單元測試覆蓋自己所寫的每個方法,每一行卻不是很容易,需要各種條件的設(shè)置,對于第三方的調(diào)用還可以使用Mock方式進行,此是后話了。
總結(jié)
以上是生活随笔為你收集整理的测试如何学python_学习Python:如何测试函数和类,快学,与的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数调用,统计数中'2’的个数
- 下一篇: websocket python爬虫_p