日本电影一区二区_日本va欧美va精品发布_日本黄h兄妹h动漫一区二区三区_日本欧美黄色

Python零基礎(chǔ)入門(mén)之編寫(xiě)測(cè)試實(shí)例(python測(cè)驗(yàn)3)

Python零基礎(chǔ)入門(mén)之編寫(xiě)測(cè)試實(shí)例(python測(cè)驗(yàn)3)

測(cè)試函數(shù)

首先是給出用于測(cè)試的代碼,如下所示,這是一個(gè)接收姓和名然后返回整潔的姓名的函數(shù):

def get_formatted_name(first, last): full_name = first ' ' last return full_name.title()

簡(jiǎn)單的測(cè)試代碼:

first = 'kobe'last = 'bryant'print(get_formatted_name(first, last)) # 輸出 Kobe Bryant復(fù)制代碼

在 Python 標(biāo)準(zhǔn)庫(kù)中的模塊 unittest 提供了代碼測(cè)試工具。這里介紹幾個(gè)名詞的含義:

  • 單元測(cè)試:用于核實(shí)函數(shù)的某個(gè)方面沒(méi)有問(wèn)題;
  • 測(cè)試用例:一組單元測(cè)試,它們一起核實(shí)函數(shù)在各種情形下的行為符合要求。
  • 全覆蓋式測(cè)試用例:包含一整套單元測(cè)試,涵蓋了各種可能的函數(shù)使用方式。

通常,最初只需要對(duì)函數(shù)的重要行為編寫(xiě)測(cè)試即可,等項(xiàng)目被廣泛使用時(shí)才考慮全覆蓋。

接下來(lái)就開(kāi)始介紹如何采用 unittest 對(duì)代碼進(jìn)行測(cè)試。

首先是需要導(dǎo)入 unittest 模塊,然后創(chuàng)建一個(gè)繼承 unittest.TestCase 的類(lèi),并編寫(xiě)一系列類(lèi)方法對(duì)函數(shù)的不同行為進(jìn)行測(cè)試,如下代碼所示:

import unittestclass NamesTestCase(unittest.TestCase): ''' 測(cè)試生成名字函數(shù)的類(lèi) ''' def test_first_last_name(self): formatted_name = get_formatted_name('kobe', 'bryant') self.assertEqual(formatted_name, 'Kobe Bryant') unittest.main()

輸出結(jié)果如下,顯示運(yùn)行的測(cè)試樣例是 1 個(gè),耗時(shí)是 0.001s。

.----------------------------------------------------------------------Ran 1 test in 0.001sOK

上述是給了一個(gè)可以通過(guò)的例子,而如果測(cè)試不通過(guò),輸出是怎樣的呢,如下所示:

# 添加中間名def get_formatted_name(first, middel, last): full_name = first ' ' middle ' ' last return full_name.title()class NamesTestCase(unittest.TestCase): ''' 測(cè)試生成名字函數(shù)的類(lèi) ''' # 不能通過(guò)的例子 def test_first_name(self): formatted_name = get_formatted_name('kobe', 'bryant') self.assertEqual(formatted_name, 'Kobe Bryant') unittest.main()

輸出結(jié)果如下,這里會(huì)打印錯(cuò)誤發(fā)生的地方和錯(cuò)誤原因:

E======================================================================ERROR: test_first_last_middle_name (__main__.NamesTestCase)----------------------------------------------------------------------Traceback (most recent call last): File "E:/Python_Notes/Practise/unittest_practise.py", line 39, in test_first_last_middle_name formatted_name = get_formatted_name('kobe', 'bryant')TypeError: get_formatted_name() missing 1 required positional argument: 'middle'----------------------------------------------------------------------Ran 1 test in 0.001sFAILED (errors=1)

很明顯是因?yàn)槿鄙?middle 參數(shù),如果希望通過(guò)測(cè)試,可以將原函數(shù)進(jìn)行如下修改:

def get_formatted_name(first, last, middle=''): ''' 接收姓和名然后返回完整的姓名 :param first: :param last: :return: ''' if middle: full_name = first ' ' middle ' ' last else: full_name = first ' ' last return full_name.title()

然后添加新的測(cè)試方法,繼續(xù)運(yùn)行,就可以測(cè)試通過(guò)。

def test_first_last_middle_name(self): formatted_name = get_formatted_name('kobe', 'bryant', 'snake') self.assertEqual(formatted_name, 'Kobe Snake Bryant')

測(cè)試類(lèi)

上一小節(jié)介紹了給函數(shù)寫(xiě)測(cè)試的代碼,接下來(lái)介紹如何編寫(xiě)針對(duì)類(lèi)的測(cè)試。

斷言方法

在 unitest.TestCase 類(lèi)中提供了很多斷言方法,上一小節(jié)就采用了 assertEqual 這一個(gè)判斷給定兩個(gè)參數(shù)是否相等的斷言方法,下面給出常用的 6 個(gè)斷言方法:

Python零基礎(chǔ)入門(mén)之編寫(xiě)測(cè)試實(shí)例(python測(cè)驗(yàn)3)

這些方法都只能在繼承了 unittest.TestCase 的類(lèi)中使用這些方法。

編寫(xiě)針對(duì)類(lèi)的測(cè)試

首先,編寫(xiě)用于進(jìn)行測(cè)試的類(lèi),代碼如下所示,這是一個(gè)用于管理匿名調(diào)查問(wèn)卷答案的類(lèi):

class AnonymousSurvey(): ''' 收集匿名調(diào)查問(wèn)卷的答案 ''' def __init__(self, question): ''' :param question: ''' self.question = question self.responses = [] def show_question(self): ''' 顯示問(wèn)卷 :return: ''' print(self.question) def store_response(self, new_response): ''' 存儲(chǔ)單份調(diào)查問(wèn)卷 :param new_response: :return: ''' self.responses.append(new_response) def show_results(self): ''' 顯示所有答卷 :return: ''' print('Survey results:') for response in self.responses: print('- ' response)

這個(gè)類(lèi)包含三個(gè)方法,分別是顯示問(wèn)題、存儲(chǔ)單份問(wèn)卷以及展示所有調(diào)查問(wèn)卷,下面是一個(gè)使用例子:

def use_anonymous_survey(): question = "世上最好的語(yǔ)言是?" language_survey = AnonymousSurvey(question) # 顯示問(wèn)題 language_survey.show_question() # 添加問(wèn)卷 language_survey.store_response('php') language_survey.store_response('python') language_survey.store_response('c ') language_survey.store_response('java') language_survey.store_response('go') # 展示所有問(wèn)卷 language_survey.show_results()if __name__ == '__main__': use_anonymous_survey()

輸出結(jié)果如下:

世上最好的語(yǔ)言是?Survey results:- php- python- c - java- go

然后就開(kāi)始編寫(xiě)對(duì)該類(lèi)的測(cè)試代碼,同樣創(chuàng)建一個(gè)類(lèi),繼承 unittest.TestCase ,然后類(lèi)方法進(jìn)行測(cè)試,代碼如下所示:

import unittestclass TestAnonmyousSurvey(unittest.TestCase): def test_store_single_response(self): ''' 測(cè)試保存單份問(wèn)卷的方法 :return: ''' question = "世上最好的語(yǔ)言是?" language_survey = AnonymousSurvey(question) language_survey.store_response('php') self.assertIn('php', language_survey.responses)unittest.main()

上述代碼采用了 assertIn 斷言方法來(lái)測(cè)試函數(shù) store_response()。

這里還可以繼續(xù)測(cè)試能否存儲(chǔ)更多的問(wèn)卷,如下所示,測(cè)試存儲(chǔ)三份問(wèn)卷:

def test_store_three_response(self): question = "世上最好的語(yǔ)言是?" language_survey = AnonymousSurvey(question) responses = ['c ', 'php', 'python'] for response in responses: language_survey.store_response(response) for response in responses: self.assertIn(response, language_survey.responses)

最后,在 unittest.TestCase 中其實(shí)包含一個(gè)方法 setUp() ,它的作用類(lèi)似類(lèi)的初始化方法 __init()__,它會(huì)在各種以 test_ 開(kāi)頭的方法運(yùn)行前先運(yùn)行,所以可以在這個(gè)方法里創(chuàng)建對(duì)象,避免在每個(gè)測(cè)試方法都需要?jiǎng)?chuàng)建一遍,所以上述代碼可以修改為:

class TestAnonmyousSurvey(unittest.TestCase): def setUp(self): ''' 創(chuàng)建一個(gè)調(diào)查對(duì)象和一組答案 :return: ''' question = "世上最好的語(yǔ)言是?" self.language_survey = AnonymousSurvey(question) self.responses = ['c ', 'php', 'python'] def test_store_single_response(self): ''' 測(cè)試保存單份問(wèn)卷的方法 :return: ''' self.language_survey.store_response(self.responses[1]) self.assertIn('php', self.language_survey.responses) def test_store_three_response(self): for response in self.responses: self.language_survey.store_response(response) for response in self.responses: self.assertIn(response, self.language_survey.responses)

運(yùn)行后,輸出結(jié)果如下:

..----------------------------------------------------------------------Ran 2 tests in 0.000sOK

注意,這里運(yùn)行成功,打印一個(gè)句號(hào),因?yàn)槭沁\(yùn)行兩個(gè)測(cè)試方法成功,所以打印了兩個(gè)句號(hào);如果運(yùn)行出錯(cuò),打印一個(gè) E ;測(cè)試導(dǎo)致斷言失敗,打印一個(gè) F 。

關(guān)注 轉(zhuǎn)發(fā)。私信小編“零基礎(chǔ)”獲取全套Python零基礎(chǔ)資料大禮包。

來(lái)源:本文為第三方轉(zhuǎn)載,如有侵權(quán)請(qǐng)聯(lián)系小編刪除。

相關(guān)新聞

聯(lián)系我們
聯(lián)系我們
公眾號(hào)
公眾號(hào)
在線咨詢(xún)
分享本頁(yè)
返回頂部
鄂州市| 清徐县| 古丈县| 靖江市| 三江| 东海县| 岳普湖县| 藁城市| 涿鹿县| 宁河县| 大厂| 汉寿县| 丰台区| 衡山县| 东丽区| 盐源县| 汕尾市| 曲麻莱县| 夏津县| 阿克陶县| 阿拉善盟| 永川市| 静乐县| 汉寿县| 东源县| 天峨县| 宕昌县| 潜山县| 修武县| 乡城县| 翼城县| 五莲县| 天祝| 霞浦县| 遂溪县| 聂拉木县| 龙井市| 邵阳市| 新泰市| 五大连池市| 宜宾市|