A quick introduction – Packages, Libraries, and Repos Before we begin, if you’re familiar with these terms, you can skip to the next section. As software developers, we often bring other code into our own projects via “packages,” which are pre-built or pre-packaged libraries that others in the software development community create. At first this might seem strange. But one great thing about it is, the creators of these packages know very well the specific “thing” they’ve been working on…. [continue]
Swimming in the deep end with RxJava and Android
At E-gineering, we’ve been using RxJava to help us handle networking (with Retrofit) and threading in Android apps due to the ease with which it handles these tasks. As a learning exercise, Nate Ridderman and I wanted to challenge ourselves to dig deeper with RxJava and get to know some additional operators. Knowing that one of the primary raison d’être and abilities of RxJava is to handle streams of events, we decided to try using it to handle touch inputs…. [continue]
Bringing new life to a Sales application suite. And DevOps!
A little over a year ago, one of our clients came to us and asked if we would take over a project that had fallen into disrepair. Much effort had been expended to get the project off the ground several years ago but time and other priorities had taken their toll. Users were growing increasingly frustrated with bugs, performance problems, data issues and the lack of any forward movement in terms of new features. Several attempts were made to breathe life… [continue]
Android Data Binding Subtleties
One of the things I love about being an Android developer is the amount of resources available at my fingertips on the Internet. There’s a strong community of developers sharing open source libraries, promoting design patterns, and just helping out their peers. For the last several years I’ve primarily been a consumer of these resources, but it’s time to change that! My first blog post describes the process of fixing a relatively obscure bug. I’m following the advice of @chiuki:… [continue]
Simplify Selenium Selectors
Failing to prepare is preparing to fail. – John Wooden Writing strong automated tests comes down to preparation. (I never thought I would be drawing connections between sports and automated tests, yet here I am.) Putting in the hard work up front pays off immensely on the back end. With a solid Page Model architecture in place, writing the actual testing scripts becomes much easier. Getting to that point can be difficult but Gregg Reed’s current sequence of posts for… [continue]
Selenium Java: An Intelligent Example Part 3
In our previous post, Selenium Java: An Intelligent Example Part 2, we dug into the code. We demonstrated how everything is tied together. We outlined the BasePage, WebDriverResource, and BrowserFactory classes. In this post we will be digging into the concrete page objects themselves as well as writing a sample test that uses multiple page objects. Concrete Page Class Each concrete page class extends BasePage. Doing so provides them with everything they need to be a page object. Each web… [continue]
Selenium Java: An Intelligent Example Part 2
In our previous post, Selenium Java: An Intelligent Example Part 1, we described how to manage Technical Debt and the importance of using a Page Model. We also gave an overview of the classes used in this example project. In this post, we will be getting into the code. We will demonstrate how everything ties together and how you could build a similar project to test your application. BasePage The BasePage class is at the center of it all. It… [continue]
Selenium Java: An Intelligent Example Part 1
In our introductory post, A Survey of the Automated Testing Landscape, we defined the problems we often find in automated testing. In this series, we will walk through an intelligent example of a Selenium test project that uses common design patterns and object oriented principles to help solve the problem of Technical Debt. This is not to say that this example is the perfect solution that will solve all of your problems. Remember from the introductory post that unicorns do… [continue]