4

現在、 Selenium 2(Webdriver)とTestNGを使用して新しいテストスイートを作成しています。私たちのテストではページオブジェクトパターンを使用しており、これまでの状況に非常に満足しています。ただし、テストで設計上の問題が発生し、そのための適切な解決策を見つけることができないようです。例を挙げましょう。LoginTestCaseは次のとおりです。

public class LoginTestCase extends MyTestCase {
    @BeforeTest
    public void login() {
        HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
        LoginPage loginPage = homepage.login();
        DashboardPage dashboardPage = loginPage.loginUser("username", "password");
    }   
}

このテストからユーザーがログインする必要があるテストを拡張したいと思います。理想的には、次のようなものを書くことができます。

public class DashboardTestCase extends LoginTestCase {
    @Test
    public void testDashboard(DashboardPage dashboardPage) { 
        ...
    }
}

この時点で、ユーザーはにいます。DashboardPage必要なのは、で作成されたそのページのオブジェクトだけですLoginTestCase

明らかな解決策は、そのオブジェクトを(の)変数に格納することです。この変数はLoginTestCase、子テストケースからアクセスされます。ただし、これは非常に見苦しく、その変数の誤用につながる可能性があります。

この設計の問題に対処するこのパターンまたはいくつかのパターンに対するより良い解決策はありますか?

4

3 に答える 3

3

この問題を解決するために、依存性注入と Guice-berry による Guice を使用しました。ページ オブジェクトはテスト メソッドに挿入され、WebDriver はページ オブジェクトに挿入されました。

トレードオフとして、ページ オブジェクト間のこの素敵なチェーンをすべて使用していませんでした。

ただし、静的状態とシングルトンは、並列テストの実行に関しては厄介な問題であるため、避ける必要があります。

于 2011-12-22T22:09:55.817 に答える
1

私はまだより良い解決策を見つけていません。すべてのテストケースが WebDriver にアクセスできる場所から、静的クラスにシングルトン WebDriver があります。ログイン/セッションのために、テストクラスはすべて同じ WebDriver で実行する必要があります。

于 2011-12-05T10:25:02.020 に答える
0

ページ オブジェクトへの参照を LoginTestCase クラスのプライベート変数に格納し、保護されたゲッターを提供して、子テストがページ オブジェクトにアクセスできるようにする必要があると思います。これは、2 つのことを達成するのに役立ちます

  1. LoginTestCase で変数をカプセル化して、誰もそれを台無しにできないようにします..
  2. 保護された getter を提供することで、子テスト ケースのみがそれにアクセスできるようになります。それは問題ではありません。

変更後のコードは次のようになります。それが理にかなっていることを願っています:

public class LoginTestCase extends MyTestCase {

    private dashboardPage;

    @BeforeTest
    public void login() {
        HomePage homepage = PageFactory.initElements(getDriver(), HomePage.class);
        LoginPage loginPage = homepage.login();
        dashboardPage = loginPage.loginUser("username", "password");
    }

    protected void getDashBoardPage() {
        return dashboardPage;  
    }

}

public class DashboardTestCase extends LoginTestCase {
    @Test
    public void testDashboard() { 
            DashboardPage dashboardPage = getDashBoardPage();
        ...
    }
}
于 2013-04-02T14:34:42.880 に答える