python单元测试 - peter-xbs/CommonCodes GitHub Wiki
方式1 nosetests
nosetests -v
nosetests将在当前工作目录下的文件和目录中运行其名字【包含test或Test】的测试,如(test_name.py, func_test.py),每个test函数内部作assert的声明
上述命令会对assert error的函数进行显示,从而定位哪个测试函数错误
方式2 unittest
nosetests实现了简单的基本功能,但是需和assert结合,且无法精确定位错误原因, unittest则丰富了这方面的功能
import unittest
class TestKey(unittest.TestCase):
def test_key(self):
a = ['a', 'b']
b = ['b']
self.assertEqual(a,b)
上述案例再运行
nosetests -v
除返回报错函数,还会详细给出差异原因,unittest提供了一组测试函数,可以用来特化测试 ● 如果想忽略对某个函数的测试
import unittest
try:
import mylib
except ImportError:
mylib = None
class TestSkipped(unittest.TestCase):
@unittest.skip("Do not run this")
def test_fail(self):
pass
@unittest.skipIf(mylib is None, "mylib is not available")
def test_mylib(self):
self.assertEqual(mylib.foobar(), 42)
此时再运行测试时,将跳过这些测试函数(或者满足条件后跳过)
在许多场景中,需要在运行某个测试前后执行一组通用的操作,unittest提供了两个特殊的方法setUp和tearDown,它们会再类的每个测试方法调用前后执行一次
import unittest
class TestMe(unittest.TestCase):
def setUp(self):
self.list = [1, 2, 3]
def test_length(self):
self.list.append(4)
self.assertEqual(len(self.list), 4)
上例中setUp会在运行test_length前调用,保证准备好相关条件
测试序列
将测试结果导出到文件中
python -m subunit.run test_scenario |subunit2pyunit(or subunit2csv)
并行测试
使用testrepository包 制作配置文件
testr init
touch .testr.conf
编辑.testr.conf
[DEFAULT]
test_command=python -m subunit.run discover . $LISTOPTION $IDOPTION
test_id_option=--load-list $IDFILE
test_list_option=--list
testr run --parallel --concurrency=2 # 即可并行测试
测试覆盖
测试覆盖是完善单元测试的工具,它通过代码分析工具和跟踪钩子来判断代码的哪些部分被执行了。编写测试当然有用,但是知道代码的哪些部分没有被测试到才是关键所在。
● 安装coverage模块使用nosetests
nosetests --cover-package=ceilometer --with-coverage tests/test_pipeline.py
上述例子测试了ceilometer 这个Package的测试覆盖情况
● 直接使用coverage
coverage run func_test.py
目录下生成.coverage文件
coverage html file_name(可选)
可以将上述报告生成为html
● 合并多个测试用例覆盖率报告
coverage combine
# 再执行
coverage html
# 生成多份测试用例合并后的Html报告
测试环境和自动化测试
tox的目标是自动化和标准化Python中运行测试的方式。在使用tox之前,需要提供一个配置文件,名为tox.ini,详情参见tox package用法文档