寻找能够处理不同平台/版本的测试模式/方法

时间:2011-02-17 20:46:34

标签: design-patterns testing architecture

有'代码',它正在不断发展。 有一个测试服务器,该服务器使用“测试代码”来测试不同平台中的“代码”。 我的问题涉及'测试代码'。

正如我所说,服务器测试不同的平台。但要实现这一点,测试代码需要能够处理这些不同的平台。由于使用了那些不同的平台,因此很难跟踪出现的那些小“差异”。它变得更加复杂,因为平台可以有不同的版本和......我必须交替测试它们的混合。

现在,我正在做类似的事情:

test1()
    if(platform == 'a' && version == '1.4')
        assert('bla',bla)
    else if(platform == 'a' && version == '1.5')
        assert('ble',bla)
    else if(version == '1.6')
        assert('blu',bla)
    .....

现在,想象一下,但是要复杂100倍,你可能会看到我现在正在处理的事情。所以我问是否有人知道一种模式/方法来更优雅或更健壮地处理它,即使它涉及编码架构来支持它。

谢谢你们。

1 个答案:

答案 0 :(得分:2)

如果将复杂性存储在多态对象中,则可以聚合差异并丢失if语句。好处是您可以解耦您的平台 与测试代码的差异,毕竟只与制作有关 断言不同的环境选择。

这是我用Python实现的一个简单例子。我们的想法是,为您关心的每个环境配置调用一次test1函数。您应该期望的细节由多态对象处理。现在你的测试代码很简单 - 只是映射到正确的对象,然后是断言。

#!/usr/bin/python

class platform_a(object):

    def __init__(self, version):
        self.version = version
        self.bla_mapping = {
                             '1.4' : 'bla',
                             '1.5' : 'ble',
                             '1.6' : 'blu'
                            }

        self.bla = self.bla_mapping[self.version]

# Dummy stubs to demo the test code
class platform_b(object):
    def __init__(self):
        # Obviously, add all platform B specific details here - this is
        # just an example stub
        self.bla = 'blu'

class platform_c(object):
    def __init__(self):
        # Obviously, add all platform C specific details here - this is
        # just an example stub
        self.bla = 'boo'

def get_the_platform(): return 'a'
def get_the_version():  return '1.4'
def result_of_running_the_real_code(): return 'bla'

def test1(platform, version):

    # Map platform names to our polymorphic platform objects
    env_mapping = dict(
                        a = platform_a,
                        b = platform_b,
                        c = platform_c,
                                       )

    # Instantiate an object corresponding to the unique environment under test
    environment = env_mapping[platform](version)

    # Get the result of running the real code in this environment
    bla = result_of_running_the_real_code()

    # Test we got what we expected
    assert(environment.bla, bla)


# TEST HARNESS TOP LEVEL STARTS HERE
# The environment is presumably specified by the test harness
platform = get_the_platform()
version  = get_the_version()

# Run the test
test1(platform, version)