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用法文档