有'代码',它正在不断发展。 有一个测试服务器,该服务器使用“测试代码”来测试不同平台中的“代码”。 我的问题涉及'测试代码'。
正如我所说,服务器测试不同的平台。但要实现这一点,测试代码需要能够处理这些不同的平台。由于使用了那些不同的平台,因此很难跟踪出现的那些小“差异”。它变得更加复杂,因为平台可以有不同的版本和......我必须交替测试它们的混合。
现在,我正在做类似的事情:
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倍,你可能会看到我现在正在处理的事情。所以我问是否有人知道一种模式/方法来更优雅或更健壮地处理它,即使它涉及编码架构来支持它。
谢谢你们。
答案 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)