您的位置:首页 > 编程语言 > Python开发

Python学习笔记(6)测试

2017-07-22 10:52 363 查看

Chapter 11

测试代码

使用Python标准库中模块
unittest
提供的测试工具。

#name.py
def get_full_name(first, last, middle=''):
"""获取全名"""
if middle == '':
full_name = first.title() + ' ' + last.title()
else:
full_name = first.title() + ' ' + middle.title() + ' ' +last.title()
return full_name


#test.py
import unittest
from name import get_full_name

class NameTestCase(unittest.TestCase):
"""测试name.py"""

def test_first_last_name(self):
full_name = get_full_name('ming', 'xing')
self.assertEqual(full_name, 'Ming Xing')

def test_first_last_middle_name(self):
full_name = get_full_name('ming', 'xing', 'xiao')
self.assertEqual(full_name, 'Ming Xiao Xing')

unittest.main()


注意:

1.
NameTestCase
是继承
unittest.TestCase
的。

2.
test_first_last_name
是一个
单元测试
,许多
单元测试
组成
测试用例
。单元测试的名称,
必须
test_
开头,这样Python才能自动运行它们。另外,单元测试的名称是描述性的,必须高度概括测试内容,方便后续Debug。

3.
self.assertEqual(full_name, 'Ming Xing')
这是
unittest
中的一个
断言方法
,断言方法用来判断结果与我们的预期是否一致。断言方法只能在继承
unittest.TestCare
中的类中使用。

下面介绍
六种常见的断言方法


assertEqual(a, b)
核实
a == b


assertNotEqual(a, b)
核实
a != b


assertTrue(x)
核实
x == True


assertFalse(x)
核实
x == False


assertIn(Item,List)
核实
Item in List


assertNotIn(Item,List)
核实
Item not in List


4. 如果程序正常运行,输出是这样的

..
----------------------------------------------------------------------

Ran 2 tests in 0.000s


注意:

如果
test_first_last_middle_name
发生错误,另一个正确,输出是这样的

E.
======================================================================

ERROR: test_first_last_middle_name (__main__.NameTestCase)
----------------------------------------------------------------------

Traceback (most recent call last):
File "/Users/xxx/Desktop/CODE/test.py", line 10, in test_first_last_middle_name
full_name = get_full_name('ming', 'xing', 'xiao')
File "/Users/xxx/Desktop/CODE/name.py", line 6, in get_full_name
full_name = first.title() + ' ' + middle.title() + ' ' +last.title
TypeError: must be str, not builtin_function_or_method

---------------------------
4000
-------------------------------------------
Ran 2 tests in 0.000s

FAILED (errors=1)


关于上面两个输出结果:
E
表示一个单元测试引发错误,
F
表示一个单元测试导致断言失败,
.
表示一个单元测试通过。

unittest.main()
让Python运行这个文件中的测试。

测试类

与上面的测试函数类似。只不过,在每一个单元测试中,我们都先要对类实例化,并设置其属性。为了减少工作量,可以在单元测试之前使用
setUP()
,这样,我们只需创建一次实例,就可以在每个测试方法中使用它们。

#此处省略AnonymousSurvey类
import unittest
from survey import AnonymousSurvey

class TestAnonymousSurvey(unittest.TestCase):
""" 对AnonymousSurvey类的测试"""
def setUp(self):
question = "What language did you first learn to speak?"
self.my_survey = AnonymousSurvey(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)

unittest.main()


注意:

不建议在
for循环
中修改列表!

如果需要类似的情形,可以再建一个空列表,把新元素根据需要
append()
进去。如果要删除列表元素,可以这样:

for star in stars.sprites().copy():
stars.remove(star)


还有,下面的程序只有暂时效果,是
修改不了
列表的!

list = ['ni', 'hao', 'liang', 'cong']
for item in list:
item = 'hi'

#实际上并不能修改!只有list[x] = y才能修改!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: