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