如果我对简单函数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)))
避免重写第一个函数的参数的最佳方法是什么?
答案 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
时,只会计算一次。稍后可以在Base
和TestOne
中访问该结果。
答案 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)
您有以下几种选择:
我在顶部添加了这个,因为其他每个答案似乎都想使用继承。如果是这种情况,您只想在每个测试部分之前设置值(与使用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))
使用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)
定义辅助函数。
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)
也许对您的问题更具体的答案可能是使用更具体的帮助函数:
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