Принудительный завал теста


(von) #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();

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) #2

Если Вы это затеваете для снятия скриншота при фейле - то следует копать в сторону TestListenerAdapter

Пробывал через Assert.fail(), он работает, но валит тест всегда, даже если нет эксепшена

Тут вообще ничего не понятно - когда будет вызван Assert.fail() - тогда и будет фейл.


(von) #3

Из-за чего я решил обернуть тестовые методы, из-за того, что в консоле не видно, где именно упас тест, неудобно смотреть список эксепшенов после завершения всех тестов. Что подрузамевалось:
1. Много тестовых классов

2. Каждый оборачивается такой конструкцией

3. В случае эксепшена - сделать скрин, вывести сообщение об ошибке. И чтобы после завершения всех тестов, testNG посчитал тестовый класс с эксепшеном заваленным и отметил у себя


(vmaximv) #4

Понятно.  Тогда вам точно в TestListenerAdapter.


(von) #5

Спасибо, что показали куда копать


(vmaximv) #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) #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
 
Может кому пригодится