gpt4 book ai didi

python - 针对多个实现运行相同的测试

转载 作者:行者123 更新时间:2023-11-28 17:39:51 24 4
gpt4 key购买 nike

如果我有一个函数的两个实现应该做同样的事情,有什么方法可以针对相同的测试用例测试这两个函数?

据我所知:

def foo1(args):
// do some stuff
return result1

def foo2(args):
// do some other stuff
return result2

import unittest

class TestFoo(unittest.TestCase):

def test_1(self):
arg = // something
result = // expected result
self.failUnless(foo1(arg) == result)

def test_2(self):
arg = // something
result = // expected result
self.failUnless(foo2(arg) == result)

但 test_2 与 test_1 完全相同,只是被测试的功能不同。如果我对测试用例进行更改,则必须更改两者,如果添加更多测试,则必须复制它们。

我可以这样做:

class TestFoo(unittest.TestCase):
def test_(self):
fns = [foo1, foo2]
arg = // something
result = // expected result
for fn in fns:
self.failUnless(fn(arg) == result)

这减少了代码重复,但现在如果任一实现未通过测试,unittest 不会报告是哪一个。

是否可以通过要测试的函数来参数化一个TestCase?

我知道我不应该尝试在测试上太聪明,所以也许我应该保持原样,重复代码等等。

最佳答案

这是使用类属性和继承的一种方法。

def foo1(a, b):
return b + a

def foo2(a, b):
return a + b

import unittest

class TestFooBase:
def test_1(self):
self.assertEqual(self.impl(0, 0), 0)
def test_2(self):
self.assertEqual(self.impl(1, 2), 3)

class TestFoo1(unittest.TestCase, TestFooBase):
impl = staticmethod(foo1)

# OR
# def impl(self, *args, **kwargs):
# return foo1(*args,**kwargs)


class TestFoo2(unittest.TestCase, TestFooBase):
impl = staticmethod(foo2)

注意 TestFooBase 不应是unittest.TestCase 的子类。否则将运行 6(3x2) 个测试而不是 4(2x2) 个。

如果您使 TestFoo1 继承自 TestFoo2(反之亦然),则

TestFooBase 不是绝对必要的。

class TestFoo1(unittest.TestCase):
impl = staticmethod(foo1)
def test_1(self):
self.assertEqual(self.impl(0, 0), 0)
def test_2(self):
self.assertEqual(self.impl(1, 2), 3)

class TestFoo2(TestFoo1):
impl = staticmethod(foo2)

顺便说一句,failUnless已弃用。使用 assertTrueassertEqual如以上代码所示。

关于python - 针对多个实现运行相同的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25959504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com