2011-12-08 8 views
5

私はテストの自動化の現場では新しく、これは愚かな問題だと私を許しますが、Googleは今回私に失敗しました。あるいは、私が読んだことの少なくとも何かが私をさらに混乱させました。JUnit 4にtestNGの@BeforeSuiteと同等の機能がありますか?

Eclipse内でJUnit 4とSelenium Webdriverを使用しています。私はスイートとして、そして個別に実行するために必要ないくつかのテストをしています。現時点では、これらのテストは単独で実行すると正常に動作します。テストの開始時に、入力するボックスがテスター/ユーザーに提示され、最初にどのサーバーをテストするか(これはURLの一部となる文字列変数です)と、テストするブラウザーを求めます。スイート内でテストを実行している瞬間、各テストの初めにユーザーにこれを尋ねられます。なぜなら、これはそれぞれの@Beforeメソッドにコード化されているからです。

これらの値を一度取り込んで各テストメソッドに渡すにはどうすればよいですか?

したがって、server = "server1"とbrowser = "firefox"の場合、firefoxはセレンが使用するブラウザであり、開こうとするURLは次のすべてのテスト方法についてhttp://server1.blah.com/です。テストメソッドごとに必要なURLが若干異なるため、私が別々の@メソッドを使用してきた理由があります。つまり、各メソッドは、server1.blah.com/somethingやserver1.blah.com/somethingElseなどの別のページをテストします

テストは正常に実行されます。テストの数メソッドは最終的に静かに大きくなります。

testNGでこれを行う簡単な方法があれば、私のテストをtestNGに変換することもできます。 @BeforeSuiteアノテーションは機能するかもしれないと思ったが、今はわからない。

任意の提案や批判(建設一種)がずっと

答えて

0

を高く評価しているテストスイートは、同じ@Beforeメソッドのコードを持つようにそれはグループテストに意味をなさない可能性があるので、あなたは、それぞれ別々のためのテストスイートを持っています。

別のオプションとして、テストごとに同じベースURLを使用することもできますが、セレンをクリックしてテストを実行する場所に移動することで、特定のページに移動できます。

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をよく見てください。また、Before and Afterの動作を希望する場合は、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

Matthewに感謝します。私はあなたに何かひどいnoob質問をしなければならないでしょう:(最初にthis(builder, klass, getAnnotatedClasses(klass));行はgetAnnotatedClasses(クラス)が表示されないので動作しません。 ...私は私の頭の上に少しあるかもしれないことを実感し、私はあなたの忍耐のためにとても感謝しています:) – user1088166

+0

あなたはあなたの質問で '入力ボックスがユーザーに提示されました'これはgetUrlFromUserそれは本当に問題なのですが、MySuiteではおそらく良い場所になるでしょう。これはJUnitのどのバージョンを使っているのですか? –

+0

さて、私はあなたに今追いかけています。私はJUnit 4を使用しています。これは関係ないかもしれませんが、最初にセレンIDEを使用してテストケースを作成し、EclipseでJUnit 4(WebDriver)テストケースとしてエクスポートしてテストケースをエクスポートしました。 – 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を使用していない場合はもちろん、これは役に立ちません。

関連する問題