2

假设我有一个ServA用 python 编写的 Web 服务,我想编写一些单元测试。

ServA做了几件事(具有不同的视图),但所有视图都会产生类似的请求日志。

这些测试应该检查ServA不同情况下的日志,所以这些单元测试有很多重复的代码(日志的结构总是一样的)。

我的想法是编写一个通用函数来避免代码重复,我发现另一个问题可以解决在 unittest 类中创建通用方法的问题。

但是现在如果我有另一个 Web 服务ServB和另一组测试并且我需要做同样的事情怎么办?

有没有办法重用泛型函数?

我是否应该简单地使用检查日志的方法创建一个测试类,如下所示:

class MyMetaTestClass(unittest.TestCase):
    def check_logs(self, log_list, **kwargs):
       #several self.assertEqual

然后 ServA 和 ServB 的测试继承这个类,如下所示:

class TestServA(MyMetaTestClass):
    def test_log1(self):
       logs = extract_the_logs()
       self.check_logs(logs, log_1=1, log2='foo')

还有另一种(更好的)方法吗?

4

2 回答 2

9

您可以像以前一样从公共基类继承,但基类本身不必是 TestCase 子类 - 您可以将其设为 mixin 类:

# testutils.py
class LogCheckerMixin(object):
    """ this class adds log checking abilities to a TestCase.
    """  
    def check_logs(self, logs, **kw):
       self.assertWhatever(something)


# myserver/tests.py
import unittest
from testutils import LogCheckerMixin

class MyServerTest(unittest.TestCase, LogCheckerMixin):
    def test_log1(self):
        logs = extract_the_logs()
        self.check_logs(logs, log_1=1, log2='foo')

或者你可以把它变成一个普通的函数并从你的测试中调用它:

# testutils.py
def check_logs(testcase, logs, **kw):
    testcase.assertWhatever(something)


# myserver/tests.py
import unittest
from testutils import check_logs

class MyServerTest(unittest.TestCase):
    def test_log1(self):
        logs = extract_the_logs()
        check_logs(self, logs, log_1=1, log2='foo')
于 2013-10-17T14:53:16.697 回答
0

它是基于意见的,但我最常看到的是一组单独的帮助类,任何测试套件都可以使用它们。

我通常创建infrastructure文件夹/命名空间/模块/包(在测试项目中),而不是混淆应该只关注领域方面和技术问题的测试。在这种情况下,你可以有这样的事情:

logHelper.py

def assert_something_about_logs(logs, something):
    # utility code
    # do an assertion

def assert_something_else(logs):
    # utility code
    # do an assertion

等等

例如,这样你的单元测试就可以很好地阅读assert_that_logs_contain(errorMessage="Something went wrong"),并且所有技术细节都被隐藏起来,以免混淆测试。

于 2013-10-17T14:54:13.490 回答