2017-02-05 37 views
0

我已經嘗試了很多方法,但都沒有成功,我開始相信這在TestNG中是不可行的,我只是想和你確認一下。TestNG - 爲了不可能的場景運行測試?

我有我正在測試的web服務,我需要運行一些基本的場景。



我的當前測試方法,每種具有@Test註解(每個需要是可測試的作爲單一試驗):

  • dbResetTest
  • clearCacheTest
  • openURLTest
  • loginTest
  • actionXTest
  • actionYTest



我還需要運行這些場景從上面包括運行測試順序:

  1. 測試登錄功能(openURLTest - >dbResetTest - >clearCacheTest - >loginTest
  2. 測試X登錄後(openURLTest - >dbResetTest - >clearCacheTest - >loginTest - >actionXTest
  3. 測試清除緩存後的Y(clearCacheTest - >actionYTest



的問題是,如果我從1點& 2依賴他人做測試中,我將無法運行方案3,因爲clearCacheTest沒有在此特定情形依賴於任何其他。我試着通過xml和依賴關係運行這些測試,但沒有成功。

當然,我可以讓actionYTest調用clearCacheTest直接,但這時如果clearCacheTest失敗的報告將顯示,actionYTest是一個失敗這是我儘量避免。

現在我敢肯定,我需要的是不TestNG中實現的,但也許我錯了......

回答

0

我想你應該稍微改變自己的戰術。而不是感知這些〜(dbResetTest等)作爲測試類,您應該讓它們測試方法,並以編程方式(而非XML)而不是dependsOnGroups使用dependsOnMethods。然後,您將能夠輕鬆實現所需的邏輯(每個測試都是唯一的 - > @Test註釋,每個測試都以特定優先級執行 - >使用優先級參數)。然後1,2,3測試應該是你的測試類。因此,這裏是你怎麼做:如果

public class LoginFeature { 

    @Test (priority=1) 
    public openURLTest(){ 
    } 

    @Test (priority=2, dependsOnMethods="openURLTest") 
    public dbResetTest(){ 
    } 


    @Test (priority=3, dependsOnMethods="dbResetTest") 
    public clearCacheTest(){ 
    } 

    @Test (priority=4, dependsOnMethods="clearCacheTest") 
    public loginTest(){ 
    } 



} 

這樣的東西你的測試失敗之間在會自動跳過的情景休息,你會不會需要直接調用clearCacheTest。

希望這會有所幫助!


更新

OP的評論

好後,我再次覺得你還挺有一個設計問題。爲了讓你的方法被多次調用,他們需要坐在他們可以訪問的地方。你幾乎在那裏與你的方法,但不完全。所以這裏是你如何調用方法。多次,都從頭運行它們(我會先告訴你的代碼,然後詳細解釋):

父類

public class TestBase{ 
    //include here all your important methods *without* @Test Annotation 

    public void dbReset(){ 
    //perform db reset 
    } 

    public void clearCache(){ 
    //clear browser cache 
    } 

    public boolean openURL(){ 
    //try to open test URL 
    return didIreachTestURLSuccessfully; 

    } 

} 

子類

public class loginFeature extends TestBase{ 


@Test (priority=1) 
public void attemptToResetDataBase(){ 

dbReset(); 
} 


@Test (priority=2, dependsOnMeth0ds="attemptToResetDataBase") 
public void clearCacheTest(){ 

clearCache(); 
} 


@Test (priority=3, dependsOnMeth0ds="clearCacheTest") 
public void verifySuccessfulLogin(){ 

login(); 
} 



} 

因此,您將所有測試方法都包含在名爲TestBase的父類中。然後你用一個擴展了TestBase的類創建你的測試(例如loginTest)。現在你可以多次調用你的方法,每次將它們作爲一個單獨的測試對待,並根據你的需要將它們與依賴關聯起來(也就是說,我根據先前的方法將它們中的每一個連接起來;但是你可以重新排列它們並將它們全部放到取決於一個,還是沒有人)。

因爲您的測試類從TestBase繼承,您甚至不需要創建一個對象來訪問內部方法;你可以直接打電話給他們。

希望這可以爲你解決,如果你需要更多的信息,請不要猶豫,寫評論。

+0

不幸的是,這不是我想要實現的。我提到的這些測試已經構建爲@Test方法。我希望從其他測試和其他類中多次調用這些方法。現在,當一些測試依賴於clearCacheTest時,它會被調用一次,如果另一個測試也依賴於clearCacheTest,它將不會再被調用,因爲它已經通過了...但我不僅希望它通過,而且實際上做了在這兩個測試之前清除緩存兩次。 –

+0

好的喬恩得到你,將更新我的答案,以反映你的更新。我仍然認爲它是可以實現的,但:) :) –

+1

幾乎在那裏;)我已經試過這種方法在一開始,它甚至工作,但很快我意識到,它給了我虛假的測試報告。你看,dbReset這種方式沒有被定義爲一個測試,所以當我運行我的測試編號1即loginFeatureTest:(openURLTest-> dbResetTest-> clearCacheTest-> loginTest)和dbReset失敗,出於某種原因,我會得到報告,就好像整個loginFeatureTest失敗,我希望看到它實際上是dbResetTest錯誤。也許唯一的選擇是從loginFeatureTest中調用dbReset並用消息聲明它的結果? –