7

TestNG と Selenium WebDriver を使用して Web アプリケーションのテスト スイートを作成しています。

私が必要とするのは、異なる認証済みユーザーに対してテストクラスのすべてのメソッドを複数回実行することです (データは実行時に DB から引き出されます)。したがって、すべてのユーザーの資格情報を提供するデータプロバイダーを使用してクラスにデータを渡す必要があります。次に、各ユーザーに対して (実験の純度のために) Web ドライバーを作成し、@BeforeClassメソッドで提供された資格情報で認証し、すべてを実行する必要があります。@Testクラスのメソッドを呼び出して、 @AfterClassWeb ドライバーを閉じるティア ダウンを作成します。

どうやってやるの?

これを行う私の試みはここにあります: https://gist.github.com/4246674

Attempt1 は@Test(dataProvider="getUsersIdAndName")on クラスを配置することでした。クラスで判明したよう@Test(dataProvider=)に、クラスのすべてのメソッドを提供されたデータで呼び出す必要があるわけではないため、機能しません。その結果、引数に渡すデータがないため、メソッドはまったく呼び出されませんでした。そして、このメソッドが実行時間 0 秒で渡されたとマークされている奇妙なテスト レポートを取得します。(これが理にかなっていれば、これは NetBeans で開かれた Maven プロジェクトです。)

@Test(dataProvider=)クラスに何か意味がありますか?

@Test試行 2 は、メソッドの注釈にdataProvider を追加することでした。これは、1 つのクラスの実行中にテスト メソッドが 2 回呼び出されることを意味するため、機能しません。その結果、Web ドライバーが再初期化されていない間にテストを繰り返そうとしたため、2 回目に失敗しました。ブラウザーは既に別のページをレンダリングしています。

@BeforeClassまた、データプロバイダーからデータを提供する方法がわからないため、ログイン自体がメソッドではなくテストメソッドで行われるという1回目と2回目の試行の欠点があります。

Attempt3 は、単一の方法を組み合わせるという必死の試みでし@BeforeClass@Test。注釈付きメソッドにパラメーターリストがあるかどうかも@BeforeClass要求されるため、機能しません。@Parametersその結果、このメソッドは 3 回呼び出されます。1 回目はクラス セットアップとして上記の理由で失敗し、2 回目はデータ プロバイダーが原因で成功します。

次に、TestNG がすべてのクラス メソッドを異なるデータで複数回呼び出す方法を提供していないことがわかりました: http://comments.gmane.org/gmane.comp.java.testng.user/864

同じ効果をアーカイブする方法について、他に 2 つのアイデアがあります。

アイデア 4 は、@Test(dataProvider=)各テスト メソッドに を配置することです。各メソッドは、認証とisAuthenticated()テストを単独で実行してから、独自のテストを実行します。効果がなく醜い。

最も手頃な方法のように見える Idea5 は、@Test他のすべてのテスト方法を集約する唯一の方法でマークすることです。データ プロバイダーからデータを受け取り、指定されたユーザーによる認証を実行し、次に isAuthenticated テストとその他すべての必要なテストを実行します。この場合@BeforeClass、 と@AfterClassは Web ドライバーのセットアップと破棄のみを行っています。このアプローチには、私が使用する能力を失っているという欠点が@BeforeMethodあります@AfterMethodが、これは私にとって手頃な価格です: 私はそれらを必要としないようです.

同じ効果をアーカイブするより良い方法はありますか?

長文すみません。

前もって感謝します。

4

2 に答える 2

8

必要に応じて Factory を探索してみてください。Factory を使用すると、異なるデータを持つクラスの @Test で注釈が付けられたすべてのメソッドを実行できます。その場合、ur beforeclass で ur webdriver を初期化できます。ここで説明します。

于 2012-12-10T09:19:09.973 に答える
2

わかりました、testNG と webdriver での私の経験に基づいて、あなたの質問に答えてみましょう。

Q. クラスの @Test(dataProvider=) は何か意味がありますか?
A. いいえ。dataProvider はメソッド レベルのアノテーションであり、クラス レベルではありません。ここで述べたように。Object[][] 形式で Test メソッドのデータを提供するメソッドである必要があります。

Q. あなたが言及したシナリオを達成するにはどうすればよいですか? (私があなたのシナリオを理解していると仮定します..)
A. Webdriver オブジェクトをインスタンス化するには、@BeforeClass ではなく @BeforeMethod を使用する必要があります。このようにして、メソッドごとに異なる WD オブジェクトを作成できます。また、dataProvider は複数のデータを isAuthenticated() メソッドに渡すことができます。クラス レベルで構成ファイルを渡したい場合は、 @BeforeClass にプロパティ ファイル ロード ロジックのみを含めることができます。そのため、そのプロパティ ファイルはクラス全体に対して 1 回読み込まれます。明らかに、@AfterMethod を使用して webdriver オブジェクトを閉じる必要もあります。

于 2012-12-09T22:44:40.283 に答える