2011-12-08 36 views
5

我是新來的測試自動化現場,所以原諒我,如果這是一個愚蠢的問題,但谷歌這次失敗了。或者至少我讀到的任何東西都讓我更加困惑。JUnit 4中是否有相當於testNG的@BeforeSuite?

我在Eclipse中使用JUnit 4和Selenium Webdriver。我有幾個測試,我需要作爲套件運行,也是單獨運行。目前這些測試在單獨運行時運行良好。在測試開始時,輸入框會呈現給測試人員/用戶,首先詢問他們希望測試哪個服務器(這是一個字符串變量,它成爲URL的一部分)以及他們希望測試的瀏覽器。當在一個套件中運行測試時,用戶在每次測試開始時都會被詢問,因爲顯然這被編碼到每個@Before方法中。

我該如何接受這些值一次,並將它們傳遞給每種測試方法?

因此,如果服務器=「server1」和瀏覽器=「firefox」,那麼firefox是我希望硒使用的瀏覽器,我希望它打開的URL是http://server1.blah.com/,適用於以下所有測試方法。我一直使用獨立的@Before方法的原因是因爲每個測試方法所需的URL略有不同。即每個方法測試不同的頁面,如server1.blah.com/something和server1.blah.com/somethingElse

測試運行良好,我只是不想繼續輸入值,因爲測試的數量方法最終會安靜得很大。

我也可以將我的測試轉換爲testNG,如果在testNG中有這樣做的更簡單的方法。我認爲@BeforeSuite註釋可能有效,但現在我不確定。

任何建議和批評(建設性的那種),我們非常感激

回答

0

這可能是有意義的組測試,以便測試套件將具有相同的@Before方法的代碼,讓你有一個測試套件每個獨立。

另一個選擇可能是爲每個測試使用相同的基本url,但通過讓selenium點擊到您想要執行測試的位置來導航到特定頁面。

1

您可以在此答案中修改爲套件設置全局變量的解決方案JUnit 4 Test invocation

基本上,您擴展Suite來創建MySuite。這會創建一個可以從您的測試中訪問的靜態變量/方法。然後,在你的測試中,你檢查這個變量的值。如果已設置,則使用該值。如果沒有,那麼你明白了。這使您可以運行單個測試和一套測試,但您只需要詢問一次用戶。

所以,你的浴室看起來像:

public class MySuite extends Suite { 
    public static String url; 

    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     MySuite.url = getUrlFromUser(); 
    } 
} 

這將在您的套房中使用像這樣:

@RunWith(MySuite.class) 
@SuiteClasses({FooTest.class, BarTest.class, BazTest.class}); 

然後,在你的測試類,你可以做的事@Before/@After,或者更好看TestRule,或者如果你想要之前和之後的行爲,看看ExternalResource。 ExternalResource看起來像這樣:

public static class FooTest { 
    private String url; 

    @Rule 
    public ExternalResource resource= new ExternalResource() { 
     @Override 
     protected void before() throws Throwable { 
      url = (MySuite.url != null) ? MySuite.url : getUrlFromUser(); 
     }; 

     @Override 
     protected void after() { 
      // if necessary 
     }; 
    }; 

    @Test 
    public void testFoo() { 
     // something which uses resource.url 
    } 
} 

你當然可以外部化ExternalResource類,並從多個測試用例中使用它。

+0

謝謝馬修,這有幫助。害怕我不得不問你一些可怕的noob問題雖然(第一行this(builder, klass, getAnnotatedClasses(klass));將無法​​正常工作,因爲getAnnotatedClasses(類)是不可見的第二我不確定在哪裏定義getUrlFromUser().. ...我意識到我可能會有點頭大,我會很感激你的耐心:) – user1088166

+0

你在你的問題中說'輸入框呈現給用戶'這將是getUrlFromUser,它不會真的很重要,但是在MySuite中可能會是一個好地方。至於這個(...)你使用的是哪個版本的JUnit? –

+0

好吧,我現在正在關注你。我使用的是JUnit 4.這可能並不相關,但我最初使用selenium IDE創建了測試用例,然後將它們導出爲JUnit 4(WebDriver)測試用例,以便在eclipse中與它們一起使用。 – user1088166

1

我認爲TestNG在這裏很有用的主要功能不僅僅是@BeforeSuite,而是@DataProviders,它使得使用不同的一組值運行相同的測試變得微不足道(並且不需要使用靜態,這在路上總是成爲一種責任)。

您可能還對TestNG的腳本支持感興趣,這使得在測試開始前詢問用戶輸入一些內容變得微不足道,here is an example of what you can do with BeanShell

+0

好評,但他們不回答這個問題。 –

0

如果使用@RunWith(Suite.class),則可以添加使用@BeforeClass(和@AfterClass)的靜態方法,該方法將在您定義的整個套件之前(和之後)運行。見this question

如果您指的是動態查找的整個類集並且沒有使用Suite runner,這當然不會起作用。

相關問題