@Test
いくつかのsoft asserts
。
しかし、assertAll
の配置で問題が発生しています。すべてのURLs
をassertAll
の前に通過させたい。これは可能ですか、それとも別の推奨されるアプローチですか?
@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();
}
}
あなたが探しているユースケースは、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;
}
}
_
このアプローチの注意事項:
@DataProvider
_メソッドを1つだけ含める必要があります。したがって、2つ以上のデータプロバイダーがある場合、データの競合が発生する可能性があり、1つのデータプロバイダーが他のデータプロバイダーを上書きします。@Test
_メソッドが並行して実行されないようにする必要があります。@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 ();
}