我在一个运行了一些软断言的脚本上设置了@Test。但是,我遇到了AssertAll放置的问题。我希望所有的URL都能在断言之前完成。这是可能的还是另一种推荐的方法。感谢。
@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();
}
}
答案 0 :(得分:2)
您正在寻找的用例,有点违背了{{1}}的目的。 SoftAssert
基本上是在TestNG中引入的,因此您可以在一个SoftAssert
方法中收集所有断言,但仅在最后(当您调用@Test
时)使测试方法失败。
数据驱动的assertAll()
方法基本上是@Test
方法,运行“n”次(每次迭代都使用不同的数据集运行)。因此,尝试利用@Test
并在最后一次迭代时调用其SoftAssert
是没有意义的。因为如果你这样做,它基本上归结为只有最后一次迭代失败。
因此,如果您正在考虑使用assertAll()
重新运行测试,那么它将只包含最后一次迭代的索引(这有点荒谬,因为它不是最后一次实际失败的迭代)。
理想情况下,您应该仅在单次迭代的范围内使用testng-failed.xml
。这意味着您在SoftAssert
方法中实例化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;
}
}
方法,因为数据提供程序将数据集的大小传递回测试类实例。因此,如果您有2个或更多数据提供者,则可能会发生数据竞争,其中一个数据提供者会覆盖另一个数据提供者。@DataProvider
方法不要并行运行。答案 1 :(得分:0)
我使用了@DataProvider和@Test方法。 @Test方法从@DataProvider获取String [] []。然后,我不需要为每个循环。我只是在具有Assert True和Assert Equals的checkUrl方法之后放置Assert All。
@Test(dataProvider = “Urls”)
public static void TestURLRedirectCheck2(String RURL, String EURL){
checkUrl(RURL, EURL);
softAssert.assertAll ();
}