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

Замена assert на мягкую проверку verify в TestNG


(ivan_ochc) #1

Добрый вечер!

По примеру http://www.youtube.com/watch?v=bkaTElYx5N0 наваял шаблон.
Но практически сразу возникли вопросы. Один из них: как заменить assert на мягкую проверку verify? Нужно, чтобы тест не останавливался на первой же ошибке, а продолжал свою работу и в конце выдавал список ошибок.
Из описания в этой теме и на других ресурсах не совсем понятно, как применить эти рекомендации к моему примеру.
Например:

метод, который находит текст

    public static boolean isTextPresent(String text) {
        try{
        return driver.findElement(By.tagName("body")).getText().contains(text);
    } catch (NoSuchElementException e) {
        return false;
    
}

существует ли указанный текст на странице:

   public boolean checkError() {
        if (isTextPresent("Особовий")) {
            return true;
        }
        else {
            return false;
        }    
    }

Если текст существует, значит “плохо” :wink:

assertFalse(homePage.checkError());

Вопрос: как заменить вышеуказанный assert на verify?


Обновление портала automated-testing.info
(Mykhailo Poliarush) #2

когда-то уже обсуждалась похожая тема

тут дело в том, чтобы бы собирать все что не проходит в какой-то список

а потом в конце списка проверять на наличие в нем хотя бы одной ошибки

когда-то такие проверки были реализованы в selenium rc

назывались verify* методы, можно там посмотреть реализацию

или запустить самый простой тест в selenium ide и конвертировать его selenium rc формат


(ivan_ochc) #3

Нашел такой способ:

public void assertSoft(boolean success, String message, StringBuilder messages) {
    if (!success) messages.append(message);
}

public void assertSoftFalse(boolean success, String message, StringBuilder messages) {
    if (success) messages.append(message);
}

public void assertEmpty(StringBuilder sb) {
    if (sb.length() > 0) {
        throw new AssertionError(sb.toString());
    }
}
assertSoftFalse(homePage.checkError(), "Default error", result);

В итоге в стектрейсе мне пишет:

Total tests run: 1, Failures: 1, Skips: 0 - под failures имеется ввиду заваленых тестов, а не количество ошибок в тесте? так?

FAILED: testLogin
java.lang.AssertionError: Default errorExceptionDefault error -  не очень красиво выглядит. Без пробелов, в один ряд. Как бы это исправить.

(Mykhailo Poliarush) #4

да это количесво заваленных тестов, а не проверок


(ivan_ochc) #5

Вопрос не по теме, но не хочется создавать новую тему:

Есть один тест, нужно разделить его на два. Как это правильно сделать?

@Test
public void testLogin() throws Exception {
    loginPage.open(); //здесь открывается стартовая страница
    StringBuilder result = new StringBuilder();
    homePage = loginPage.loginAs(admin);
    assertSoftFalse(homePage.checkError(), "Default error", result);
    assertSoftFalse(homePage.errorException(), "Exception", result);
    assertSoftFalse(homePage.errorAvailable(), "Unavailable", result);
    homePage.inFeatures(); //здесь открывается новый раздел страницы
    assertSoftFalse(homePage.checkError(), "Default error", result);
    assertSoftFalse(homePage.errorException(), "Exception", result);
    assertSoftFalse(homePage.errorAvailable(), "Unavailable", result);
    assertSoftFalse(homePage.errorPrice(), "Error price -333", result);
    assertEmpty(result);
    
}

Пробовал так, как показано ниже, но это не сработало. Нужно, чтобы после выполнения первого теста (логина в систему), запускался второй тест с переходом в новый раздел.

@Test
public void testLogin() throws Exception {
    loginPage.open(); //здесь открывается стартовая страница
    StringBuilder result = new StringBuilder();
    homePage = loginPage.loginAs(admin);
    assertSoftFalse(homePage.checkError(), "Default error", result);
    assertSoftFalse(homePage.errorException(), "Exception", result);
    assertSoftFalse(homePage.errorAvailable(), "Unavailable", result);
    assertEmpty(result
}

@Test
public void testFeature() throws Exception {
    homePage.inFeatures(); //здесь открывается новый раздел страницы
    assertSoftFalse(homePage.checkError(), "Default error", result);
    assertSoftFalse(homePage.errorException(), "Exception", result);
    assertSoftFalse(homePage.errorAvailable(), "Unavailable", result);
    assertSoftFalse(homePage.errorPrice(), "Error price -333", result);
    assertEmpty(result);
}

(Mykhailo Poliarush) #6

как Вы хотите разбить методы? и какая у вас возникла проблема?


(ivan_ochc) #7

Если запускать так, как указано выше, выбивает ошибку:

PASSED: testLogin
FAILED: testFeature
java.lang.NullPointerException
    at com.mykyivstar.test.LoginTest.testFeature(LoginTest.java:51)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

..........

Я хочу так:

Первый тест - логинимся на страницу, делаем проверки на ошибки.

Второй тест - переходим на следующий раздел и также делаем проверку на ошибки.

Сейчас получается, что проходит только первый тест, второй - нет.

Ради эксперимента пробовал добавить во второй текст следующие строки:

loginPage.open();

homePage = loginPage.loginAs(admin);

В этом случае первый и второй тест проходит успешно, но получается, что мы два раза логинимся на страницу.


(Mykhailo Poliarush) #8

значит у вас проблемы с инициализацией объекта homePage

посмотрите где он задекларирован

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

потому содержимое переменной не сохраняется


(ivan_ochc) #9

Задекларирован в классе с этими двумя методами

public class LoginTest extends BasicTestCase {

    private LoginPage loginPage = PageFactory.initElements(getWebDriver(),
            LoginPage.class);
    private HomePage homePage;

(Mykhailo Poliarush) #10

тут тогда без полного кода, тяжело будет узнать где проблема

и но все таки увебежден это проблема инициализации объектов между тестами

если есть возможность выпожить код, могу посмотреть

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


(ivan_ochc) #11

Буду чрезвычайно благодарен за помощь.

http://www.sendspace.com/file/6m2rml

pswd: 123qwe


(Mykhailo Poliarush) #12

1, имхо, Вы делаете много лишних проверок

2, если Вы хотите открыть страницу, а потом запустить n тестов, то вам лучше воспользоваться @BeforeClass и @AfterClass

3, выполните инициализацию homePage в @BeforeClass и дальше пользуйтесь уже инициализированным объектом

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


(Mykhailo Poliarush) #13

+ забыл добавить что у вас таким образом получаются зависимые тесты

а зависимые тесты плохи тем что могут поламаться цепочкой, как домино

будьте с этим осторожны, в общих случаях я рекомендую сделать тесты независимыми


(TreaNT) #14

я рекомендую сделать тесты независимыми


Спасибо Кэп, в этом какбы и есть смысл этой темы


(Mykhailo Poliarush) #15

не сказал бы, потому что человек хочет разделить один тест на два теста, но при этом чтобы страница не закрывалась и не перегружалась

т.е. если первый тест неправильно отработал и завел на какую-то другую страницу, то второй тест 100% упадет

в этом и есть зависимость


(ivan_ochc) #16

Под независимыми вы имеете ввиду такую логику тестов.

Первый тест:

1. Логинимся, - что по умолчанию приводит нас на первую страницу ,- делаем проверки, выходим.

Второй тест:

2. Снова логинимся, заходим на вторую страницу, делаем проверки, выходим.

Третий тест:

3. Снова логинимся, заходим на третью страницу, делаем проверки, выходим.. и т.д.

 

 


(Mykhailo Poliarush) #17

тут есть два варианта

1. первый тот который вы назвали

2 и второй, это залогиниться один раз в сессии, не закрывать браузер, но в каждом тесте сначала открывать нужную страницу, а потом уже производить необходимые действия.


(ivan_ochc) #18

Если не ошибаюсь, второй вариант мне как раз и нужен был изначально.


(Mykhailo Poliarush) #19

ок, мои извинения, значит я ошибался и не правильно понял


(Mykhailo Poliarush) #20

вот примерочный код на гугл правда, но я максимально выстроил Вашу структуру

Test1.java

package browser;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class Test1 extends BaseTestCase{

    private HomePage home;

    @BeforeClass
    public void setup() {
        driver = new FirefoxDriver();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        home = PageFactory.initElements(driver, HomePage.class);
        home.open();
    }

    @AfterClass
    public void tearDown() {
        driver.quit();
    }

    @Test
    public void testGoogle1Search() throws InterruptedException {
        GmailPage gmail = home.openGmail();
        gmail.doSomething();
        Thread.sleep(2000);
    }

    @Test
    public void testGoogleSearch2() throws InterruptedException {
        GooglePlus plus = home.openGooglePlus();
        plus.doSomething();
        Thread.sleep(2000);
    }

}

BaseTestCase.java

package browser;

import org.openqa.selenium.WebDriver;

public class BaseTestCase {
    protected static WebDriver driver;
}

HomePage.java

package browser;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;

public class HomePage extends Page {

    public HomePage(WebDriver driver) {
        super(driver);
    }

    @Override
    public void open() {
        driver.get("https://www.google.com.ua/");
    }

    public GmailPage openGmail() {
        driver.get("https://gmail.com");
        return PageFactory.initElements(driver, GmailPage.class);
    }

    public GooglePlus openGooglePlus() {
        driver.get("http://plus.google.com");
        return PageFactory.initElements(driver, GooglePlus.class);
    }

}

GmailPage.java

package browser;

public class GmailPage {

    public void doSomething() {
        System.out.println("do something");
    }

}
 
GooglePlus.java
package browser;

public class GooglePlus {
    public void doSomething() {
        System.out.println("do something");
    }
}

Page.java

package browser;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public abstract class Page {

    protected static WebDriver driver;

    public Page(WebDriver driver) {
        Page.driver = driver;
    }

    protected void type(WebElement webElement, String text) {
        webElement.clear();
        webElement.sendKeys(text);
    }

    public abstract void open();
}