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

Мягкие ассерты, которые не остановят тест, но дадут тот же результат, что и раньше.


(Michael Leginchenko) #1

Всем привет. У меня дилема. вот ситуация....

Есть цикл в котром идёт проверка Элементов AssertEquals.

assertEquals(".... ", znachenie 1, znachenie 2);

 

и таких проверок очень много в цикле....

При каждом новом прохождении цикла значения меняются.. Они затягиваются с файла.

 

Вопрос - как сделать так, чтобы тесты не останавливались, если assertEquals=false.

И самое главное - чтобы по прежнему оно выводило результат как и раньше Actual and expected...

Всем заранее благодарен!!!


(Mykhailo Poliarush) #2

кидаю похожие ссылки на форуме

http://automated-testing.info/forum/zamena-assert-na-myagkuyu-proverku-verify-v-testng

http://automated-testing.info/forum/myagkie-asserty#comment-4208

 


(Michael Leginchenko) #3

перечитал и все перепробовал. Или останавливает тесты или не выкидывает exception такой как раньше assertEQUALS


(Michael Leginchenko) #4

Может что то ещё есть в запасе??)


(Mykhailo Poliarush) #5

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

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


(Антон) #6

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


(Michael Leginchenko) #7

Вот вроде оно ... А можно какой то пример кода глянуть... если вас не затруднит.


(smlionceau) #8

Как вариант, можно каждый ассерт обернуть try/catch с блоком вывода текста ошибки в catch. Ошибку напишет, тест не сотановит


(XGor) #9

private StringBuffer verificationErrors = new StringBuffer();

тесты... в слечае ошибки записываем в verificationErrors

 

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

 


(Mykhailo Poliarush) #10

мягкие ассерты были уже давно выполненны в Senelium RC, вот пример

 

package com.example.tests;
 
import com.thoughtworks.selenium.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
import java.util.regex.Pattern;
 
public class Untitled {
private Selenium selenium;
 
@Before
public void setUp() throws Exception {
selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://change-this-to-the-site-you-are-testing/");
selenium.start();
}
 
@Test
public void testUntitled() throws Exception {
verifyEquals("", selenium.getAlert());
}
 
@After
public void tearDown() throws Exception {
selenium.stop();
}
}
 
 
 
protected StringBuffer verificationErrors = new StringBuffer();
 
 
  /** Like assertTrue, but fails at the end of the test (during tearDown) */
  public void verifyTrue(boolean b) {
    try {
      assertTrue(b);
    } catch (Error e) {
      verificationErrors.append(throwableToString(e));
    }
  }

 

  /** checks for verification errors and stops the browser */
  public void tearDown() throws Exception {
    try {
      checkForVerificationErrors();
    } finally {
      if (selenium != null) {
        selenium.stop();
        selenium = null;
      }
    }
  }

https://code.google.com/p/selenium/source/browse/java/client/src/com/thoughtworks/selenium/SeleneseTestBase.java

 


(apetrovskiy) #11

А разве в вашей среде разработки *unit нет возможности написать кастомный ассёрт повышенной мягкости (комфортности)?

Запросы для двух популярных на этом форуме движков будут выглядеть так:

"junit custom assert"

"testng custom assert"

вот один из ответов по junit:

http://stackoverflow.com/questions/5407955/how-do-you-unit-test-a-custom-assert


(Sergey Korol) #12

Уже в какой-то теме отвечал на этот вопрос: TestNG содержит класс SoftAssert, который будет накапливать сфейлившиеся ассерты, а затем выплюнет эксепшен только при вызове определенного метода.

В BasePage храним объект.

private SoftAssert softAssert;

public SoftAssert getSoftAssert() {
        return softAssert;
}
В PageObject проводим необходимую верификацию, например:
public void verifyText(String pageElement, String expectedValue, String requirement) {
        getSoftAssert().assertTrue(getText(getHTMLElement(pageElement)).equals(expectedValue), requirement);
}

Из теста дергаем следующим образом:

loginPage.verifyText(PageElement.LoginPage.Label.USERNAME, "Username", "Req 1.1");
После завершения всех проверок из BaseTest класса нужно дернуть метод, который выплюнет эксепшен со всеми фейлами:
public void getFailedRequirements() {
        getSoftAssert().assertAll();
}

В логе будет написано нечто вроде:

The following asserts failed: Req 1.1, Req 1.2, Req 1.N.

Если хотите более подробной информации, никто вам не мешает вместо requirement указать expected и actual values. It's up to you.


(Michael Leginchenko) #13

Всем большое спасибо... Попробую отпишусь


(Michael Leginchenko) #14

Попробывал ваш вариант - всё работает, но не совсем так как хотелось... Результат в консоль выводит... А хотелось как раньше в Failure Trace


(Michael Leginchenko) #15

Вопрос Решил посредством обверки в try/catch и errorCollector

Всем Большое Спасибо.


(Mykhailo Poliarush) #16

ну так а что мешает дописать функциональность, которую надо вам? не знание java?


(Michael Leginchenko) #17

Просто не до конца понял) после try / catch всё встало на места. В Любом случае спасибо


(Michael Leginchenko) #18

Сделал как вы говорили... Всё круто... Спасибо.

Переписал пару методов и собрал все Ошибки колектором.


(Michael Leginchenko) #19

Всем Привет ещё раз.  Теперь столкнулся с той же ситуацией.... но перешел на TestNG. Чем можно заменить ErrorCollector  на TestNG кто-то подскажет??


(Sergey Korol) #20

Чем вам не подошел вариант 3мя постами выше? Люди тратят свое время, а вы даже не читаете...