Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Assert для сравнения двух массивов в TestNG?

java
testng
Теги: #<Tag:0x00007fedb9eb01f0> #<Tag:0x00007fedb9eb7f68>

(Oleksandr Molodetskyi) #1

Есть задача проверить отсторитрованы ли цены на странице по возрастанию.
Не нашел какой Assert использовать для сравнения двух массивов (актуальные цены со страницы, ожидаемые цены при сортировке по возрастанию). Пока что сделал Assert в цикле и сверяю значения массивов с одинаковым индексом:

// collect prices on active tab
actualPrices = searchResultPage.getPricesFromSearchResult();
// sort prices and compare sorted prices with price order on the page
sortedPrices = Utils.sortPrices(actualPrices);
int i = 0;
for (double price : sortedPrices) {
Assert.assertEquals(actualPrices[i], price, “Price is not sorted!”);
i = i + 1;
}

но такое решение кажется мне не самым красивым и удобным. Может кто знает какие-то ассерты, которые позволяют проверять идентичность массивов сразу?


(Nik Sidorenko) #2

Попробуйте библиотеку hamcrest и её matchers. Много чего у меня делать и сравнивать + красиво выводить предупреждения.


(Сергей Кузьмин) #3
import static org.junit.Assert.*; // или 
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.CoreMatchers.*;
...
assertThat(result.toArray(), is(new Object[] { "A", "B", "C", "D" }));
...

(Oleksandr Molodetskyi) #4

насчет hamcrest - спасибо - будем посмотреть. Насчет junit - не хотелось бы смешивать в одном тесте junit и testng


(Сергей Кузьмин) #5

это по моему тоже corematchers, а junut можено заменить на testng


(Oleksandr Molodetskyi) #6

спасибо! значит hamcrest


(Taras) #7

assertPreserveNotOrder в TestNG


(Oleksandr Molodetskyi) #8

что-то не могу найти в TestNG такой assert Подсказка в Eclipse не дает такого вариант, в документации к TestNG тоже не находится https://jitpack.io/com/github/cbeust/testng/master-6.13.1-gf634d0a-4/javadoc/org/testng/Assert.html


(Oleksandr Molodetskyi) #9

зато нашлось такое https://jitpack.io/com/github/cbeust/testng/master-6.13.1-gf634d0a-4/javadoc/org/testng/internal/junit/ArrayAsserts.html - но это какой-то AssertJUnit subclass


#10

Так может assertTrue +Arrays.equals ?
https://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#equals-char:A-char:A-


(Oleksandr Molodetskyi) #11

да, такой вариант мне кажется наиболее элегантным и не требует подключения дополнительных библиотек Assert.assertTrue(Arrays.equals(actualPrices, sortedPrices), "Prices are not sorted!");


(Сергей Кузьмин) #12

	private static List<Object> result = new ArrayList<>();
	private static Object[] expected = new Object[] { "A",  "B","C"/* , "D" */ };
// plain java
		Set<Object> expected = new HashSet<Object>(Arrays.asList(data));
		assertTrue(new HashSet<Object>(result).containsAll(expected));
// hamcrest
assertThat(new HashSet<Object>(result), hasItems(expected));

(Taras) #13

Assert.assertEqualsNoOrder(actual, expected);


(Dmitrii Demin) #14

Hamcrest однозначно, там есть различные матчеры и для массивов, и для коллекций. Главное - один раз разобраться в них


(Вячеслав Бульба) #15

А почему бы просто не сравнить через assertEquals? У меня следующий код отрабатывает на ура. Попробуй.
List expectedTexts = new ArrayList<>();

List actualTexts = page.getTexts();
assertEquals(actualTexts, expectedTexts);


(Dmitrii Demin) #16

В случае падения как будете искать отличие? Только дебагом?


(Вячеслав Бульба) #17

Нет, выводится сообщение, на каком элементе несовпадение. Сначала попробуйте, может и вопросы отпадут.


(Mark Dubrovskyi) #18

А AssertJ чем не угодил?

assertThat(strings).isSortedAccordingTo(), куда передается компаратор. Ну или просто isSorted(), если нужен натуральный порядок.