2011-06-13 77 views
3

我想用硒來運行測試;似乎沒有一種好方法可以在多個瀏覽器上運行同一組單元測試。如何創建一個在c#中轉發方法調用的代理對象?

我看到這篇文章關於並行運行測試: http://slmoloch.blogspot.com/2009/12/design-of-selenium-tests-for-aspnet_19.html

不過,我使用Visual Studio單元測試框架。

我可以創建一個代理類是這樣的:

public class SeleniumProxy { 
    private List<DefaultSelenium> targets; 
    public SeleniumProxy() { 
     targets = new List<DefaultSelenium>(); 
     targets.Add(new DefaultSelenium(... "firefox"...)); 
     targets.Add(new DefaultSelenium(... "iexplore"...)); 
    } 
    public void Open(String url) { 
     foreach (var i in targets) { 
      i.Open(url); 
     } 
    } 
    ... 
} 

我的問題是這樣嗎?我怎樣才能做到這一點,而不必將整個班級改寫爲代理?

我想也許會傳遞一個lamda來映射參數,或者傳遞一個函數來接受要調用的方法的名字,但是這些都看起來像是非常蹩腳的想法。

我真正想要的是添加成員,如:

public class SeleniumProxy { 
    public dynamic proxy; 
    .... 
} 

並調用此類似:

var selenium = getProxy(); 
selenium.proxy.Open("..."); 

是否C#允許這種語法的動態對象?

或某種類的元處理程序,讓他們捕捉這種方法的異常並手動處理它們?

基本上: 如何創建一個代理對象來動態調用類的內部成員上的方法?

(編輯:也許...使用DefaultSelenium物體上反射和每個條目的動態代理對象上創建功能存根..)

+0

如果我是你,我會再次看看Selenium Grid,它非常先進。根據我的經驗,IE Selenium測試需要FF和FF一樣長,因此如果您嘗試以並行方式運行測試,FF測試也將持續進行。 – artbristol 2011-06-13 09:01:40

+0

如果需要更長時間,這並不重要;無論如何,你必須等待IE瀏覽器。 – Doug 2011-06-13 12:16:52

回答

0

如果我理解你嘗試一下,我覺得你可以擴展DynamicObject來實現這一點。

class Proxy : System.Dynamic.DynamicObject 
{ 
    public Proxy(object someWrappedObject) { ... } 

    public override bool TryInvokeMember(System.Dynamic.InvokeMemberBinder binder, object[] args, out object result) 
    { 
     // Do whatever, binder.Name will be the called method name 
    } 
} 

//Do whatever...會成爲一些代碼,使用binder.Name作爲查找過程的一部分在某一其它對象的內部構件戳(經由反射,大概)。

TryGetMemberTryGetIndex方法來覆蓋,如果你需要包裝這個簡單的方法調用fancier的東西。

施工後必須施放Proxydynamic的實例才能進行任意調用,就像處理ExpandoObject時一樣。

0

您可以利用繼承,並使用工廠方法在抽象基類中定義您的測試,以創建您的硒實例,然後針對您要建模的每種類型的瀏覽器繼承此項。然後,將使用適當的瀏覽器爲每個繼承的類運行測試。以NUnit爲例:

public abstract class AbstractTests 
{ 
    protected abstract DefaultSelenium CreateSelenium(); 

    [Test] 
    public void TestSomethingA() 
    { 
     DefaulSelenium selenium = CreateSelenium(); 

     //Do some testing with selenium. 
    } 
} 

[TestFixture] 
public class IETests : AbstractTests 
{ 
    protected override DefaultSelenium CreateSelenium() 
    { 
     return new DefaultSelenium("iexplore"); 
    } 
} 

[TestFixture] 
public class FirefoxTests : AbstractTests 
{ 
    protected override DefaultSelenium CreateSelenium() 
    { 
     return new DefaultSelenium("firefox"); 
    } 
} 
相關問題