Я использую Selenium, Java и TestNG для написания тестов. Иногда я использую много мягких утверждений в своих модульных тестах, и когда они терпят неудачу, репортер TestNG не показывает строку кода, который они произошли. Есть ли способ показать это? на самом деле, когда я нажимаю на докладе на Failure Exception
он берет меня s_assert.assertAll();
, но мне нужно быть приняты для конкретных линий, таких как: s_assert.assertEquals(Alert_text, "Hi.. is alert message!", "Alert Is InCorrect");
Как сделать отчет TestNG отображать строки, которые не выполняются с помощью мягких утверждений
ответ
Ниже реализация пользовательских Soft Assertion (я назвал его Verifier) должны делать о чем вы просите.
import org.testng.annotations.Test;
import org.testng.asserts.Assertion;
import org.testng.asserts.IAssert;
import org.testng.collections.Maps;
import java.util.Arrays;
import java.util.Map;
public class SoftAssertExample {
private Verifier verifier = new Verifier();
@Test
public void testMethod() {
verifier.assertEquals(false, true);
verifier.assertTrue(true);
verifier.assertAll();
}
/**
* A simple soft assertion mechanism that also captures the stacktrace to help pin point the source
* of failure.
*/
public static class Verifier extends Assertion {
private final Map<AssertionError, IAssert<?>> m_errors = Maps.newLinkedHashMap();
@Override
protected void doAssert(IAssert<?> a) {
onBeforeAssert(a);
try {
a.doAssert();
onAssertSuccess(a);
} catch (AssertionError ex) {
onAssertFailure(a, ex);
m_errors.put(ex, a);
} finally {
onAfterAssert(a);
}
}
public void assertAll() {
if (! m_errors.isEmpty()) {
StringBuilder sb = new StringBuilder("The following asserts failed:");
boolean first = true;
for (Map.Entry<AssertionError, IAssert<?>> ae : m_errors.entrySet()) {
if (first) {
first = false;
} else {
sb.append(",");
}
sb.append("\n\t");
sb.append(ae.getKey().getMessage());
sb.append("\nStack Trace :");
sb.append(Arrays.toString(ae.getKey().getStackTrace()).replaceAll(",", "\n"));
}
throw new AssertionError(sb.toString());
}
}
}
}
Пример кода: s_assert.assertEquals (Alert_text, "Привет .. это предупредительное сообщение!", "Оповещение InCorrect1"); s_assert.assertEquals (Alert_text, «Привет .. это предупреждение!», «Alert Is InCorrect2»); s_assert.assertEquals (Alert_text, «Привет .. это предупреждение!», «Alert Is InCorrect3»); s_assert.assertEquals (Alert_text, «Привет .. это предупреждение!», «Alert Is InCorrect4»); s_assert.assertall();
после выполнения терпит неудачу он указывает (s_assert.assertall();) линии, среднее время он показывает сообщение, которое мягкая утверждают провалена .... оповещение InCorrect2 Оповещение InCorrect3
пожалуйста, проверьте вывод.
показывает номер строки неудачных утверждений? –
показывает, какое мягкое утверждение не удалось и его сообщение «Alert Is InCorrect2»; –
Я думаю, вы не должны «оставлять» свою работу таким образом (это очень плохой стиль), но вместо этого создавать хорошие сообщения. Если ваши утверждения действительно слишком скучны и похожи на записи разумных сообщений, создайте Integer dullAssertNum в начале метода и включите «assert» + (dullAssertNum ++). ToString в каждое тупое утверждение. – Gangnus
Вы спросите, почему это плохой стиль? Потому что вам может понадобиться указывать номер строки только в том случае, если у вас много линий в одном методе тестирования. И это не плохой стиль только в случае сгенерированного файла. А в сгенерированном файле вы можете сгенерировать номер строки и вставить ее в сообщение. – Gangnus