Python学习笔记-基础语法
第十一章 代码测试
- 一、测试函数
- 二、测试类
一、测试函数
1、可通过的测试
- 导入模块unittest来提供代码测试工具
- 创建一个继承unittest.TestCase()的类,用于包含一系列针对函数的单元测试
- 使用unittest.main()来让Python运行这个文件中的测试
方法 | 描述 |
单元测试 | 用于核实函数的某个方面没有问题 |
全覆盖式测试 | 用例包含一整套单元测试,涵盖了何种可能的函数使用方式 |
self.assertEqual(A,B) | 一种断言方法,将A的值与B相比较并反馈 |
def get_formatted_name(first,last):
full_name = first + ' ' + last
return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
def test_first_last_name(self):
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
if __name__ == '__main__':
unittest.main()
输出结果为:
Ran 1 test in 0.003s
OK
2、不能通过测试
def get_formatted_name(first,middle,last):
full_name = first + " " + middle + ' '+ last
return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
def test_first_last_name(self):
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
if __name__ == '__main__':
unittest.main()
输出结果为:
Ran 1 test in 0.005s
FAILED (errors=1)
Error
Traceback (most recent call last):
File "D:\Python_Work\Python学习\Python编程-从入门到实践\测试name_function中的函数.py", line 5, in test_first_last_name
formatted_name = get_formatted_name('janis', 'joplin')
TypeError: get_formatted_name() missing 1 required positional argument: 'last'
3、测试未通过时的做法
- 检查对函数的修改,找出导致函数行为不符合预期的修改,不要修改测试
def get_formatted_name(first,last,middle=''):
if middle:
full_name = first + " " + middle + ' '+ last
else:
full_name = first + ' ' + last
return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
def test_first_last_name(self):
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
if __name__ == '__main__':
unittest.main()
输出结果为:
Ran 1 test in 0.002s
Launching unittests with arguments python -m unittest D:/Python_Work/Python学习/Python编程-从入门到实践/测试name_function中的函数.py in D:\Python_Work\Python学习\Python编程-从入门到实践
OK
4、添加新测试
- 在类中添加一个新方法即可
def get_formatted_name(first,last,middle=''):
if middle:
full_name = first + " " + middle + ' '+ last
else:
full_name = first + ' ' + last
return full_name.title()
import unittest
from name_function import get_formatted_name
class NamesTestCase(unittest.TestCase):
def test_first_last_name(self):
formatted_name = get_formatted_name('janis', 'joplin')
self.assertEqual(formatted_name, 'Janis Joplin')
def test_first_middle_last_name(self):
formatted_name = get_formatted_name('wolfgang','mozart','amadeus')
self.assertEqual(formatted_name,'Wolfgang Amadeus Mozart')
if __name__ == '__main__':
unittest.main()
输出结果为:
Ran 2 tests in 0.003s
OK
二、测试类
1、各种断言方法
- 只能在继承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、一个要测试的类
class AnonySurvey():
def __init__(self,question):
self.question = question
self.responses = []
def show_question(self):
print(self.question)
def store_response(self,new_response):
self.responses.append(new_response)
def show_results(self):
print("Survey results:")
for response in self.responses:
print("- " + response)
测试类:
import unittest
from language_survery import AnonySurvey
class TestAnonySurvey(unittest.TestCase):
def test_store_single_response(self):
question = input("What language did you first learn to speak?")
my_survey = AnonySurvey(question)
my_survey.store_response("English")
self.assertIn('English',my_survey.responses)
def test_store_three_responses(self):
question = input("What language did you first learn to speak?")
my_survey = AnonySurvey(question)
responses = ['English','Spanish','Mandarin']
for response in responses:
my_survey.store_response(response)
for response in responses:
self.assertIn(response,my_survey.responses)
unittest.main()
输出结果为:
Ran 2 tests in 0.000s
OK
3、方法setUp()
- unittest.TestCase()类包含方法setUp(),Python将运行之,创建一次对象,再运行各个以test_打头的方法
class AnonySurvey():
def __init__(self,question):
self.question = question
self.responses = []
def show_question(self):
print(self.question)
def store_response(self,new_response):
self.responses.append(new_response)
def show_results(self):
print("Survey results:")
for response in self.responses:
print("- " + response)
import unittest
from language_survery import AnonySurvey
class TestAnonySurvey(unittest.TestCase):
def setUp(self):
question = "What language did you first learn to speak?"
self.my_survey = AnonySurvey(question)
self.responses = ['English','Spanish','Mandarin']
def test_store_single_response(self):
self.my_survey.store_response(self.responses[0])
self.assertIn(self.responses[0],self.my_survey.responses)
def test_store_three_responses(self):
for response in self.responses:
self.my_survey.store_response(response)
for response in self.responses:
self.assertIn(response,self.my_survey.responses)
if __name__ == '__main__':
unittest.main()
输出结果为:
Ran 2 tests in 0.002s
OK
- 方法setUp()做了两件事:创建一个调查对象,创建一个答案列表;存储这两样东西的变量名包含前缀self(即存储在属性中),因此可在这个类的任何地方使用。
- 测试自己编写的类时,方法setUp()让测试方法编写起来更容易:可在setUp()方法中创建一系列实例并设置它们的属性,再在测试方法中直接使用这些事例。相比于在每个测试方法中都创建实例并设置其属性要容易得多。
本文暂时没有评论,来添加一个吧(●'◡'●)