#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);
}
}
}
- Тестовый класс ==>>
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;
}
}
}
- Тестовый класс ==>>
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
===============================================