2010-11-18 52 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