2016-08-01 8 views
0

私は多くのクラスを持つコードを持っています。
ドライバを作成するクラスがあります -assertTrueの後にJava Seleniumを閉じるブラウザ

public class DriverDelegate { 

    private String baseURL = "someLink"; 
    private WebDriver driver; 
    private WebDriverWait wait; 

    DriverDelegate(String url) { 
     System.setProperty("webdriver.chrome.driver", "${directory}"); 
     driver = new ChromeDriver(); 
     driver.get(baseURL + url); 
     driver.manage().window().maximize(); 
     driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 
     wait = new WebDriverWait(driver, 5); 
    } 

    public WebDriver getDriver() { 
     return driver; 
    } 

は、私はすべてのテストのための新しいドライバを作成します。

public class Startup{ 
    @Test 
    public void HeaderClicker() throws Exception{ UserInterfaceTests UI = new UserInterfaceTests(); UI.headerClicker();} 

ここでの私の質問はいるassertTrue後にブラウザを閉じる方法である - そして、私の株のほとんどは、今私は、スタートアップと呼ばれるクラスからの私のテストを起動this-

public class UserInterfaceTests extends BaseTest{ 


    @Test 
    public void headerClicker() throws java.lang.Exception { 

     //Startup 
     DriverDelegate driverDelegate = new DriverDelegate("url"); 
     WebDriver driver = driverDelegate.getDriver(); 

     //Some random assertTrue 
     assertTrue("Test(HeaderClicker) - NoSuchElementException click", TestHelper.headerClicker(schedule, driver)); 

     //I hope that it is not neccessary to put up all helper classes like TestHelper or BaseTest 

のようにいるassertTrueを含むものであり失敗する。 @AfterTest、@AfterSuiteなどのようなものは、他のメソッドがテストで使用されたものと同じドライバを使用できないため動作しません。
アイデアをお探しですか?

+0

どのようなテストフレームワークを使用しますか? testNG? '@test'で '@test'を使うのは、とても悪いことです。 –

+0

現時点では私はtestNGを使用しています。あなたがそれが悪い習慣であると言うなら、それの代わりに何を使うべきですか?それはなぜ悪いのですか? – Syord

+0

明確で素敵なコードが必要な場合は、testNG用のXML設定ファイルを使用する必要があります。https://github.com/SeleniumHQ/selenium/wiki/LoadableComponent もお勧めです。次に、デザインパターンについて読んでください。 '@Test'はできるだけ短い必要があります。 –

答えて

0

ここで触れたいことがいくつかあります。最初に、@shutdown -hはコメントに正しいです。プログラムでテストクラスを作成して、@Testメソッドを自分で実行するべきではありません。テスト実行フレームワークがそれを処理するようにします(TestNG、JUnitなど)。

あなたの実際の質問のポイントには、実際のテスト方法の前後に発生する動作を処理するための事前テストと事後テストの方法が必要です。これらが機能するには、テストフレームワークでテストの実行を処理させる必要があります。 @AfterTest@AfterSuiteは、(完全に)指定した理由ではありませんが、ユースケースには正しくないと述べました。スイートに指定された<test>ノード内のすべてのクラスのすべてのテストメソッドの後にTestNGのみの@AfterTestが1回実行されます。 @AfterSuiteは、スイート全体のすべてのテストメソッドの後に1回だけ実行されます。あなたが探しているのは@AfterMethod注釈です。

例:上記のコードで

public class FooTest { 

    private DriverDelegate driver; 

    @BeforeMethod 
    public void setup() { 
     try { 
      driver = new DriverDelegate("url"); 
     } catch (Exception ignore) { } 
    } 

    @AfterMethod 
    public void tearDown() { 
     try { 
      driver.quit(); 
     } catch (Exception ignore) { } 
     driver = null; 
    } 

    @Test 
    public void foo() { 
     // do test stuff 
    } 
} 

、TestNGのは、このテスト・クラスを実行するとき、このクラスで@Testで注釈各方法は、ドライバを閉じ、ドライバと@AfterMethodを初期化し、対応する@BeforeMethod実行を持っていますテストが失敗してもTestNGでこのタイプのセットアップを行うためのポイントのカップル:

(1)TestNGはテストクラスのインスタンスを個別に作成しないため、クラスオブジェクトに状態を保存すると、テストメソッド自体を並列で実行することはできません新しいドライバを作成して同じ変数に保存しようとする複数のメソッドがあり、実行中の他のテストの状態が破損するため、クラスを作成する必要があります。 は、クラスごとに並列モードで実行できます(たとえば、それぞれ5つのスレッドを持ち、それぞれ同時に別々のテストクラスを実行しています)。

(2)@BeforeMethodとのボディをtry-catchブロックで囲んだのはなぜですか? TestNGは設定メソッドの例外を素早く失敗させるため、まだ実行されていない他のテストがスキップされる可能性があるため、失敗する可能性のあるコードに対処する必要があります。 Webドライバの作成と終了をラッピングすることで、エラーを無視して他のテストの実行を継続できます。たとえば、ドライバが作成されない場合、driver変数はnullになり、@Testメソッドは失敗しますが、他のメソッドは成功する可能性があります。理想的には、なぜドライバが作成されなかったのかを調べることができるように、例外のログを記録するのが理想的です。

また、多くのテストクラスでドライバを使用する必要がある場合、各メソッドの後にドライバを作成し、テストクラスを拡張する基本クラスを作成できます。メソッドが@Testであるクラスがある場合、そのクラスのすべての@BeforeMethodメソッドが実行され、すべてのスーパークラスも実行されます。クラス間でメソッドの順序が保証されています(同じクラスに複数の@BeforeMethodメソッドがある場合はそうではありません)。上記で

public abstract class A { 
    @BeforeMethod 
    public void setupA() { } 
} 

public class B extends A { 
    @BeforeMethod 
    public void setupB() { } 

    @Test 
    public void foo() { } 
} 

fooが実行されるとき、それは最初setupAを実行し、setupBています。メソッドは同じ方法で動作しますが、逆の順序で動作します。

関連する問題