In Java 8 there is a new concept of Java Streams. Not to be confused with the existing I/O Stream like
FileInputStream, streams are wrappers around a data source, allowing us to operate with that data source and making bulk processing convenient and fast.
This functionality – java.util.stream – supports functional-style operations on streams of elements, such as map-reduce transformations on collections.
Note: A stream does not store data and, in that sense, is not a data structure. It also never modifies the underlying data source.
If you want to read about Java Streams, you can read this awesome tutorial with examples. You can also view this awesome playlist on Java Streams
filter() method in Java is a method provided by the
Stream interface that allows you to filter elements from a stream based on a certain condition.
This is the syntax
filter() method takes a
Predicate as an argument, which is a functional interface that represents a boolean-valued function that takes an object of type
T as input and returns a boolean. The
Predicate function should return
true for elements that should be included in the filtered stream, and
false for elements that should be excluded.
filter() method returns a new stream that contains only the elements that satisfy the given predicate. The new stream is lazily evaluated, which means that it won’t actually process the elements until a terminal operation is called on it.
Let’s take an example to understand – Suppose you want to find out the even numbers from a list. You can use the
filter method with the condition that the modular division with 2 equals 0 and use it to filter out the numbers
Now as you can see, the original data source (
numbers) is not modified and instead a new stream (
evenNumbers) is created with the
filter method, which is what is the property of Java Streams.
Uses in Test Automation
Now the pertinent question – how to use this in test automation code. Let’s face it, not everyday would you be required to filter out the even numbers from a list – we need practical examples to demonstrate how we can use the concept of
filter in test automation code.
Note that most of the examples are something that I’ve implemented in my own test automation framework – the code snippet might vary but the concept remains the same.
- Filtering web elements based on any condition
The first scenario that I’ve used in my codebase is to filter out some web elements based on some condition. You can use the
filter method to filter out elements from a list that do not meet a certain condition.
For example, if you have a list of web elements and you want to filter out all elements that are not displayed on the page, you can use the filter method to achieve this.
In this code we first find all
input elements on a page using the
findElements() method. We then use the
filter() method to create a new list that only contains elements that are displayed.
- Filtering data from API response
Another use case in test automation is the api testing. You may have a scenario where you need to filter out certain keys from your response based on some condition. You can do that using
Let say if you are testing an API that returns a large amount of data, you can use the filter method to filter out the data that you are interested in. For example, if you are only interested in the data for a particular user, you can use the filter method to filter out all the data for other users.
In this example, I want to get all the users whose are assigned a department with id
dept_id. After we fetch the response, we use the
jsonPath() method to extract the list of
users from the response. We then use the
filter() method to create a new list that only contains the user with whose department id matches the
dept_id passed in the method.
- Filtering data from a database query
This is something that we can use with DB queries as well. So instead of using a code snippet, you can use DB queries too. If you are testing a database-driven application, you can use the filter method to filter out data that you do not need. For example, if you want to retrieve all the records for a particular customer, you can use the filter method to filter out all the records for other customers.
We execute a SELECT query on a database to retrieve all customer records. We iterate through the ResultSet to create a list of
Customer objects. We then use the
filter() method to create a new list that only contains the customer with first name “Rahul”. Now this can be done also easily using a simple db query with
WHERE clause. This is just to give an example that you can do it in this way too.
- Filtering test cases based on tags
If you have a large number of test cases and you want to run only a subset of them, you can use the filter method to filter out the test cases that you do not want to run. For example, if you have test cases tagged as
regression, you can use the filter method to run only the
smoke or the
regression test cases.
In this particular scenario, there is a method
getTestCases() that can be used to get all test cases. we retrieve a list of all test cases using the
getTestCases() method and then use the
filter() method to create a new list that only contains test cases with the
Again, no need to going this long way if you’re using frameworks like
Mocha as they give the ability to run the test cases based on tags only like
- Filtering logs for specific messages
If you are debugging a test case and you want to filter out log messages that are not relevant to the issue you are investigating, you can use the filter method to filter out the log messages that you do not need. For example, if you are looking for an error message in a log file, you can use the filter method to filter out all the other messages.
- Filtering elements from a web table
Suppose you have a table on a web page, and you want to filter out only the rows that contain a specific text value. You can use the
filter() method to create a new list that only contains the matching rows:
In this example, first we find all rows of a table on a web page using the
findElements() method, using the xpath. We then use the
filter() method to create a new list that only contains rows that contain the text
John Doe. Not that the condition may be different based on your need or test case, but this is the way you can do that.
- Filtering elements from Drop down
Suppose you have a dropdown on a web page, and you want to filter out only the options that are enabled. You can use the
filter() method to create a new list that only contains the enabled options:
In this example, we’re getting the drop down element with the
id locator and then using the
getOptions() method to get all the select options for the drop down. Then we use the
filter method to get a new list that contains only those elements which are enabled.
As you can see from above code snippets, you can use the
filter method in many ways to selectively get data in your test automation code. Now there are some scenarios like the db query one or the tags one that can easily be done via the existing functionality of the db or the test framework like TestNG, so using the
filter might be an overkill, unless you have a very specific scenario.
Let me know in the comments in the post about your experience and if you’re using the
filter method else where in your test automation codebase.