t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f7483722a28> #<Tag:0x00007f7483722960>

Есть задача проверить отсторитрованы ли цены на странице по возрастанию.
Не нашел какой 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;
}

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

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

2 Симпатий
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" }));
...

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

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

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

assertPreserveNotOrder в TestNG

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

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

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

1 Симпатия

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


	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));

Assert.assertEqualsNoOrder(actual, expected);

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

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

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

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

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

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

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

1 Симпатия