0

私のプロジェクトには、別々の方法で順番に実行したいテストのペアがあります。通常、DataProvider を使用してテスト用の入力を生成します。

@DataProvider
public Object[][] getUsers() {
    // generate input for test2();
}

@Test(dataProvider = "getUsers")
public void test2(User user) {
    assertSomething(user);
}

しかし、ここでは、データ プロバイダーに属さないテスト ロジックがあるため、これらのメソッドの両方がテストのように動作する必要があります。

だから私はこのようなものが欲しい:

@Test
public Object test1() {
    User user = createUser();
    assertSomething(user);

    return user.getProperty();
}

@Test // depends on test1 - I do not want to execute this test if test1 fails.
public void test2(Object userProperty) {
    assertSomethingElse(userProperty);
}

実際、test1 から test2 にロジックを配置して目的を達成することはできますが、それを行うためのよりインテリジェントな方法があるかどうか疑問に思いました。

4

3 に答える 3

0

あなたが求めているのは、TestNGが特定のサポートを持っていないステートフルなテストクラスです(たとえば、あるテストから別のテストにデータを渡すなど)。そのため、物事の状態を自分で追跡する必要があります。

並列処理について心配していない場合は、クラス メンバー フィールドが正常に機能します。

private User user;

@Test
public void test1() {
    user = createUser();
    assertSomething(user);
}

@Test(dependsOnMethods = "test1")
public void test2() {
    assertSomethingElse(user.getProperty());
}

テストクラスの複数のインスタンスを並行して実行できるようにしたい場合は、次のようなものを使用する必要がありますThreadLocal<T>

private static final ThreadLocal<User> USERS = new InheritableThreadLocal<>();

@Test
public void test1() {
    USERS.set(createUser());
    assertSomething(user);
}

@Test(dependsOnMethods = "test1")
public void test2() {
    assertSomethingElse(USERS.get().getProperty());
}
于 2016-02-26T14:46:49.673 に答える
0

これは、他のスイートを並行して実行するかどうかに関係なく機能するソリューションです。dependsOnMethods パラメーターは、テスト 1 がパスした後に test2 が実行されるようにします。アイデアは、ファクトリを実装することです。

テスト メソッドは次のようになります。

@Test
public void test1(ITestContext context) {
    User objUser = Factory.getUser(context.getName());
    assertSomething(objUser);
}

@Test(dependsOnMethods = "test1")
public void test2(ITestContext context) {    assertSomethingElse(Factory.getUser(context.getName()).getProperty());
}

ファクトリ クラスは次のようになります。

public class Factory
{
static Map<testName,User> mainMap;

//This method returns User object to a test based on the test name.
public static User getUser(String testName)
{
if (mainMap == null)
{
    mainMap = new HashTable<testName,User>();
    mainMap.put(testName,new User());
}
if(!mainMap.contains(testName))
{
    mainMap.put(testName,new User());
}

return mainMap.get(testName);
}
}

factory を使用してメソッド /threads 間でオブジェクトを共有する背後にある理論の詳細については、次を参照して ください。

于 2016-02-27T11:13:47.777 に答える