Python 单元测试 & 文档测试

1.1   单元测试

1.1.1   单元测试编写

单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。

编写一个Dict类,这个类的行为和dict一致,但是通过属性来访问。

>>> d = Dict(a=1, b=2)

>>> d[‘a‘]

1

>>> d.a

1

class dict编写如下:

[[email protected] python]# cat mydict.py

#!/usr/bin/python

# -*- coding:utf-8 -*-

class Dict(dict):

def __init__(self, **kw):

super().__init__(**kw)

def __getattr__(self, key):

try:

return self[key]

except KeyError:

raise AttributeError(r"‘Dict‘ has no attribute %s." % key)

def __setattr__(self, key, value):

self[key] = value

编写单元测试:

[[email protected] python]# cat mydict_test.py

#!/usr/bin/python

# -*- coding:utf-8 -*-

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):     #测试类从unittest.TestCase继承

def test_init(self):            #不是以test开头的方法不被执行

d = Dict(a = 1, b = ‘test‘)

self.assertEqual(d.a, 1)

self.assertEqual(d.b, ‘test‘)

self.assertTrue(isinstance(d, dict))

def test_key(self):

d = Dict()

d[‘key‘] = ‘value‘

self.assertEqual(d.key, ‘value‘)

def test_attr(self):

d = Dict()

d.key = ‘value‘

self.assertTrue(‘key‘ in d)

self.assertEqual(d[‘key‘], ‘value‘)

def test_keyerror(self):

d = Dict()

with self.assertRaises(KeyError):  #通过d[‘empty‘]访问不存在的key时,断言会抛出KeyError

value = d[‘empty‘]

def test_attrerror(self):

d = Dict()

with self.assertRaises(AttributeError): #通过d.empty访问不存在的key时,我们期待抛出AttributeError

value = d.empty

if __name__ == ‘__main__‘:

unittest.main()     #运行单元测试

1.1.2   运行单元测试

[[email protected] python]# python mydict_test.py #加上unittest.main()运行语句

.....

----------------------------------------------------------------------

Ran 5 tests in 0.001s

OK

[[email protected] python]#

[[email protected] python]#

[[email protected] python]# python -m unittest mydict_test  #不用加上unittest.main()运行语句

.....

----------------------------------------------------------------------

Ran 5 tests in 0.001s

OK

1.1.3   setUp() & tearDown()

这两个方法分别在单元测试中每个测试方法的前后被执行。

[[email protected] python]# cat mydict_test.py

#!/usr/bin/python

# -*- coding:utf-8 -*-

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

def setUp(self):

print(‘test begins...‘)

def test_init(self):

d = Dict(a = 1, b = ‘test‘)

self.assertEqual(d.a, 1)

self.assertEqual(d.b, ‘test‘)

self.assertTrue(isinstance(d, dict))

def test_key(self):

d = Dict()

d[‘key‘] = ‘value‘

self.assertEqual(d.key, ‘value‘)

def test_attr(self):

d = Dict()

d.key = ‘value‘

self.assertTrue(‘key‘ in d)

self.assertEqual(d[‘key‘], ‘value‘)

def test_keyerror(self):

d = Dict()

with self.assertRaises(KeyError):

value = d[‘empty‘]

def test_attrerror(self):

d = Dict()

with self.assertRaises(AttributeError):

value = d.empty

def tearDown(self):

print(‘test ends...‘)

#if __name__ == ‘__main__‘:

#   unittest.main()

[[email protected] python]# pythonmydict_test.py    #发现这样测试没有作用

[[email protected] python]# python -m unittestmydict_test

test begins...

test ends...

.test begins...

test ends...

.test begins...

test ends...

.test begins...

test ends...

.test begins...

test ends...

.

----------------------------------------------------------------------

Ran 5 tests in 0.001s

OK

1.2   文档测试

当我们编写注释时,如果写上这样的注释:

def abs(n):

‘‘‘

Function to get absolute value of number.

Example:

>>> abs(1)

1

>>> abs(-1)

1

>>> abs(0)

0

‘‘‘

return n if n >= 0 else (-n)

无疑更明确地告诉函数的调用者该函数的期望输入和输出。

并且,Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试。

doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确。只有测试异常的时候,可以用...表示中间一大段烦人的输出。

让我们用doctest来测试上次编写的Dict类:

# mydict2.py

class Dict(dict):

‘‘‘

Simple dict but also support access as x.y style.

>>> d1 = Dict()

>>> d1[‘x‘] = 100

>>> d1.x

100

>>> d1.y = 200

>>> d1[‘y‘]

200

>>> d2 = Dict(a=1, b=2, c=‘3‘)

>>> d2.c

‘3‘

>>> d2[‘empty‘]

Traceback (most recent call last):

...

KeyError: ‘empty‘

>>> d2.empty

Traceback (most recent call last):

...

AttributeError: ‘Dict‘ object has no attribute ‘empty‘

‘‘‘

def __init__(self, **kw):

super(Dict, self).__init__(**kw)

def __getattr__(self, key):

try:

return self[key]

except KeyError:

raise AttributeError(r"‘Dict‘ object has no attribute ‘%s‘" %key)

def __setattr__(self, key, value):

self[key] = value

if __name__==‘__main__‘:

import doctest

doctest.testmod()

运行python3 mydict2.py:

$ python3 mydict2.py

什么输出也没有。这说明我们编写的doctest运行都是正确的。如果程序有问题,比如把__getattr__()方法注释掉,再运行就会报错:

$ python3 mydict2.py

**********************************************************************

File "/Users/michael/Github/learn-python3/samples/debug/mydict2.py",line 10, in __main__.Dict

Failed example:

d1.x

Exception raised:

Traceback (most recent call last):

...

AttributeError: ‘Dict‘ object has no attribute ‘x‘

**********************************************************************

File"/Users/michael/Github/learn-python3/samples/debug/mydict2.py", line16, in __main__.Dict

Failed example:

d2.c

Exception raised:

Traceback (most recent call last):

...

AttributeError: ‘Dict‘ object has no attribute ‘c‘

**********************************************************************

1 items had failures:

2of   9 in __main__.Dict

***Test Failed*** 2 failures.

注意到最后3行代码。当模块正常导入时,doctest不会被执行。只有在命令行直接运行时,才执行doctest。所以,不必担心doctest会在非测试环境下执行。

Python 单元测试 & 文档测试

时间: 2024-10-06 17:43:23

Python 单元测试 & 文档测试的相关文章

python错误处理/调试/单元测试/文档测试

一.错误处理 1.错误处理 try: ... except Exception1: ... except Exception2: ... finally: ... 如果在try中发生错误,那么except将捕获到指定错误,然后执行该段语句;而无论有无错误finally都会执行. 2.示例代码: #-*-coding=utf-8-*- a = 0 try: 10 / a except BaseException: print('a is 0') finally: print('done') 所有异

python 错误、调试、单元测试、文档测试

错误分为程序的错误和由用户错误的输入引起的错误,此外还有因为各种各样意外的情况导致的错误,比如在磁盘满的时候写入.从网络爬取东西的时候,网络断了.这类错误称为异常 错误处理 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017598873256736 普通的错误处理机制就是在出错的时候返回一个错误代码,但是这样十分不方便,一是因为错误码是和正常结果一样的方式返回的,判断起来十分不方便,二是错误还需要一级一级的向上报,直到错误处理程

Python学习笔记(二十二)文档测试

摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014319170285543a4d04751f8846908770660de849f285000 当我们编写注释时,如果写上这样的注释: def abs(n): ''' Function to get absolute value of number. Example: >>> abs(1) 1 >>

Python 文档测试

Python内置的"文档测试"(doctest)模块可以直接提取注释中的代码并执行测试. doctest严格按照Python交互式命令行的输入和输出来判断测试结果是否正确.只有测试异常的时候,可以用'''表示中间一大段烦人的输出. class Dict(dict): ''' Simple dict but also support access as x.y style. >>> d1 = Dict() >>> d1['x'] = 100 >&

Python学习笔记__8.4章 文档测试

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 在文档中编写规范的注释代码.则Python内置的"文档测试"(doctest)模块可以直接提取注释中的代码并执行测试. 1.1.以abs()函数为例: #abs.py def abs(n): ''' # 两个为一对,换行输入 Function to get absolute value of number.  # 简单的介绍 Example: >>> abs(1)   # 测试 1 >>>

三十一 文档测试

如果你经常阅读Python的官方文档,可以看到很多文档都有示例代码.比如re模块就带了很多示例代码: >>> import re >>> m = re.search('(?<=abc)def', 'abcdef') >>> m.group(0) 'def' 可以把这些示例代码在Python的交互式环境下输入并执行,结果与文档中的示例代码显示的一致. 这些代码与其他说明可以写在注释中,然后,由一些工具来自动生成文档.既然这些代码本身就可以粘贴出来直

python统计文档中词频

python统计文档中词频的小程序 python版本2.7 程序如下,测试文件与完整程序在我的github中 1 #统计空格数与单词数 本函数只返回了空格数 需要的可以自己返回多个值 2 def count_space(path): 3 number_counts = 0 4 space_counts = 0 5 number_list = [] 6 7 with open(path, 'r') as f: 8 for line in f: 9 line = line.strip() 10 sp

如何查询python帮助文档;sublime 快捷键

# 帮助文档 1.dir函数式可以查看对象的属性:Python命令窗口输入 dir(str) 即可查看str的属性. 2. 如何查看对象某个属性的帮助文档 ? 如要查看str的split属性,可以用__doc__(双下划线), 使用方法为print(str.split.__doc__) 或者help函数,使用方法为help(str.split). 要注意在python3.4中查看其它模块的对象属性要在help函数中加上‘’,help('time.strftime'): 或者先加载模块 impor

如何在命令行模式下查看Python帮助文档---dir、help、__doc__

如何在命令行模式下查看Python帮助文档---dir.help.__doc__ 1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即可查看str的属性,如下图所示: 2.如何查看对象某个属性的帮助文档 ?如要查看str的split属性,可以用__doc__, 使用方法为print(str.split.__doc__),如下图所示: 3.查看对象的某个属性还可以用help函数,使用方法为help(str.split),如下图所示: