python单元测试简单使用介绍

Posted by Shi Hai's Blog on February 20, 2017

python单元测试简单使用介绍,在openstack/tempest测试框架也是基于unitest发展而来的。

python-unittest测试基础框架

基础demo

import unittest

class TestStringMethods(unittest.TestCase):

    def test_upper(self):
        self.assertEqual('foo'.upper(), 'FOO')

    def test_isupper(self):
        self.assertTrue('FOO'.isupper())
        self.assertFalse('Foo'.isupper())

    def test_split(self):
        s = 'hello world'
        self.assertEqual(s.split(), ['hello', 'world'])
        # check that s.split fails when the separator is not a string
        with self.assertRaises(TypeError):
            s.split(2)

if __name__ == '__main__':
    unittest.main()

我们可以调用unittest.main()来运行单元测试用例,除此之外我们还可以使用python -m unittest 测试文件(不要输入.py)的方式进行。

Mock框架

基础demo

import mock
class Foo:
    def eat(self):
        print "eating eating all the time!"

foo = Foo()
foo.eat()

foo.eat = mock.Mock(return_value=123)
# it would return a 3
foo.eat()

foo.eat = mock.Mock(side_effect=KeyError("idiot"))
# it would raise a key error exception
foo.eat()

values = {"a": 1, "b":2, "c":3}
def side_effect(args):
    return values[args]
mock = Mock()
mock.side_effect = side_effect
# return 1
mock("a")
# return 2
mock("b")
# return 3
mock("c")

在这个例子中,我们使用了mock.Mock()。除了使用Mock类之外,我们还可以使用mock.MagicMock类,该类是mock.Mock子类,已经实现了mock.Mock类的大多数方法。So,推荐使用MagicMock类。

patch装饰器

patch()装饰器能够在测试用例中轻而易举地mock出用测试的类。

import mock
@mock.patch("module.class1", return_value=1)
@mock.patch("module.class2")
def test(mock_class_2,mock_class_1):
    mock_class_2.return_value = 3
    self.asserteq(mock_class_2.return_value, 2)

ddt框架

DDT(Data-Driven Tests)容许我们在写测试用例的时候产生不同的测试用例。

ddt 基础demo

import unittest
import ddt

@ddt.ddt
class FooTest(unittest.TestCase):
    @ddt.data(123)
    def test_demo1(self, value):
        print value

    @ddt.data({"a":1, "b":2})
    @ddt.unpack
    def test_demo2(self, a, b):
        print a
        print b

coverage框架

Coverage.py是测试代码python程序覆盖度的测试框架,coverage会监测你的程序,分析代码的执行情况。

基础用法

进入源码更目录,执行 coverage report -m(-m会显示未被执行的代码行)。执行coverage html会输出覆盖度执行报告。

附录

  1. pythonbanyan测试官方文档
  2. python单元测试工具分类
  3. python-mock指导说明
  4. ddt指导说明