1

如果我有简单函数fun1和的测试fun2,需要一些参数:

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

4 回答 4

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_valfun2_val的类属性Base,它们将在定义时仅计算一次。Base稍后可以在TestOne和中访问结果TestTwo

于 2013-07-29T19:49:10.767 回答
1

你有几个选择:

  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))
    

    如果您希望您的测试在单独的类中,只需在测试用例之外声明辅助函数。

于 2015-05-22T18:32:20.980 回答
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、TestOne 和 TestTwo 中的 test_func1 和 test_func3 打印出适当的值。

于 2013-07-29T19:44:01.983 回答
-1
from functools import partial

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

调用(参考):

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
于 2013-07-29T19:41:30.830 回答