The test from the previous post still has 2 assertions that can be done better:
@Test
public void canNavigateToOtherPagesTest2() {
HomePage homePage = new HomePage(driver);
homePage.open();
Assert.assertTrue(homePage.isDisplayed(), "home page is not displayed!");
ResultsPage resultsPage = homePage.searchBy(KEYWORD);
Assert.assertTrue(resultsPage.isDisplayed(),
"results page is not displayed!");
String paginationInfo = resultsPage.getPaginationInfo();
Assert.assertFalse(paginationInfo.isEmpty(), "pagination info is empty!");
Assert.assertTrue(paginationInfo.contains("1 to 10"),
"incorrect pagination info - " + paginationInfo);
int totalResultCount = resultsPage.getTotalResultCount();
Assert.assertTrue(totalResultCount > 0, "totalResultCount is 0!");
resultsPage.goToPage(2);
int pageNumber = resultsPage.getPageNumber();
Assert.assertEquals(pageNumber, 2,
String.format("incorrect page number - actual %d, expected %d",
pageNumber,
2));
List<String> resultTitles = resultsPage.getAllResultTitles();
Assert.assertFalse(resultTitles.isEmpty(), "result titles list is empty!");
}
The 2 assertions are
Assert.assertTrue(paginationInfo.contains("1 to 10"),
"incorrect pagination info - " + paginationInfo);
and
Assert.assertTrue(totalResultCount > 0, "totalResultCount is 0!");
Unfortunately, jUnit and TestNG are very limited in the assertions that they provide out of the box. Other libraries such as Assert J offer many other useful assertions in addition to assertTrue() and assertEquals(). But we will look into Assert J some other time.
How do we deal with these 2 assertions?
We create our own custom assertions:
private void assertContains(String keyword, String text, String message) {
Assert.assertTrue(text.contains(keyword), message);
}
and
private void assertPositive(int n, String message) {
Assert.assertTrue(n > 0, message);
}
Using the new custom assertions, the test becomes simpler:
@Test
public void canNavigateToOtherPagesTest3() {
HomePage homePage = new HomePage(driver);
homePage.open();
Assert.assertTrue(homePage.isDisplayed(), "home page is not displayed!");
ResultsPage resultsPage = homePage.searchBy(KEYWORD);
Assert.assertTrue(resultsPage.isDisplayed(),
"results page is not displayed!");
String paginationInfo = resultsPage.getPaginationInfo();
Assert.assertFalse(paginationInfo.isEmpty(), "pagination info is empty!");
assertContains("1 to 10", paginationInfo,
"incorrect pagination info - " + paginationInfo);
int totalResultCount = resultsPage.getTotalResultCount();
assertPositive(totalResultCount, "totalResultCount is 0!");
resultsPage.goToPage(2);
int pageNumber = resultsPage.getPageNumber();
Assert.assertEquals(pageNumber, 2,
String.format("incorrect page number - actual %d, expected %d",
pageNumber,
2));
List<String> resultTitles = resultsPage.getAllResultTitles();
Assert.assertFalse(resultTitles.isEmpty(), "result titles list is empty!");
}
Using assertContains() and assertPositive() instead of assertTrue() makes both assertions easier to understand.
You can use custom assertions for many other purposes.
For example:
private void assertContainsIgnoreCase(String keyword,
String text,
String message){
Assert.assertTrue(text.toLowerCase().contains(keyword.toLowerCase()),
message);
}
private void assertNegative(int n, String message) {
Assert.assertTrue(n < 0, message);
}
private void assertZero(int n, String message) {
Assert.assertTrue(n == 0, message);
}