如何使用TestNG SoftAssertions在测试通过时打印通过消息

如何使用TestNG SoftAssertions在测试通过时打印通过消息,testng,Testng,在SoftAssertion中,当测试失败时,它只打印失败消息,但没有在测试通过时打印通过消息的规定。我想在SoftAssertion通过时打印通过消息 我已经为AssertEquals编写了以下包装方法: 1.SoftAssertion.java==>> import org.testng.asserts.SoftAssert; public class SoftAssertion { public SoftAssert softAssert = new SoftAssert();

在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);
           }
       }
}
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;
       }
   }

}
  • 测试类==>>
  • 上面的代码工作得非常好。我想知道这是在TestNG SoftAssert中记录pass消息的正确方法吗

    在其中一篇帖子中,有人建议添加try-catch块,如下所示 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);
               }
           }
    }
    
    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;
           }
       }
    
    }
    
  • 测试类==>>
  • 在控制台上,它正确地显示了A和B的断言失败,但在报告中,它通过了步骤并打印“字符串相等”

    问题1。我的问题是哪里出了问题?它应该进入try-catch块并记录失败消息


    问题2。哪种方法更好,第一种方法还是第二种方法使用try-catch?

    为了确保记录已通过和失败的断言的消息,您可以这样做(我使用的是今天最新发布的TestNG版本,即,
    7.0.0-beta3
    ):

    通过扩展
    org.testng.asserts.SoftAssert
    [如果您想扩展它,还可以查看
    org.testng.asserts.LoggingAssert
    ],构建一个定制的断言类]

    下面是一个示例实现

    import org.testng.asserts.IAssert;
    导入org.testng.asserts.SoftAssert;
    公共类SimpleLoggingAssert扩展了SoftAssert{
    @凌驾
    AssertSuccess上的公共无效(IAssert assertCommand){
    System.err.println(assertCommand.getMessage()+);
    }
    @凌驾
    AssertFailure上的公共无效(IAssert assertCommand、AssertOnError ex){
    字符串后缀=
    字符串格式(
    “应为[%s],但找到[%s]”,
    assertCommand.getExpected().toString()、assertCommand.getActual().toString());
    System.err.println(assertCommand.getMessage()+“+后缀);
    }
    }
    
    以下是测试代码:

    import org.testng.annotations.Test;
    公共类NewSoftAssertTest{
    @试验
    公共无效myTest(){
    SimpleLoggingAssert softAssert=新SimpleLoggingAssert();
    assertEquals(“A”、“B”、“Test1:确保字符串相等”);
    assertEquals(“Hello”、“Hello”、“Test2:确保字符串相等”);
    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
    ===============================================
    
    Test1:确保字符串相等。预期[B]但发现[A]
    测试2:确保字符串相等
    java.lang.AssertionError:以下断言失败:
    测试1:确保字符串等于预期的[B]但找到的[A]
    预期:B
    实际:A
    位于org.testng.asserts.SoftAssert.assertAll(SoftAssert.java:47)
    在com.rationalemotions.stackoverflow.qn55387064.NewSoftAssertTest.myTest(NewSoftAssertTest.java:15)
    在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
    位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
    位于java.lang.reflect.Method.invoke(Method.java:498)
    位于org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:131)
    位于org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:570)
    位于org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:170)
    位于org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
    位于org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:790)
    位于org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:143)
    位于org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
    位于org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
    位于org.testng.TestRunner.privateRun(TestRunner.java:763)
    位于org.testng.TestRunner.run(TestRunner.java:594)
    位于org.testng.SuiteRunner.runTest(SuiteRunner.java:398)
    在org.testng.SuiteRunner.runsequential上(SuiteRunner.java:392)
    位于org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
    运行(SuiteRunner.java:304)
    位于org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
    位于org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
    在org.testng.testng.runSuitesSequentially上(testng.java:1146)
    位于org.testng.testng.runSuitesLocally(testng.java:1067)
    位于org.testng.testng.runSuites(testng.java:997)
    位于org.testng.testng.run(testng.java:965)
    运行(IDEARemoteTestNG.java:73)
    位于org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
    ===============================================
    默认套件
    运行的测试总数:1,通过:0,失败:1,跳过:0
    ===============================================