編寫函數(shù)或類時(shí),還可以為其編寫測(cè)試。通過測(cè)試,可確定代碼面對(duì)各種輸入都能夠按要求的那樣工作。程序員都會(huì)犯錯(cuò),因?yàn)槊總€(gè)程序員都必須經(jīng)常測(cè)試其代碼,在用戶發(fā)現(xiàn)問題前找出它們。
測(cè)試函數(shù)
被測(cè)試的代碼,下面是一個(gè)簡單的函數(shù)name_function.py,它接受名和姓返回整潔的姓名:
def get_formatted_name(first, last):
"""接受名和姓返回整潔的姓名"""
full_name = first + " " + last
return full_name.title()
再編寫一個(gè)使用這個(gè)函數(shù)的程序names.py。讓用戶輸入名和姓,并顯示整潔的姓名:
from name_function import get_formatted_name
print("Enter 'q' at any time to quit")
while True:
first = input("\nPlease give me a first name: ")
if first == 'q':
break
last = input("Please give me a last name: ")
if last == 'q':
break
formatted_name = get_formatted_name(first, last)
print("\tNeatly formatted name: " + formatted_name + ".")
單元測(cè)試和測(cè)試用例
Python標(biāo)準(zhǔn)庫中的模塊unittest提供了代碼測(cè)試工具。
單元測(cè)試用于核實(shí)函數(shù)的某個(gè)防霾呢沒有問題;
測(cè)試用例是一組單元測(cè)試,這些單元測(cè)試儀器一起核實(shí)函數(shù)在各種情形下的行為都符合要求。良好的測(cè)試用例考慮到了函數(shù)可能收到的各種收入,包含所有針對(duì)這些情形的測(cè)試。
全覆蓋式測(cè)試用例包含一整套單元測(cè)試,涵蓋了各種可能的函數(shù)使用方式。
對(duì)于大型項(xiàng)目,要實(shí)現(xiàn)全覆蓋可能很難。通常,最初只要對(duì)針對(duì)代碼的重要行為編寫測(cè)試即可,等項(xiàng)目給廣泛使用時(shí)再考慮全覆蓋。
可通過的測(cè)試
創(chuàng)建測(cè)試用例的語法需要一段時(shí)間才能習(xí)慣,但測(cè)試用例創(chuàng)建后,再添加針對(duì)函數(shù)的單元測(cè)試就很簡單了。要為函數(shù)編寫測(cè)試用例,可先導(dǎo)入模塊unittest以及要測(cè)試的函數(shù),在創(chuàng)建一個(gè)繼承unittest.TestCase的類,并編寫一系列方法對(duì)函數(shù)行為的不同方面進(jìn)行測(cè)試。
下面test_name_function.py一個(gè)只包含一個(gè)方法的測(cè)試用例,它檢查函數(shù)get_formatted_name()在給定名和姓時(shí)能否正確的工作。
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
"""測(cè)試name_function.py"""
def test_first_last_name(self):
"""能否正切的處理Janis Joplin這樣的姓名嗎?"""
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
各種斷言方法
-
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中