1. 测试函数
1.1 创建测试用例
-
1 import unittest 2 from name_func import get_name 3 4 class NamesTestCase(unittest.TestCase): 5 def test_first_last_name(self): 6 name = get_name('janis', 'joplin') 7 self.assertEqual(name, 'Janis Joplin') 8 9 unittest.main()
运行结果
. ---------------------------------------------------------------------- Ran 1 test in 0.014s OK
- 首先导入模块unittest和要测试的函数get_name()
- 在第4行处,创建了一个名为NamesTestCase的类,用于包含一系列针对get_name()函数的单元测试,这个类必须继承unittest.TestCase类,这样python才能知道如何运行你编写的测试
- 用于测试函数的方法名必须以test_开头,这样它才能在我们运行程序时自动运行
- 在第7行使用了unittest类最有用的功能之一:断言方法。断言方法用来核实得到的结果是否与期望的结果一致
- 第7行的意思即:将name的值和字符串"Janis Joplin"进行比较,若他们相等,则万事大吉;否则,要提示我
- 第9行,unittest.main()让python运行这个文件中的测试
- 若测试包含中间名的姓名,则测试未通过,如下所示
-
def test_first_last_name(self): name = get_name('janis', 'joplin', 'abc') self.assertEqual(name, 'Janis Joplin Abc')
运行结果
E ====================================================================== ERROR: test_first_last_name (__main__.NamesTestCase) ---------------------------------------------------------------------- Traceback (most recent call last): File "D:\Python\codes\7-24-01.py", line 6, in test_first_last_name name = get_name('janis', 'joplin', 'abc') TypeError: get_name() takes 2 positional arguments but 3 were given ---------------------------------------------------------------------- Ran 1 test in 0.009s FAILED (errors=1)
2. 测试类
2.1 一个要测试的类
-
class AnonymousSurvey(): '''收集匿名调查问卷的答案''' def __init__(self, question): '''存储一个问题,并为存储答案做准备''' self.question = question self.responses = [] def store_response(self, new_resp): '''存储单份调查答卷''' self.responses.append(new_resp)
2.2 测试AnonymousSurvey类
-
import unittest from survey import AnonymousSurvey class TestAnonymousSurvey(unittest.TestCase): '''针对AnonymouSuvey类的测试''' def test_store_single_response(self): '''测试单个答案的存储''' question = "What language did you first learn to speak?" my_survey = AnonymousSurvey(question) my_survey.store_response('English') self.assertIn('English', my_survey.responses) def test_store_three_response(self): '''测试三个答案的存储''' question = "What language did you first learn to speak?" my_survey = AnonymousSurvey(question) responses = ['English', 'Spanish', 'Chinese'] 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.012s OK
- 这两个测试有些重复的地方,创建了两个AnonymousSurvey实例,并在每个方法中都创建了答案。下面使用unittest.TestCase类的方法setUp()来提高它们的效率,可以只创建一次实例,并在每个测试方法中使用它们
2.3 方法setUp()
-
class TestAnonymousSurvey(unittest.TestCase): '''针对AnonymouSuvey类的测试''' def setUp(self): '''创建一个调查对象和一组答案,供测试方法使用''' question = "What language did you first learn to speak?" self.my_survey = AnonymousSurvey(question) self.responses = ['English', 'Spanish', 'Chinese'] 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) unittest.main()
运行结果
.. ---------------------------------------------------------------------- Ran 2 tests in 0.012s OK
- 若在类中包含了方法setUp(),python将先运行它,再运行各个以test_打头的方法,这样在每个测试方法中都可使用在setUp()中创建的对象
- setUp()方法将实例和答案列表存储在属性中,因此可在这个类的任何地方使用
- 运行测试用例时,每完成一个单元测试,python都打印一个字符:
- 测试通过时打印一个句点
- 测试引发错误时打印一个E
- 测试导致断言失败时打印一个F