背景ストーリー
私はソフトウェア会社で、複雑に絡み合った古いシステムを置き換えるテスト自動化フレームワークを開発しています。
私たちのシステムでは、ほとんどすべての操作でログインが必要になるため、@BeforeMethod、@DataProvider、および @Factory を使用してテストをセットアップするのが最善であると判断しました。ただし、いくつかの問題に遭遇しました。
サンプル テスト ケース
ソフトウェア システムが野球チームの名簿であるとしましょう。ユーザーが名前でチームメンバーを検索できることを確認するためにテストしたいと思います。
(注: 私は、BeforeMethods が特定の順序で実行されないことを認識しています。今のところ、それが処理されていると仮定してください。)
@BeforeMethod
public void setupSelenium() {
// login with username & password
// acknowledge announcements
// navigate to search page
}
@Test(dataProvider="players")
public void testSearch(String playerName, String searchTerm) {
// search for "searchTerm"
// browse through results
// pass if we find playerName
// fail (Didn't find the player)
}
このテスト ケースでは、次のことを前提としています。
- ユーザーはすでにログオンしています (おそらく BeforeMethod で)
- ユーザーはすでに検索ページに移動しています (簡単、メソッドの前)
- テストのパラメータは、前述のログインに関連付けられています
問題点
それでは、テスト ケースのパラメーターを処理する方法を試してみましょう。
アイデア#1
この方法により、データプロバイダーをユーザー名に関連付けることができ、特定のテスト ケースに複数のユーザーを使用できます。
@Test(dataProvider="players")
public void testSearch(String user, String pass, String name, String search) {
// login with user/pass
// acknowledge announcements
// navigate to search page
// ...
}
...しかし、すべての関数が 2 つの追加パラメーターを受け入れるようにする必要があるため、多くの繰り返しがあります。言うまでもなく、実際にはテストしたくない通知アナウンス機能もテストしています。
アイデア#2
それでは、ファクトリを使用して適切に初期化しましょう!
class BaseTestCase {
public BaseTestCase(String user, String password, Object[][] data);
}
class SomeTest {
@Factory
public void ...
}
これにより、テスト ケースごとに 1 つのファクトリを作成する必要が生じます...ただし、テスト ケースごとに複数のユーザーを使用できます。
結論
私はアイデアから新鮮です。XML ファイルからデータをロードし、プログラムからメソッドを呼び出すという別のアイデアがありましたが、それはばかげています。
何か案は?