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