带子功能的python unittest

时间:2013-07-29 19:39:19

标签: python unit-testing python-unittest

如果我对简单函数fun1fun2进行测试,需要一些参数:

class TestOne(unittest.TestCase):
    def test_func1(self):
        a = 0
        b = 1
        c = 2
        self.assertEquals(c, fun1(a,b))

    def test_fun2(self):
        d = 0
        e = 1
        f = 2
        self.assertEquals(f, fun2(d,e))

和第三个函数的测试,需要输出fun1和fun2作为输入

class TestTwo(unittest.TestCase):

    def test_fun3(self):
        a = 0
        b = 1
        d = 0
        e = 1
        g = 3
        self.assertEquals(g, fun3(fun1(a,b), fun2(d,e)))

避免重写第一个函数的参数的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

class Base(unittest.TestCase):
    fun1_val = fun1(a=0, b=1)
    fun2_val = fun2(d=0, e=1)

class TestOne(Base):
    def test_func1(self):
        c = 2
        self.assertEquals(c, self.fun1_val)

    def test_fun2(self):
        f = 2
        self.assertEquals(f, self.fun2_val)

class TestTwo(Base):
    def test_fun3(self):
        g = 3
        self.assertEquals(g, fun3(self.fun1_val, self.fun2_val))        

通过制作fun1_val的{​​{1}}和fun2_val类属性,在定义Base时,只会计算一次。稍后可以在BaseTestOne中访问该结果。

答案 1 :(得分:0)

我相信你也可以创建另一个类。我已经看到了这一点,但我以前没有真正做过。如果有人知道这是有效的,请在我自己测试时发表评论:):

class Tests(unittest.TestCase):
    def __init__(self):
        self.a = 0
        self.b = 1
        self.c = 2

class TestOne(Tests):
    def test_func1(self):
        self.a
        self.b
        self.c

class TestTwo(Tests):
    def test_fun3(self):
        self.a
        self.b
        self.c

更新:通过改变类Tests()中的self.a~c,test_func1& TestOne中的test_func3& TestTwo打印出适当的值。

答案 2 :(得分:0)

您有以下几种选择:

  1. 我在顶部添加了这个,因为其他每个答案似乎都想使用继承。如果是这种情况,您只想在每个测试部分之前设置值(与使用setUp的每个测试相对),请使用setUpClass

    from unittest import TestCase
    class BaseTest(TestCase):
      def setUpClass(cls):
        cls.a = 0
        cls.b = 1
        cls.c = 2
    
    class TestOne(BaseTest):
      def test_func1(self):
        self.assertEquals(self.c, func1(self.a, self.b))
    
  2. 使用setUp。如果您经常更改参数,这可能不是最佳解决方案。但您也可以在基类中定义设置并使用继承(正如其他人所建议的那样)。

    from unittest import TestCase
    class TestingSomething(TestCase):
      def setUp(self):
        self.parameters = [(0, 1), ]
    
      def test_func1(self):
        params = self.parameters[0]
        res = func1(*params)
        self.assertEquals(2, res)
    
  3. 定义辅助函数。

    from unittest import TestCase
    class TestingSomething(TestCase):
    
      def param_set_one(self):
        return (0, 1), 2
    
      def test_func1(self):
        params, expected = self.param_set_one()
        res = self.obj.func1(*params)
        self.assertEquals(expected, res)
    
  4. 也许对您的问题更具体的答案可能是使用更具体的帮助函数:

    from unittest import TestCase
    class TestingSomething(TestCase):
      def setUp(self):
        self.obj = TestOne()
    
      def param_set(self):
        return (0, 1)
    
      def get_func1(self):
        return self.obj.func1(*self.param_set())
    
      def get_func2(self):
        return self.obj.func2(*self.param_set())
    
      def test_func1(self):
        params = self.param_set()
        res = self.obj.func1(*params)
        self.assertEquals(2, res)
      [...]
      def test_func3(self):
        retval_func1 = self.get_func1_retval()
        retval_func2 = self.get_func2_retval()
        self.assertEqual(3, func3(retval_func1, retval_func2))
    

    如果您希望测试位于不同的类中,只需在测试用例之外声明帮助函数。

答案 3 :(得分:-1)

from functools import partial

f1 = partial(fun1, a, b)
f2 = partial(fun2, d, e)

致电(ref):

f1()
f2()

或者在你的情况下:

f1 = partial(fun1, 0, 1)
f2 = partial(fun2, 0, 1)

示例:

In [1]: from functools import partial

In [2]: def fun1(a, b):
   ...:     return a + b
   ...: 

In [3]: f1 = partial(fun1, 0 ,1)

In [4]: f1()
Out[4]: 1