web-dev-qa-db-ja.com

TestNG-ソフトアサート

@Testいくつかのsoft asserts

しかし、assertAllの配置で問題が発生しています。すべてのURLsassertAllの前に通過させたい。これは可能ですか、それとも別の推奨されるアプローチですか?

@Test
public static void checkUrl(String requestUrl, String expectedUrl){

    SoftAssert softAssert = new SoftAssert ();

    try {

        URL obj = new URL(requestUrl);
        HttpURLConnection conn = (HttpURLConnection) obj.openConnection();
        conn.setReadTimeout(5000);
        conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
        conn.addRequestProperty("User-Agent", "Mozilla");
        conn.addRequestProperty("Referer", "google.com");
        System.out.println();
        System.out.println("Request URL ... " + requestUrl);


        boolean redirect = false;

        // normally, 3xx is redirect
        int status = conn.getResponseCode();
        if (status != HttpURLConnection.HTTP_OK) {
            if (status == HttpURLConnection.HTTP_MOVED_TEMP
                    || status == HttpURLConnection.HTTP_MOVED_PERM
                    || status == HttpURLConnection.HTTP_SEE_OTHER) redirect = true;
        }

        System.out.println("Response Code ... " + status);
        if (redirect) {

            // get redirect url from "location" header field
            String redirectUrl = conn.getHeaderField("Location");

            // get the cookie if need, for login
            String cookies = conn.getHeaderField("Set-Cookie");

            // open the new connnection again
            conn = (HttpURLConnection) new URL(redirectUrl).openConnection();
            conn.setRequestProperty("Cookie", cookies);
            conn.addRequestProperty("Accept-Language", "en-US,en;q=0.8");
            conn.addRequestProperty("User-Agent", "Mozilla");
            conn.addRequestProperty("Referer", "google.com");

            System.out.println("Redirect to URL : " + redirectUrl);
            //Assert.assertEquals (redirectUrl, expectedUrl);
            softAssert.assertEquals (redirectUrl, expectedUrl, "Expected URL does not match"
                    + requestUrl);
        } else {
            //org.testng.Assert.assertTrue (redirect);
            softAssert.assertTrue (redirect, "Please check the status for " + requestUrl);
             System.out.println("** Please check status for " + requestUrl);
             System.out.println("************************************************");
             System.out.println("************************************************");
        }


    }
    catch (Exception e) {
        e.printStackTrace();
    }

}
5
TheAutomator

あなたが探しているユースケースは、SoftAssertの目的に反しています。 SoftAssertは基本的にTestNGで導入されたため、1つの_@Test_メソッド全体ですべてのアサーションを収集できますが、テストメソッドは最後にのみ失敗します(assertAll()を呼び出したとき) 。

データ駆動型_@Test_メソッドは、基本的に_@Test_メソッドであり、"n"回実行されます(各反復は異なるデータセットで実行されます)。したがって、SoftAssertを試して活用し、最後の反復でassertAll()を呼び出すことは意味がありません。それを行うと、基本的には最後の反復が失敗するまで煮詰められます。

したがって、_testng-failed.xml_を使用してテストを再実行している場合は、最後の反復のインデックスのみが含まれます(実際に失敗したのは最後の反復ではなかったため、これは不合理です)。

したがって、理想的には、SoftAssertは1回の反復の範囲内でのみ使用する必要があります。つまり、SoftAssertオブジェクトを_@Test_メソッド内でインスタンス化し、一連のassertXXX()呼び出しを呼び出し、メソッドの最後にassertAll()を呼び出します。

これですべて完了です。これを行う方法を示すサンプルをまだ探している場合は、ここにサンプルがあります。

最初に、テストクラスの属性としてデータプロバイダーが提供するデータセットのサイズを設定できるインターフェイスを定義します。

_public interface IDataSet {
    void setSize(int size);
}
_

テストクラスは以下のようになります

_import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import org.testng.annotations.TestInstance;
import org.testng.asserts.SoftAssert;

import Java.util.concurrent.atomic.AtomicInteger;

public class SoftAssertDemo implements IDataSet {
  private int size;
  private SoftAssert assertion = new SoftAssert();
  private AtomicInteger counter = new AtomicInteger(1);

  @Override
  public void setSize(int size) {
    this.size = size;
  }

  @Test(dataProvider = "dp")
  public void testMethod(int number) {
    if ((number % 2) == 0) {
      assertion.fail("Simulating a failure for " + number);
    }
    if (counter.getAndIncrement() == size) {
      assertion.assertAll();
    }
  }

  @DataProvider(name = "dp")
  public Object[][] getData(@TestInstance Object object) {
    Object[][] data = new Object[][] {{1}, {2}, {3}, {4}, {5}};
    if (object instanceof IDataSet) {
      ((IDataSet) object).setSize(data.length);
    }
    return data;
  }
}
_

このアプローチの注意事項:

  1. データプロバイダーはデータセットのサイズをテストクラスインスタンスに返すため、テストクラスには_@DataProvider_メソッドを1つだけ含める必要があります。したがって、2つ以上のデータプロバイダーがある場合、データの競合が発生する可能性があり、1つのデータプロバイダーが他のデータプロバイダーを上書きします。
  2. 2つ以上のデータプロバイダーを格納する場合は、データプロバイダーによって提供されるこれらの_@Test_メソッドが並行して実行されないようにする必要があります。
1

@DataProviderおよび@Testメソッドを使用しました。 @Testメソッドは、@ DataProviderからString [] []を取得しました。その後、for eachループは必要なくなりました。 Assert TrueとAssert Equalsを持つcheckUrlメソッドの後にすべてAssert Allを配置するだけです。

           @Test(dataProvider = “Urls”)
           public static void TestURLRedirectCheck2(String RURL, String EURL){
           checkUrl(RURL, EURL);
           softAssert.assertAll ();
           }
0
TheAutomator