TestNG - 软断言

时间:2018-05-17 15:49:43

标签: java testng

我在一个运行了一些软断言的脚本上设置了@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();
    }

}

2 个答案:

答案 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);
}

这种方法的注意事项:

  1. 测试类中应该只有一个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个或更多数据提供者,则可能会发生数据竞争,其中一个数据提供者会覆盖另一个数据提供者。
  2. 如果您想容纳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 ();
           }