Как распечатать сообщение о прохождении при прохождении теста с помощью TestNG SoftAssertions

#testng

#testng

Вопрос:

В SoftAssertion печатается только сообщение о сбое при сбое теста, но нет возможности распечатать сообщение о прохождении при прохождении теста. Я хочу напечатать сообщение о прохождении при прохождении SoftAssertion.

Ниже я написал метод-оболочку для assertEquals, как показано ниже: 1. SoftAssertion.java ==>>

 import org.testng.asserts.SoftAssert;

public class SoftAssertion {

    public SoftAssert softAssert = new SoftAssert();

    public SoftAssertion() {
    }

    public void assertAll(){
        softAssert.assertAll();
    }

public void assertEquals(String actual, String expected, String failMessage, String passMessage) {
       if (actual.equals(expected)){
               softAssert.assertEquals( actual,  expected,  failMessage);
               Report.testPass(passMessage);
           } else{
               softAssert.assertEquals( actual,  expected,  failMessage);
               Report.testFail(failMessage);
           }
       }
}
  
  1. Тестовый класс ==>>
 public class NewSoftAssertTest {

    @Test
    public void myTest(){
        Report.startReport("New Soft Assert Test",
                "1) Test Soft Assert");

        SoftAssertion softAssert = new SoftAssertion();

        softAssert.assertEquals("A","B","Strings are not equal", "Strings are equal");
        softAssert.assertEquals("Hello", "Hello", "Hello is not equal to Hello", "Hello is equal to Hello");

        softAssert.assertAll();

    }
}
  

Приведенный выше код работает отлично. Я хочу знать, правильно ли это регистрировать сообщение о прохождении в TestNG SoftAssert?

В одном из сообщений кто-то предложил добавить блок try catch, как показано ниже 1. Программное обеспечение .java ==>>

 import org.testng.asserts.SoftAssert;

public class SoftAssertion {

    public SoftAssert softAssert = new SoftAssert();

    public SoftAssertion() {
    }

    public void assertAll(){
        softAssert.assertAll();
    }

public void assertEquals(String actual, String expected, String failMessage, String passMessage){
       try {
           softAssert.assertEquals(actual, expected, failMessage);
           System.out.println("Assertion passed");
           Report.testPass(passMessage);
       }catch (AssertionError e){
           System.out.println("Assertion failed");
           Report.testFail(failMessage);
           throw e;
       }
   }

}
  
  1. Тестовый класс ==>>
 public class NewSoftAssertTest {

    @Test
    public void myTest(){
        Report.startReport("New Soft Assert Test",
                "1) Test Soft Assert");

        SoftAssertion softAssert = new SoftAssertion();
        softAssert.assertEquals("A","B","Strings are not equal", "Strings are equal");
        softAssert.assertEquals("Hello", "Hello", "Hello is not equal to Hello", "Hello is equal to Hello");
        softAssert.assertAll();

    }
}
  

На консоли он правильно показывает ошибку утверждения для A и B, но в отчете он проходит шаг и печатает «Строки равны»

Q1. Мой вопрос в том, где что-то идет не так? Оно должно перейти в блок try catch и зарегистрировать сообщение о сбое.

Q2. Какой подход лучше, 1-й или 2-й, использующий try catch?

Ответ №1:

Чтобы гарантировать, что вы получаете сообщения, зарегистрированные как для принятых, так и для неудачных утверждений, вы можете сделать что-то вроде этого (я использую последнюю выпущенную версию TestNG на сегодняшний день, а именно., 7.0.0-beta3 ):

Создайте настраиваемый класс утверждений, расширив org.testng.asserts.SoftAssert [ Вы также можете взглянуть на org.testng.asserts.LoggingAssert , если хотите расширить его вместо этого].

Вот пример реализации.

 import org.testng.asserts.IAssert;
import org.testng.asserts.SoftAssert;

public class SimpleLoggingAssert extends SoftAssert {

  @Override
  public void onAssertSuccess(IAssert<?> assertCommand) {
    System.err.println(assertCommand.getMessage()   " <PASSED> ");
  }

  @Override
  public void onAssertFailure(IAssert<?> assertCommand, AssertionError ex) {
    String suffix =
        String.format(
            "Expected [%s] but found [%s]",
            assertCommand.getExpected().toString(), assertCommand.getActual().toString());
    System.err.println(assertCommand.getMessage()   " <FAILED>. "   suffix);
  }
}
  

Вот тестовый код:

 import org.testng.annotations.Test;

public class NewSoftAssertTest {

  @Test
  public void myTest() {

    SimpleLoggingAssert softAssert = new SimpleLoggingAssert();

    softAssert.assertEquals("A", "B", "Test1: Ensure strings are equal");
    softAssert.assertEquals("Hello", "Hello", "Test2: Ensure strings are equal");

    softAssert.assertAll();
  }
}
  

Вот результат выполнения

 Test1: Ensure strings are equal <FAILED>. Expected [B] but found [A]
Test2: Ensure strings are equal <PASSED> 

java.lang.AssertionError: The following asserts failed:
    Test1: Ensure strings are equal expected [B] but found [A]
Expected :B
Actual   :A
 <Click to see difference>


    at org.testng.asserts.SoftAssert.assertAll(SoftAssert.java:47)
    at com.rationaleemotions.stackoverflow.qn55387064.NewSoftAssertTest.myTest(NewSoftAssertTest.java:15)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:131)
    at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:570)
    at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:170)
    at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:790)
    at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:143)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    at org.testng.TestRunner.privateRun(TestRunner.java:763)
    at org.testng.TestRunner.run(TestRunner.java:594)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:398)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:392)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
    at org.testng.SuiteRunner.run(SuiteRunner.java:304)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1146)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1067)
    at org.testng.TestNG.runSuites(TestNG.java:997)
    at org.testng.TestNG.run(TestNG.java:965)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)


===============================================
Default Suite
Total tests run: 1, Passes: 0, Failures: 1, Skips: 0
===============================================