2010-11-18 53 views
2

我写了一个测试自动化框架。该框架是围绕对象和动作构建的。一个对象可能是一个文本框。它的动作可能是设置文本,清除,验证文本,验证启用等等。框架独立于活动,所以我们可以随着时间添加更多动作,而不必重新固定框架本身。我考虑了两种行动方法。第一个是使用命令模式。在这种情况下,我将有一个看起来像这样的接口:
寻找命令模式选择

public interface IAction
{
void Execute(StringDictionary properties);
}

的问题是,我们最终会得到很多的这些命令类。

public class SetTextAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}

public class ClearAction : IAction
{
{
}
}

public class VerifyTextAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}

public class VerifyEnabledAction : IAction
{
public void Execute(StringDictionary properties)
{
}
}

此外任何共享代码将需要在又一类。它似乎增加了代码中的噪声与信号的比例。

我想出的替代方法是使用实​​用程序类来执行操作的类型和方法。这最终看起来像这样:

public class TextboxActions
{
public static void set-text(StringDictionary properties)
{
}
public static void clear(StringDictionary properties)
{
}
public static void verify-text(StringDictionary properties)
{
}
public static void verify-enabled(StringDictionary properties)
{
}
}

这样的优点,对于文本框代码都在一起。另外,多个操作共有的任何代码都可以在同一个类中。不幸的是,这种方法要求我使用反射来“查找”操作方法。这显然不安全,并且可能很费时。它足够慢,我添加了一个缓存,所以我不必再次找到相同的动作,但这增加了代码的复杂性。

这些解决方案都可以工作,但它们都具有不理想的特性。有人可以提出这个问题的另一种方法吗?

回答

1

为什么你不能使用代表?也就是说,遵循一流的功能方法。如果您正在考虑制作单独的IAction具体实例,那么您可能只需要具体的函数指针。这样你的代码可以继续看起来像你的最后一个例子,但不能使用反射。

+0

谢谢我结束了这样的事情。 – 2010-11-27 15:15:19

+0

 delegate void TestAction(IDictionary properties); interface ITestObject { public List GetActions(); } 
2010-11-27 15:17:53

0

委托人的方式会是这样吗?

public abstract class TestObject 
{ 
    public delegate void TestAction(StringDictionary properties); 

    public void AddTestAction(TestAction action) 
    { 
    } 

    public void Execute() 
    { 
     // foreach test action etc. 
    } 
} 

public class TestTextBox : TestObject 
{ 
    TestTextBox() 
    { 
     Initialize(); 
    } 

    private void Initialize() 
    { 
     AddTestAction(new TestObject.TestAction(this.SetText)); 
     AddTestAction(new TestObject.TestAction(this.Clear)); 
    } 

    public void SetText(StringDictionary properties) 
    { 
    } 

    public void Clear(StringDictionary properties) 
    { 
    } 
} 
+0

你甚至不需要'AddTestAction'。 Initialize例程可以执行'TestAction + = SetText; TestAction + =清除;'。请记住,代表是固有的多元化的。 – 2010-11-19 00:10:18

+0

这是事实,但它会减少对何时执行的控制和清晰度。如果我想对每个操作做一些标准准备和清理怎么办? – Vitalogy 2010-11-19 00:46:09