2012-12-09 11 views
6

我正在寫一個測試套件用TestNG和硒webdriver的web應用程序。TestNG的運行所有類方法多次初步做@BeforeClass與提供的數據

我需要的是運行不同的身份驗證的用戶測試類多次的所有方法(在運行時數據被拉出:從DB)。所以我需要一個數據傳遞到與數據提供者類,所有用戶的用品憑證,然後爲每個用戶i需要創建一個網絡驅動器(用於實驗的純度),並在@BeforeClass方法與提供的憑證認證,運行所有@Test類的方法,並使@AfterClass拆除關閉網絡驅動程序。

我該怎麼做?

我試圖做到這一點的位置: https://gist.github.com/4246674

Attempt1是放在類@Test(dataProvider="getUsersIdAndName")。 它不起作用,因爲事實證明該類上的@Test(dataProvider=)並不意味着應該使用提供的數據調用該類的所有方法。 結果是該方法根本沒有被調用,因爲沒有數據要傳遞給它的參數。我得到奇怪的測試報告,這個方法被標記爲0秒的執行時間。 (這是一個Maven項目在NetBeans打開,如果這是有道理的。)

的類並@Test(dataProvider=)表示了什麼呢?

ATTEMPT2是添加的dataProvider上@Test註釋的方法的。 它不起作用,因爲這意味着在單班運行期間兩次調用測試方法。 結果是第二次失敗,因爲它試圖在Web驅動程序未重新初始化時重複測試:瀏覽器已經呈現另一個頁面。

此外,第一次和第二次嘗試登錄的缺點是在測試方法中完成,而不是在@BeforeClass方法中完成,因爲我不知道如何從數據提供者提供數據。

嘗試3是一個拼命試圖結合@BeforeClass@Test單一的方法。 它不起作用,因爲@BeforeClass還要求@Parameters如果一個註解的方法有一個參數列表。 結果是這個方法被調用三次:第一次當它由於上述原因而失敗時作爲類設置,第二次因爲數據提供者成功時失敗了兩次。

然後我發現TestNG的不提供一種方法來多次調用所有類方法不同的數據: http://comments.gmane.org/gmane.comp.java.testng.user/864

我有如何歸檔同等效力的其他兩個想法。

Idea4將在每個測試方法上放置一個@Test(dataProvider=),每種方法將自行執行驗證和測試,然後執行自己的測試。 無效而醜陋。

Idea5看起來像最好實惠之一是與將聚集所有其他的測試方法一@Test只有一個方法來標記:其從數據提供者接收的數據,由給定用戶進行認證,然後運行isAuthenticated測試和所有其他必要試驗。在這種情況下,@BeforeClass@AfterClass只能設置和拆除網絡驅動程序。這種方法的缺點是我失去了使用@BeforeMethod@AfterMethod的能力,但這對我來說是負擔得起的:看起來我不需要它們。

有沒有更好的方法來存檔相同的效果?

對不起,對於很長的留言。

在此先感謝。

回答

8

您可以嘗試探索Factory以滿足您的需求。工廠允許你運行所有使用不同數據的類的@Test註解的方法。在這種情況下,你可以在你的beforeclass上初始化你的webdriver。說明here

+0

謝謝。管理做我想要的。在構造函數中放置一個'@ Factory'註釋並使其從數據提供者接收數據。測試類的每個實例現在代表一個正在執行一系列測試的用戶登錄的Web驅動程序。構造函數加載屬性並在類字段中存儲指定的用戶憑證。 '@ BeforeClass'方法實例化Web驅動程序並使用存儲的憑證登錄。 '@ AfterClass'關閉網頁驅動程序。如果任何人有興趣,完整的代碼在這裏。 – yaromir

2

好的,讓我試着根據我對testNG和webdriver的經驗回答你的問題。

問:類上的@Test(dataProvider =)是否意味着什麼?
答:不可以。數據提供者是方法級別的註釋而不是類級別。如提到here。它應該是一種爲Object [] []格式的Test方法提供數據的方法。

問:如何實現您提到的場景? (假設我理解你的場景..)
答:您應該使用@BeforeMethod而不是@BeforeClass來實例化webdriver對象。這樣你可以爲每種方法創建一個不同的WD對象。 dataProvider可以將多個數據傳遞給isAuthenticated()方法。如果你想在類級別傳遞一個配置文件,你可以使用屬性文件加載邏輯來保存@BeforeClass。因此,該屬性文件將爲整個班級加載一次。顯然,你也應該使用@AfterMethod關閉webdriver對象。

+0

感謝您的回答。 我也在想這個解決方案(想法№4),但認爲它是無效的,因爲在每個測試方法之前實例化web驅動程序並登錄是多餘的,因爲理想情況下,每次測試都足夠完成一次類中的方法。我只需要用不同的用戶登錄的不同Web驅動程序實例多次執行所有操作。 無論如何。得到有用的信息。 – yaromir

相關問題