TestNG - Soft Assert - PullRequest
       5

TestNG - Soft Assert

0 голосов
/ 17 мая 2018

У меня есть настройка @Test для сценария, который выполняется с некоторыми мягкими утверждениями. Тем не менее, я сталкиваюсь с проблемой размещения AssertAll. Я хочу, чтобы все URL прошли до 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();
    }

}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Я использовал методы @DataProvider и @Test.Метод @Test извлекает String [] [] из @DataProvider.Тогда мне не нужно было для каждого цикла.Я просто поместил Assert All после метода checkUrl, который имеет Assert True и Assert Equals.

           @Test(dataProvider = “Urls”)
           public static void TestURLRedirectCheck2(String RURL, String EURL){
           checkUrl(RURL, EURL);
           softAssert.assertAll ();
           }
0 голосов
/ 18 мая 2018

Вариант использования, который вы ищете, своего рода побеждает цель SoftAssert.SoftAssert был в основном введен в TestNG, так что вы можете собрать все утверждения в одном методе @Test, но завершить тестовый метод только в конце (при вызове assertAll()).

ДанныеУправляемый @Test метод - это, в основном, @Test метод, который выполняется "n" раз (каждая итерация выполняется с различным набором данных).Поэтому нет смысла пытаться использовать 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;
  }
}

Предостережения при таком подходе:

  1. Тестовый класс должен иметь только один @DataProviderметод в нем, потому что поставщик данных передает размер набора данных обратно в экземпляр класса теста.Поэтому, если у вас есть 2 или более провайдера данных, есть вероятность продолжения гонки данных, при которой один провайдер данных перезаписывает другого.
  2. Если вы хотите разместить двух или более провайдеров данных, вам потребуетсяубедитесь, что эти @Test методы, поддерживаемые поставщиками данных, не работают параллельно.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...