Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как завалить selenium тесты?


(talisman1234) #1

Хотелось организовать полный прогон тестов так, чтобы они не прекращали своё выполнение в середине теста. Реализация блоков try-catch решила этот вопрос, но тесты начинают завершаться со статусом Success. Сделал свой ехсепш и  метод, бросающий этот эксепшн, если были любые другие эксепшены. Теперь приходиться вызывать этот метод в конце каждого теста, что не очень удобно.

Подскажите как можно избежать таскания дополнительного метода в каждом тесте. Можно ли сделать проверку автоматической?

 


(Mykhailo Poliarush) #2

ну ровно для таких целей, как в TestNG так и в JUnit, есть методы, который называются fail("your message")

http://testng.org/javadocs/org/testng/Assert.html#fail(java.lang.String)

http://junit.sourceforge.net/javadoc/org/junit/Assert.html#fail(java.lang.String)

что по сути надо сделать, так это иметь какой-то флаг, который будет показывать тест прошел или не прошел 

и взависимости от этого флага, в конце выполнения сценария валить или успешно завершать этот тест


(Shaman) #3

Да, методы Assert.fail(); вам помогут.


(talisman1234) #4

Это да, однако я не понимаю как это решит проблему вызова одного дополнительного метода в самом тесте?

 


(Mykhailo Poliarush) #5

сорри, не понял вопроса

можно пожалуйста перефразировать :)


(talisman1234) #6

Переписал заглавый пост.

Подскажите как можно избежать таскания дополнительного метода в каждом тесте. Можно ли сделать проверку автоматической?


(Shaman) #7

если вы используете в каждом тесте tearDown метод после завершения теста то можно это вынести туда, а в процессе прохождениея теста заполнять arrayList errors к примеру данными.

 

в итоге:

@AfterTest

public void tearDown(){

if(errors.size()>0)

Assert.fail();

driver.close();

}


(talisman1234) #8

Если я правильно помню, то при такой реализации свалиться сам метод tearDown(), а не сам тест. Поправьте меня если это не так.

 


(Mykhailo Poliarush) #9

вот вполне стандартный код, который генерируется Selenium IDE

и нет должен завалиться тест, который сейчас выполняется, а не конкретный метод.

 

import java.util.regex.Pattern;
import java.util.concurrent.TimeUnit;
import org.junit.*;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
import org.openqa.selenium.*;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class Untitled {
    private WebDriver driver;
    private String baseUrl;
    private StringBuffer verificationErrors = new StringBuffer();

    @Before
    public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = http://localhost:5500/;
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void testUntitled() throws Exception {
        driver.get(baseUrl + “”);
    }

    @After
    public void tearDown() throws Exception {
        driver.quit();
        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
            fail(verificationErrorString);
        }

    }
}


(talisman1234) #10

С TestNG у меня не прокатывает такая реализация


(Mykhailo Poliarush) #11

так сразу надо писать, что решение надо для ТестНГ

вот такой вот пример для меня работает 

 

import static org.junit.Assert.fail;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

public class Untitled {
    private WebDriver driver;
    private String baseUrl;

    @BeforeMethod
    public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = http://google.com/;
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test
    public void testUntitled() throws Exception {
        driver.get(baseUrl + “”);
    }

    @AfterMethod
    public void tearDown() throws Exception {
        driver.quit();
        fail(“some error here”);
    }
}


(talisman1234) #12

У меня на выходе вот так выходит 


===============================================
Test
Total tests run: 1, Failures: 0, Skips: 0
Configuration Failures: 1, Skips: 1
===============================================

(Mykhailo Poliarush) #13

да, сорри, не в то окно посмотрел и подумал, что код работает

задача немного сложнее

но я нашел вот ссылочку, которая может помочь 

http://seleniumexamples.com/blog/guide/using-soft-assertions-in-testng/

 

 

package tests;
 
import java.util.List;
 
import org.testng.IInvokedMethod;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.internal.Utils;
 
public class CustomTestListener extends TestListenerAdapter {
 
	@Override
	public void afterInvocation(IInvokedMethod method, ITestResult result) {
 
		Reporter.setCurrentTestResult(result);
 
		if (method.isTestMethod()) {
 
			List verificationFailures = TestBase.getVerificationFailures();
 
			//if there are verification failures...
			if (verificationFailures.size() > 0) {
 
				//set the test to failed
				result.setStatus(ITestResult.FAILURE);
 
				//if there is an assertion failure add it to verificationFailures
				if (result.getThrowable() != null) {
					verificationFailures.add(result.getThrowable());
				}
 
				int size = verificationFailures.size();
				//if there's only one failure just set that
				if (size == 1) {
					result.setThrowable(verificationFailures.get(0));
				} else {
					//create a failure message with all failures and stack traces (except last failure)
					StringBuffer failureMessage = new StringBuffer("Multiple failures (").append(size).append("):nn");
					for (int i = 0; i < size-1; i++) {
						failureMessage.append("Failure ").append(i+1).append(" of ").append(size).append(":n");
						Throwable t = verificationFailures.get(i);
						String fullStackTrace = Utils.stackTrace(t, false)[1];
						failureMessage.append(fullStackTrace).append("nn");
					}
 
					//final failure
					Throwable last = verificationFailures.get(size-1);
					failureMessage.append("Failure ").append(size).append(" of ").append(size).append(":n");
					failureMessage.append(last.toString());
 
					//set merged throwable
					Throwable merged = new Throwable(failureMessage.toString());
					merged.setStackTrace(last.getStackTrace());
 
					result.setThrowable(merged);
				}
			}
		}
	}
 
}