3

TestNG で Selenium を使用して Web サイトをテストしています。Selenium IDE を使用してテストを作成し、各テストをクラスのメソッドとして TestNG にエクスポートしました。例えば、

ログイン テストには、testLogin()、testLogin2() などのメソッドを持つ Login クラスがあります。サインアップ テストには、testSignup()、testSignup2() などのメソッドを持つ Signup クラスがあります。

Ant を使用してテストを実行していますが、各クラスがブラウザーを開いてからそのメソッドを実行することを除いて、正常に動作します。たとえば、5 つのクラスがある場合、5 つのブラウザーが同時に開いてテストを実行します。

私が望むのは、Ant/Selenium/TestNG で 1 つのブラウザーを開くだけで、testng.xml で指定したすべてのクラスですべてのテストを (同じブラウザーで) 実行することです。上記の例を使用して、1 つのブラウザーを開いて、testLogin()、testLogin2()、testSignup()、testSignup2() を実行します。これが達成できない場合は、ブラウザーを開いてクラス内のすべてのテストを実行し、ブラウザーを閉じてから別のブラウザーを開いて、次のクラスで一連のテスト メソッドを実行します。

どんな助けでも感謝します。前もって感謝します。

4

3 に答える 3

2

今日、私は自分に合った答えを見つけました。すべてのコード サンプルを収集するため、数分お待ちください :)

初期化.java

//base class that will be called before all tests
@Test(groups = "init")
public class Init{

    DefaultSelenium browser;

    public void start(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        browser.open("url");
        browser.click("xpath");
    }

}

TemplateForClasses.java

/* - all public methods will be tests
 * - all tests will be called after group init
 * - just before suite will start we will start 1 browser instance
 */
@Test(dependsOnGroup="init")
public class TemplateForClasses{

    DefaultSelenium browser;

    @BeforeSuite
    public void startBrowser(ITestContext itc){
        browser = new DefaultSelenium(host,port,browser_type,url);
        itc.setAttribute("browser",browser);
        browser.start();
    }

    @AfterSuite
    public void stopBrowser(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        browser.stop();
    }

    //any other: @Before, @After methods

}

FirstGroupOfTests.java

//all tests classes will inherit preferences set in TemplateForClasses
public class FirstGroupOfTests extends TemplateForClasses{

    public void FirstTest(ITestContext itc){
        browser = (DefaultSelenium) itc.getAttribute("browser");
        //browser.click("start");
    }

}

考え:

  • ブラウザを一度だけ起動してテストする
  • 他のすべてのテストの前に実行される (isBrowserRunning)
  • 単一のテストからブラウザを参照

このコードはテスト済みですが、現在は頭のてっぺんから取ったので、明日編集してより正確にすることができます。

更新: この結果は、testng.org のドキュメント + stackoverflow で私が尋ねたいくつかの質問 + いくつかのフォーラム/グループで見つかったいくつかの回答に基づいています。

プログラムでtestngを実行していて、オンザフライでxmlを生成していることを追加する必要があります(documentation.orgで行われているように)。私はそれをすべて1つのパッケージで使用しています。パッケージをxmlに追加し、InitクラスとTemplateForClassesから継承したクラスのみを含めました。そのxmlが必要な場合はお知らせください。

于 2009-09-01T18:55:11.713 に答える
0

私もかなり長い間同じ問題に悩まされていました。可能な限り簡単な言葉で説明します。次の例を考えてみましょう。

Class A (contains the code selenium.start();)
|
|(inherited classes)
|--------class B   }
|--------class C   }  Have some @Test methods
|--------class D   }

これらのテストメソッドを実行するたびに、親クラスのコンストラクターであるselenium.start()のコードが実行されます。それは、複数のブラウザがすべて画面上で開くときです。

これで、テストメソッドが1つずつ実行されます。クラスBのテストが実行されたとすると、クラスCの場合は、別のウィンドウで実行されます。

したがって、基本的には、親コンストラクターからstart()コードを削除し、それをクラスB、C、およびDのどこかに配置するだけです。

1つのセレンオブジェクトで作業を続ける限り、すべてが1つのブラウザウィンドウで行われます。start();を置くと そのブラウザが開き(開いていなかった場合)、新しいセッションが作成されます。止まる(); そして、セッションは終了します。

制御の流れは次のようになります=>

Class A, Class B
Class A, Class C
Class A, Class D

したがって、上記の実行シーケンス全体で1つのstart()と1つのstop()だけで同じセレンオブジェクトを使用し続ける方法を理解できれば、テストの実行は1つのブラウザーウィンドウでのみ行われます。

start()コードをクラスAに配置し、停止コードをB、C、およびDのそれぞれに配置すると、3つのウィンドウが開き、実行が進むにつれて1つずつ閉じます。

start()コードとstop()コードを個別にB、C、およびDに配置すると、1つのブラウザーが開き、テストケースを実行し、閉じることがわかります。次に、別のユーザーがCのテストケースを開いたり、実行したり、閉じたりします。

お役に立てれば。:-)

于 2009-09-04T09:25:14.310 に答える
0

これは、Spring の依存性注入で行いました。そして、初期化コードは工場にあります。テスト間だけでなく、ヘルパー クラス間でも Selenium インスタンスを共有する方法が必要でした。テストで selenium.someMethod() が直接呼び出されることはめったにありません。helper.goToSomePage() や PreferencesPage.changePassword(....) に似ています。

テスト間で Selenium インスタンスを共有することは悪い考えと見なされる可能性がありますが、それによってもたらされたいくつかのバグを見つけるのはそれほど難しくありませんでした。テストは順次実行され、Selenium オブジェクトはスレッドセーフである必要はありません。ただし、オブジェクトの状態は一貫性を保つ必要があります。

参考までに、Spring は Java フレームワークであり、依存性注入はその一部にすぎません。もちろん、代わりに Guice などの他の DI フレームワークを使用することもできます。

于 2010-08-25T08:51:51.570 に答える