2017-02-05 16 views
0

私は成功しなかった多くの方法を試してきましたが、これはTestNGで達成できないと信じ始めています。私はあなたと確認したいと思います。TestNG - 順不同のシナリオでテストを実行しますか?

私はテストしているので、いくつかの基本的なシナリオを実行する必要があります。



私の現在の試験方法、@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からテストを行った場合clearCacheTestは、この特定のシナリオでは、他に依存しないので、私は、シナリオ3を実行することはできません、です。私はxmlを介して順番にそれらのテストを実行しようとしたが、依存関係を使用して成功しませんでした。もちろん

私はclearCacheTestは、報告書はactionYTestは私が回避しようとするものである失敗だったことが表示されます失敗した場合actionYTestが直接が、その後clearCacheTestを呼び出すために作ることができます。

私は私はあなたが少しあなたの戦術を変更すべきだと思う

答えて

0

...私はTestNGのでは達成できないですが、多分私が間違って必要なものを今かなり確信しています。これらの〜(dbResetTestなど)をテストクラスとして認識するのではなく、代わりにテストメソッドを作成し、dependsOnGroupsの代わりにプログラムで(XMLではなく)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など)を作成します。今度は、あなたのメソッドを複数回呼び出すことができ、毎回個々のテストとして扱い、必要に応じて依存関係を結びつけることができます(つまり、それぞれのメソッドは以前のメソッドに依存しますが、それらを並べ替えて1つに依存する、または1つに依存する)。

あなたのテストクラスはTestBaseを継承しているので、内部メソッドにアクセスするためのオブジェクトを作成する必要はありません。代わりにそれらを直接呼び出すことができます。

これはあなたのためにそれを解決することを望んで、あなたが多くの情報を必要とする場合は、コメントを書くことを躊躇しないでください。

+0

残念ながら、これは私が達成しようとしていたものではありません。これらのテストは既に@Testメソッドとして構築されています。私はそれらのメソッドを他のテストや他のクラスから何回も呼びたいと思っています。今のところ、いくつかのテストがclearCacheTestに依存する場合、それは一度呼び出され、別のテストもまたclearCacheTestに依存する場合、それはすでに渡されているのでもう呼び出されません...しかし、私はそれを渡したいだけでなく、これらの2つのテストの前にキャッシュを2回クリアします。 –

+0

オクジョンは、あなたの更新を反映するために私の答えを更新します。私はまだそれが達成可能だと思う:) –

+1

ほぼそこに;)私は非常に最初にそのアプローチを試して、それも働いたが、すぐに私はそれが私に偽のテストレポートを与えていたことに気づいた。このようにdbResetはテストとして定義されていないので、テスト番号1を実行すると、つまり、loginFeatureTest:(openURLTest - > dbResetTest - > clearCacheTest - > loginTest)、dbResetは何らかの理由で失敗します。 loginFeatureTestが失敗し、実際にはdbResetTestのエラーであることを確認したいと思います。多分、唯一のオプションは、loginFeatureTestの中からdbResetを呼び出して、その結果にメッセージがあると主張することです。 –

関連する問題