von
(von)
08.Февраль.2013 04:58:27
#1
Никто не подскажет, как грамотно поймать ошибку при использовании selenium wd + testNG? Сейчас пользуюсь таким способом, для выявления ошибок при выполнении какой-то части теста
@Test (groups = "blablabla", priority = 2)
protected void blablabla () throws Exception {
try {
.......
.......
.......
.......
.......
.......
} catch (Exception e) {
ScrTaker.captureScr(driver);
Logger.error("Ошибка в модуле");
e.printStackTrace();
}
} Если найден эксепшн, то приходится выводить стэк ошибки в консоль, потому что есть главная проблема: testNG не заносит этот тест к провеленным, т.е. в репорте нет сообщений об ошибке, все ок
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 243.031 sec
Results :
Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
Добиться сообщения об ошибке после теста могу только с помощью org.testng.Assert.*
Для скипа тестов, способ следующий работает, может есть какой аналог бля "завала" теста
throw new SkipException("!skiped");
Пробывал через Assert.fail(), он работает, но валит тест всегда, даже если нет эксепшена
vmaximv
(vmaximv)
08.Февраль.2013 05:57:37
#2
Если Вы это затеваете для снятия скриншота при фейле - то следует копать в сторону TestListenerAdapter
Пробывал через Assert.fail(), он работает, но валит тест всегда, даже если нет эксепшена
Тут вообще ничего не понятно - когда будет вызван Assert.fail() - тогда и будет фейл.
von
(von)
08.Февраль.2013 06:38:06
#3
Из-за чего я решил обернуть тестовые методы, из-за того, что в консоле не видно, где именно упас тест, неудобно смотреть список эксепшенов после завершения всех тестов. Что подрузамевалось: 1. Много тестовых классов
2. Каждый оборачивается такой конструкцией
3. В случае эксепшена - сделать скрин, вывести сообщение об ошибке. И чтобы после завершения всех тестов, testNG посчитал тестовый класс с эксепшеном заваленным и отметил у себя
vmaximv
(vmaximv)
08.Февраль.2013 06:44:33
#4
Понятно. Тогда вам точно в TestListenerAdapter.
von
(von)
08.Февраль.2013 06:45:12
#5
Спасибо, что показали куда копать
vmaximv
(vmaximv)
08.Февраль.2013 06:55:56
#6
Могу помочь с "раскопками" :)
public class TestListener extends TestListenerAdapter { private String outputDir; private static Integer counter = 0; @Override public void onStart(ITestContext result) { super.onStart(result); System.out.println(result.getOutputDirectory()); outputDir = result.getOutputDirectory() + "\\..\\Screenshots"; new File(outputDir).mkdir(); outputDir += "\\"; } @Override public void onTestFailure(ITestResult tr) { String screenshotName = tr.getTestClass().getRealClass() .getSimpleName() + "." + tr.getName(); String seleniumScreenshotFileName = screenshotName + "_browser.png"; String robotScreenshotFileName = screenshotName + "_desktop.png"; File screenshotFile; try {
Robot robot = new Robot(); Rectangle area = new Rectangle(Toolkit.getDefaultToolkit() .getScreenSize()); BufferedImage image = robot.createScreenCapture(area); screenshotFile = new File(outputDir, robotScreenshotFileName); ImageIO.write(image, "png", screenshotFile);
screenshotFile = ((TakesScreenshot) ConfigurationManager .getBrowser()).getScreenshotAs(OutputType.FILE); screenshotFile.renameTo(new File(outputDir, seleniumScreenshotFileName)); } catch (Exception e) { e.printStackTrace(); } ITestResult currentTestResult = Reporter.getCurrentTestResult(); Reporter.setCurrentTestResult(tr); Reporter.log("<a href='.\\Screenshots\\" + seleniumScreenshotFileName + "'>Browser screenshot</a>"); Reporter.log("<a href='.\\Screenshots\\" + robotScreenshotFileName + "'>Desktop screenshot</a>"); Reporter.setCurrentTestResult(currentTestResult); super.onTestFailure(tr); } }
Тут же можно прикрутить вывод трассы/экшепшена в консоль
von
(von)
11.Февраль.2013 04:05:55
#7
Пока не стал заморачиваться с TestListenerAdapter
Проблему решил следующим образом, в блок catch добавил
throw new RuntimeException();
@Test (groups = "blablabla", priority = 2)
protected void blablabla () throws Exception {
try {
.......
.......
.......
.......
.......
.......
} catch (Exception e) {
ScrTaker.captureScr(driver);
e.printStackTrace();
throw new RuntimeException("Ошибка в модуле");
}
}
Если выпадает эксепшен, в консоль выводится трасса, после выполнения всех тестов:
Results :
Failed tests: root_orgstructure(**.*****.***.*******): Ошибка в модуле
Tests run: 6, Failures: 1 , Errors: 0, Skipped: 4
Может кому пригодится