2

Selenium + TestNG を使用してテスト ケースを実行しています。私のテストケースは複数のクラスに分散しています。すべてのクラスで webDriver の同じコピーを使用したい。(毎回ログインしてから他の操作を行いたくないので、クラスごとに個別のブラウザーを呼び出すオプションはなくなりました)。この問題を解決するために、現在、静的 webdriver オブジェクトで継承を使用しています。しかし、並列モードでセレングリッドを使用している間は、同じオブジェクトを使用するため機能しません。複数のクラスでオブジェクトを共有する方法、または「テスト」ごとに異なる静的インスタンスを作成する方法を教えてください(テストごとに個別のJavaプログラムを実行しています)。

4

4 に答える 4

2

これが私がソリューションを実装した方法です。

オブジェクト myObj があり、その中に webDriver オブジェクトがあり、さらにいくつかのものがあります。静的オブジェクト myObj の静的配列を作成しました。こんな感じです

// WebDriver が実装されているクラスの一部。WebDriver は静的ではありません。

private static MyClass[] ObjectArr = new MyClass[100];

public static MyClass getInstance(Integer id){
    id = (id==null)? 0 : id;
    if(ObjectArr[id] == null){
        ObjectArr[id] = new MyClass();
    }  
    return ObjectArr[id];
}

今、これをテストクラスで使用したいときは、このようにします。

public class x{
MyClass i;

@BeforeClass
@Parameters("instanceId")
public void getInstance(@Optional String instanceId){
    i = MyClass.getInstance(Integer.parseInt(instanceId));
}
}

これが私のtestng.xmlのようです。

<test name="FireFox" preserve-order="true">
    <parameter name="instanceId" value="1" />
    <parameter name="browser" value="firefox" />
    <classes>
        <class name="com.app.Login"/>
    </classes>
</test> 

<test name="Chrome" preserve-order="true">
    <parameter name="instanceId" value="2" />
    <parameter name="browser" value="chrome" />
    <classes>
        <class name="com.app.Login"/>
    </classes>
</test> 

これは、セレングリッドに対して並列かつ通常の方法で完全に機能します。

于 2015-07-22T09:09:50.883 に答える
0

同様の問題に遭遇しました。これが私がしたことです。

仮定: クラス B のテストがクラス A のインスタンスに依存しているとします。

@AfterClass(alwaysRun = true)
public void insertValueIntoAttribute(ITestContext ctx) {
    ctx.setAttribute("INSTANCE_OF_A", this); // from inside class A tests
}

そして、クラス B で、この A のインスタンスを取得して使用します。

@BeforeClass(alwaysRun=true)
@SuppressWarnings("unchecked")
public void fetchData(ITestContext ctx) {
    A a = (A) ctx.getAttribute("INSTANCE_OF_A");
}

これが誰かに役立つことを願っています。

于 2016-12-13T16:57:28.297 に答える