1

I have two array lists,expectedResult and actualResults.

List<String> expectedResult = new ArrayList<String>();
expectedResult.add("2014-11-17");
expectedResult.add("2014-11-18");
expectedResult.add("Active");
expectedResult.add("Manual");
expectedResult.add("Android WarZone");
expectedResult.add("Android Headlines"); 
List<String> actualResult = new ArrayList<String>();
WebElement table = driver1.findElement(By.id("keyword-grid")); 
List<WebElement> allCells = table.findElements(By.tagName("td"));
for (int j=0; j<allCells.size(); j++){
 actualResult.add(allCells.get(j).getText());
}

Actual data set is as below.

[Android WarZone, Manual, Active, 2014年11月18日 12:21:45, Digitalbox Testing, , Android Headlines, Manual, Active, 2014年11月18日 10:25:36, Digitalbox Testing, ]

I am trying to compare the two array list values using below code.

for(int i=0;i<expectedResult.size();i++) {
 if(actualResult.get(i).contains(expectedResult.get(i))) {
 System.out.println("Search function verified");
 }else {
 System.out.println("Search function verification failed"+actualResult.get(i));
 }
}

below is the output of the comparison.

Search function verification failedAndroid WarZone
Search function verification failedManual
Search function verified
Search function verification failed2014-11-18 12:21:45
Search function verification failedDigitalbox Testing
Search function verification failed

Only one value, Android Headlines, was verified.

How can I compare two array values?

beatngu13
2,1421 gold badge11 silver badges24 bronze badges
asked Jan 26, 2018 at 7:08

3 Answers 3

1

You're not checking if the actual array contains the value, you're checking if the element at index i in the actual array matches the value at index i in the array of expected values.

Also, if you're going to iterate over all the values of expectedResult, use the enhanced for loop.

Finally, if you are testing something, use assertions and fail if expected result is not met. From your example it's not clear when to fail. If actual contains value not expected, or if actual does NOT contain a value that is expected?

for (String expected: expectedResult) {
 if (actualResult.contains(expected)) {
 System.out.println("Search function verified");
 } else {
 System.out.println("Search function verification failed" + expectedResult.get(i));
 }
 }
answered Jan 26, 2018 at 9:46
8
  • I still get Search function verification failed for date values. Commented Jan 26, 2018 at 10:40
  • Your expected result contains Dates, your actual Result contains DateTime; you'll need to compare them differently as they will not be equal. Commented Jan 26, 2018 at 10:51
  • Also, when should your test fail? Should it fail if expected and actual are not exactly the same? or when actual does not contain all expected? or when expected does not contain all actual? Commented Jan 26, 2018 at 10:51
  • It should fail when actual does not contain all expected. Thank you. Commented Jan 26, 2018 at 10:53
  • ok, then iterate over all expected like in the example Commented Jan 26, 2018 at 10:55
2

If you're looking for a pure Java solution, it all depends on how confident you want to be that they're the same.

The easiest way to do it is to leverage the collections API who did all this work for you, which is simply:

boolean testPassed = expectedResult.containsAll(actualResult);

This will be quite slow on an ArrayList in terms of order, but for such small values that isn't going to be a problem.

For larger lists, you can use a set to make the lookups faster at the expense of a bigger memory footprint and slower startup. You probably wouldn't notice a difference until a few thousand records (if you notice at all) but some tests can have very large sets, so... why not!

Set<String> expectedSet = new HashSet<>(expectedValue);
Set<String> actualSet = new HashSet<>(actualValue);
boolean testPassed = expectedSet.containsAll(actualSet);

If you're concerned about duplicates, you can take a slightly longer approach by sorting the values and walking down the arrays. Notice how as soon as it becomes false, it stops walking down the array.

boolean testPassedSoFar = expectedList.size() == actualList.size();
if(testPassedSoFar) {
 Collections.sort(expectedList);
 Collections.sort(actualList);
 for(int i = 0; i < expectedList.size() && testPassedSoFar; i++) {
 testPassedSoFar &= expectedList.get(i).equals(actualList.get(i));
 }
}
answered Jan 27, 2018 at 2:44
0

You're checking the content of the String's underlying char array (i. e. String#contains), but what you want is List#contains.

However, don't reinvent the wheel, use existing libraries. You can use JUnit to better manage your Selenium tests and an assertion library such as AssertJ. Using the latter, all you have to do is:

assertThat(actual).containsAll(expected);

You can also use containsExactly if you care about the order.

Don't worry too much about performance/complexity of these operations, the most important thing is that the tests are readable.

answered Jan 27, 2018 at 10:32

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.