文章目录
测试功能
模块主要用于测试代码,这样您可以在编写自己的代码后使用脚本编写简单的测试代码完成自动测试。例如一个简单的函数,如下所示:
def get_formatted_name(first, last):
'''Generate a neattly formatted full name.'''
full_name = first + ' ' + last
return full_name.title()
() 将名字和姓氏组合成一个名字,在名字和姓氏之间添加一个空格,将它们都大写,并返回结果。
接下来,要验证函数是否按预期工作,编写以下测试例程来测试函数的功能:
from name_func 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
format_name = get_formatted_name(first, last)
print("\nNeatly formatted name: " + formatted_name + ".")
执行结果如下:
上面的方法只是自己输入参数并打印输出来检查是否正确的最简单的方法,但这太麻烦了。幸运的是,有一种自动测试函数输出的有效方式——模块方式。
单元测试和测试用例
还是用来测试上面的功能,创建测试用例进行单元测试,测试代码如下:
import unittest
from name_func import get_formatted_name
class NamesTestCase(unittest.TestCase):
'''测试 name_func.py '''
def test_first_last_name(self):
'''能够正确处理姓名'''
formatted_name = get_formatted_name('janis', 'jopin')
self.assertEqual(formatted_name, 'Janis Jopin')
unittest.main()
在测试代码中,首先导入模块和测试函数对象()。创建一个名为包含一系列针对测试对象的单元测试的类(您可以随意命名该类)。这个类必须扩展 .class 以便它知道如何运行书面测试。
运行 .main() 的最后一行会导致该文件中的测试运行。结果如下:
这 。(句点)在执行结果的第一行表示测试通过;下一行表示运行了一个测试,耗时不到 0.003 秒,最后的 OK 表示测试用例所有的单元测试都通过了。
在开发过程中,不可避免地要对原来写的功能进行修改,但是源代码修改后,之前版本的测试代码也需要做相应的修改。原函数修改如下:
def get_formatted_name(first, middle, last):
'''Generate a neattly formatted full name.'''
full_name = first + ' ' + middle + ' ' + last
return full_name.title()
再次执行刚才写的测试用例代码,显示结果如下:
您可以看到显示的很多信息。
输出的第一行中的字母 E 表示测试用例中的一个单元测试导致了错误,并且以下输出表示中的 () 导致了错误。当一个测试用例包含许多单元测试时,知道哪个测试失败是至关重要的。显示输出后,弹出一个标准,指出函数测试错误的问题,这里是因为缺少必要的位置参数。
针对这个问题,我们其实可以把原来的功能修改成两个版本的兼容版本,如下:
def get_formatted_name(first, last, middle = ''):
'''Generate a neattly formatted full name.'''
if middle:
full_name = first + ' ' + middle + ' ' + last
else:
full_name = first + ' ' + last
return full_name.title()
在这个版本中,该函数既可以接收旧版本的三参数调用,也可以接收两参数调用,我们可以在原测试代码中添加新的测试用例,修改如下:
import unittest
from name_func import get_formatted_name
class NamesTestCase(unittest.TestCase):
'''测试 name_func.py '''
def test_first_last_name(self):
'''测试两参数正确处理姓名函数'''
formatted_name = get_formatted_name('janis', 'jopin')
self.assertEqual(formatted_name, 'Janis Jopin')
def test_first_middle_last_name(self):
'''测试三参数正确处理姓名函数'''
formatted_name = get_formatted_name('janis', 'jopin', 'middle')
self.assertEqual(formatted_name, 'Janis Middle Jopin')
unittest.main()
执行这个新的测试用例会产生以下结果:
从结果可以看出,测试用例通过了。
测试班
我已经解释了如何为单个函数编写测试python简单代码示例,但是作为面向对象的语言,存在更多的类,所以实际上更多的测试是针对类的。在编写和开发了一个新类之后,如何证明自己开发的新类可以正常工作或者可以使代码开发正常工作。
下一步是测试类。
各种断言方法
.class 中提供了很多断言方法。如前所述,断言方法可以检查应该满足的条件是否确实满足。如果确实满足了这个条件,那么关于程序行为的假设就得到了证实,并且可以保证中间的错误。如果条件没有真正满足,就会抛出异常。
以下是 6 种常用的断言方法。使用这些方法来验证返回值是否等于预期值,返回值是 True 还是 False,返回值是否在列表中。而且这些方法只能在继承自 .
方法使用
(一,乙)
验证 a == b
(一,乙)
验证 a != b
(X)
验证 x 是否为真
(X)
验证 y 是否为 False
(项目,清单)
验证项目是否在列表中
(项目,清单)
验证该项目不在列表中
编写要测试的类
我们写一个类进行测试,具体代码如下:
class AnonymousSurvey():
'''收集匿名调查问卷的答案'''
def __init__(self, question):
'''存储一个问题,并为存储答案做准备'''
self.question = question
self.responses = []
def show_question(self):
'''显示调查问卷'''
print(self.question)
def shore_response(self, new_response):
'''存储单份调查问卷'''
self.responses.append(new_response)
def show_results(self):
'''显示收集到的所有答案'''
print("Survey results:")
for response in self.responses:
print("- " + response)
该类首先需要存储一个指定的调查问题并创建一个空列表来存储答案。此类包含打印调查问题的方法、将新答案添加到答案列表的方法以及打印出存储在列表中的所有答案的方法。要创建这个类的一个实例,你需要做的就是提供一个问题,一旦你有了一个类对象的实例,你可以使用 () 来显示问题, () 来存储答案,和 () 来显示调查结果。
具体用法如下代码所示:
from survey import AnonymousSurvey
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
my_survey.show_question()
print("Enter 'q' at any time to quit.\n")
while True:
response = input("Language: ")
if response == 'q':
break
my_survey.store_response(response)
print("\nThank you to everyone who participated in the survey!")
my_survey.show_results()
执行结果如下:
测试班
接下来针对这个类的各个方面的行为写一段测试代码,通过()来验证结果,具体代码:
import unittest
from survey import AnonymousSurvey
class TestAnonmyousSurvey(unittest.TestCase):
'''针对AnonymousSurvey类的测试'''
def test_store_single_response(self):
'''测试单个答案会被妥善存储'''
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
my_survey.shore_response("English")
my_survey.shore_response("Chinese")
self.assertIn("English", my_survey.responses)
unittest.main()
执行测试代码的结果如下:
添加一个测试用例,修改如下:
import unittest
from survey import AnonymousSurvey
class TestAnonmyousSurvey(unittest.TestCase):
'''针对AnonymousSurvey类的测试'''
def test_store_single_response(self):
'''测试单个答案会被妥善存储'''
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
my_survey.shore_response("English")
self.assertIn("English", my_survey.responses)
def test_store_three_responses(self):
'''测试三个答案会被妥善地存储'''
question = "What language did you first learn to speak?"
my_survey = AnonymousSurvey(question)
responses = ['English', 'Chinese', 'Mandarin']
for response in responses:
my_survey.shore_response(response)
for response in responses:
self.assertIn(response, my_survey.responses)
unittest.main()
执行结果如下:
方法 setUp()
在上一个测试类的多个测试用例的代码中,每个测试用例都会创建一个实例对象和对应的操作。实际上,.() 类中包含了 setUp() 方法天外神坛源码网,这样我们只需执行一次这些操作,并在以后的测试方法中使用。将上面的代码修改如下:
import unittest
from survey import AnonymousSurvey
class TestAnonmyousSurvey(unittest.TestCase):
'''针对AnonymousSurvey类的测试'''
def setUp(self):
'''创建一个调查对象和一组答案,供测试用例使用'''
question = "What language did you first learn to speak?"
self.my_survey = AnonymousSurvey(question)
self.responses = ['English', 'Chinese', 'Mandarin']
def test_store_single_response(self):
'''测试单个答案会被妥善存储'''
self.my_survey.shore_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.shore_response(response)
for response in self.responses:
self.assertIn(response, self.my_survey.responses)
unittest.main()
执行结果如下:
可以看出python简单代码示例,两个测试都通过了,测试代码写的更精简了。
总结
在本文中,使用模块中的工具为函数和类编写测试,编写.,编写测试方法,并使用断言来验证函数和类的行为是否符合预期,从而确定测试是否通过。并使用setUp()方法高效地根据类创建实例并设置属性,使其可以在类的所有测试方法中使用,从而简化测试类代码的编写。 |