To deepen my knowledge on what I am learning on-the-job, I build a parallel side project using the same toolsets. It is how I scale the learning curve and shorten the time I need to ramp-up, verifying that I understand the material. It is where I tease out new ideas, soliciting feedback from experts in the field, keeping my finger on the pulse of new software testing techniques and reshape them for the workplace. It's where I start writing the initial draft of the training classes I will be building for the workplace. It's where I research new ideas before introducing them to the team.
Who made this testing tool we are using at work? Who initially created it? How has it evolved? What was the initial problem it tried to solve? What inspired it? If its an open source tool, I examine the code to see how the toolset tests itself. I strike up a conversation with the testing experts who are writing the blog posts, the articles, the technical talks describing how the tool can really be used and bring this knowledge into the workplace.
My research notes on-the-job becomes a new blog entry. The blog entry + feedback from the testing community becomes the on-the-job Confluence documentation and proof-of-concepts I demo at work and the training course I am setting up. That then can become articles for the company blog, and lectures to outside software testing guilds and online courses.
More can be found on my GitHub site. To see general blog entries on building automated test frameworks, go to the Table of Contents.
Below are automation frameworks written in TypeScript, Ruby, JavaScript, Java, and Python, using Detox, Capybara, Watir, Appium, Rest Assured, and Selenium WebDriver.
Claude AI and Cursor AI have also been placed in head-to-head matchups seeing how they set up test frameworks using Playwright + Cypress. Lately, I have been exploring what an "AI QA" role might be.
Featured Projects
DetoxDemo: Testing a React Native mobile app with Detox + TypeScript
January 2026
This demo project became a TestGuild.com talk for the Automation Guild 2026 online conference (See Slides) and an upcoming Software Quality Group of New England ( sqgne.org) talk on May 20, 2026 in Burlington, MA. Based on my work building from scratch a React Native mobile automation framework using Wix's Detox + TypeScript + GitHub Action workflows + Allure Reports at SELF ID. Tested against my first "vibe coded" React Native application, based on Dave Haefner's test site, The-Internet.
- Part One: DetoxDemo, a vibe-coded React Native app
- Part Two: First Time Vibe Coding? What Could Go Wrong?
- Part Three: Features of Detox Demo: CI/ CD, Logging and Reporting
- Part Four: Using GitHub Action Workflows to kick off tests in CI/ CD
- Part Five: The Facebook Ecosystem: React, React Native, Metro, and Yarn
- LinkedIn: First Time Using GitHub CoPilot to Create a ReactNative LoginPage app. What Could Go Wrong?
- Slideshare.Net: http://tinyurl.com/detox-demo-slides
- Source Code: https://github.com/tjmaher/detox-demo
Free Test Automation University course based on my training sessions I put together while at Threat Stack, constructing a Capybara + Ruby + GitLab + Docker + Chef + AWS test automation framework. Course includes visual testing examples using Capybara + Ruby + Headless Chrome + Applitools.
- Part One: Setup and Installation of Ruby + Bundler, Capybara, and RSpec
- Part Two: Arrange, Act, Assert! Testing Links and Navigation, Setting Expectations, and Searching Within
- Part Three: Finders and Matchers
- Part Four: Testing a Login Page, refactoring it into a method
- Part Five: Dropdowns, Radio Buttons, and Checkboxes
- Part Six: Handling Alerts and Modals
- Part Seven: Advanced Topics such as Screenshots, Headless Chrome, Capybara's headless Apparition driver, and adding Applitools.
- Source Code: https://github.com/tjmaher/tau-capybara
Other Projects
Becoming AI QA
March 2026
An investigation into what it takes to test AI systems: Python tooling, LLM validation, and what distinguishes AI QA work from conventional automation.
- Would becoming an AI QA Engineer make myself more marketable? What should I study?
- Why Python? How AI and Python became linked
- Jupyter Notebooks + Python
- Python Project: Blogger Spam Bulk Deleter:
- Pair-programming with Claude building a Python app that interacts with the Blogger API bulk deleting spam comments from my blog.
- Blog: Code Walkthrough: Pair-Coded with Claude but Human Explained!
- GitHub: https://github.com/tjmaher/blogger-spam-bulk-deleter
Claude Sonnet: Claude-Cypress-Login
March 2026
A structured evaluation of whether an AI coding assistant can build a production-quality Cypress + TypeScript framework from natural language prompts alone. The methodology: require the model to explain each design decision as it goes, then verify its claims against cited sources. The goal was to identify where AI-assisted test development requires human intervention and where it holds up on its own.
- Blog: Claude Sonnet 4 Talks About Designing a Cypress Framework for a Login Screen
- Source Code: https://github.com/tjmaher/claude-cypress-login
Claude Sonnet Over-Engineered My Playwright Login!
March 2026
Does an automation framework for a Playwright Login page need to dive into Martin Fowler's concepts of Dependency Injection, Singleton, TestDouble patterns along with the standard Page Object patterns? Standards set by ISTQB and OWASP? Documentation from the Refactoring Guru, The Gang of Four? Claude Sonnet 4 thinks so!
Playwright Generate Plans: Playwright + TypeScript:
February 2026
Testing out how Playwright-Test-Planner and Playwright-Test-Generator, two plugins for GitHub Copilot, can create a test plan in Markdown, then write an automated test framework in Playwright + TypeScript against it, adding in page objects and reporting just by prompting.
Cursor Creates: Playwright + C-Sharp:
February 2026
It's a head-to-head matchup! Cursor AI versus VS Code + GitHub Copilot battling to create automated test frameworks using MS Playwright + C#. Who creates the best tests for The-Internet / Login? The best GitHub Actions Workflow? The best README docs? And can it be created only using prompts?
Login C Sharp:
February 2026
- Source Code: https://github.com/tjmaher/login-c-sharp
The Cheezy Internet: Creating a Ruby + Watir + Cucumber automation framework with Jeff Morgan's Page-Object gem:
Are you sure the buses are still listed?
Data-driven API tests with Ruby + NET::HTTP + ThoughtWorks Gauge
Basic Capybara-Gauge
December 2018
Building a Basic Appium Framework
May 2017 - June 2017
Configuring Build.Gradle Environments:
June 2016
Automate Amazon
Dec 2015 - Jan 2016
How to develop a rudimentary framework to create automated tests for Amazon. Selenium WebDriver + Java + TestNG, based on work doing at Fitbit Boston.
Testing The-Internet
June - July 2015
Selenium WebDriver + Java demonstrating refactoring out common utilities such as logging and error handling, getting page titles, getting URLs, and sending keys, similar to what we were using at Fitbit Boston. Web locators stored in Page Objects.
November 2021
Built to get up to speed on MassMutual's Ruby + Watir + Cucumber stack before working in the production codebase. Uses Jeff Morgan's Page-Object gem against Dave Haefner's The-Internet test site.
- Part One: Source Book: Cucumbers and Cheese: A Tester's Workshop
- Part Two: Installing Ruby + Watir + Chromedriver + VS Code on Windows 10
- Part Three: Writing Ruby + Watir tests for The-Internet
- Part Four: Composing tests using Cucumber and Gherkin
Are you sure the buses are still listed?
Data-driven API tests with Ruby + NET::HTTP + ThoughtWorks Gauge
September 2019
- Part One: Setting up the test plan and table data in a spec file
- Part Two: Interacting with the MBTA API using NET::HTTP
- Source Code: https://github.com/tjmaher/gauge-ruby-api
Basic Capybara-Gauge
December 2018
Based on my work at Threat Stack building a test automation framework for their security application. Threat Stack required it be written in Ruby + Gauge + Gitlab, a toolset I was of yet unfamiliar with. Capybara + Ruby + Headless Chrome + Rubocop.
Discovering Docker
Spring & Summer 2018
- Part One: Analyzing The-Internet
- Part Two: Setup Ruby Environment
- Part Three: Setup Capybara to Test Opening Chrome
- Part Four: Add Option For Chrome Headless
- Part Five: Add Test Steps and Spec Implementations
- Part Six: Setup Chrome and ChromeDriver Logging
- Part Seven: Rubocop Code Review
- Source Code: https://github.com/tjmaher/capybara-gauge
Discovering Docker
Spring & Summer 2018
Infrastructure work in support of a Threat Stack test automation project: standing up a Selenium Grid on AWS using Docker Compose and SeleniumHQ images, then configuring Ubuntu with Docker and exploring Chef + Test Kitchen for environment provisioning.
Tinkering with Twitter
October 2017
- Starting a Selenium Grid using AWS + SeleniumHQ Docker images + Docker Compose
- Setting up Ubuntu Linux with Docker
- Basic Chef + Test Kitchen: Setting up Ubuntu with Vagrant + Virtual Box + the Test-Kitchen Ruby Gem on a MacBook
Tinkering with Twitter
October 2017
Demo project created for an interview at Twitter. Uses Twitter4J Java library. Thank you, Angie Jones for referring me!
- Part One: Twitter and the Twitter Search API
- Part Two: Getting the Twitter credentials: Consumer Keys and Access Tokens
- Part Three: Setting up an API Testing Environment with Twitter4J
- Part Four: Post a Tweet Using Twitter4J To Interact With the Twitter API
- GitHub: Review the source code for the project.
Building a Basic Appium Framework
May 2017 - June 2017
While working as a manual tester on a contract at Ahold, the parent company of Stop & Shop supermarkets, I designed a proof-of-concept that I demoed for them, trying to convince them to hire me as an automation developer creating a brand new mobile automation framework. Designing and documenting the architecture in public before writing production code let the blog posts serve as the technical spec during the pitch.
Evaluating Appium Desktop
April 2017
- Part One: Review How to Inspect Mobile Apps with Appium Desktop
- Part Two: Design a Basic Test, Examining Mobile Elements with Appium Desktop
- Part Three: Install and Launch an App Using Desired Capabilities
- Part Four: Set up the Page Objects, Page Factories and Tests
- Part Five: Download the tests and run them on your own MacBook!
- Part Six: How to create and launch an Android emulator from Android Studio
- Part Seven: What happens behind the scenes as Appium installs and launches an Android app? Examining and footnoting a log file.
- GitHub: Review the source code for the project.
Evaluating Appium Desktop
April 2017
While working as a manual tester on a contract at Ahold, the parent company of Stop & Shop supermarkets, I decided I wanted to create a proof-of-concept of a mobile automation framework. They wanted to see what toolsets I could use. These are my research notes.
Evaluating Serenity BDD
March 2017
- Part One: What is Appium Server and How Do You Start It With Appium Desktop
- Part Two: How to Connect To Your Android Device Using the Android SDK, the Android Command Line Tools, and the Android Debug Bridge
- Part Three: Setting up remote devices through WiFi
- Part Four: Setting up Android Emulators with Android Virtual Device Manager (avd), choosing the Android operating system version
- Part Five: Find the Desired Capabilities: appPackage and appActivity. Bug in AAPT if giving just appName
- Part Six: Inspecting an Android app using Appium Desktop
Evaluating Serenity BDD
March 2017
Starting a new QA Contract at Ahold, the parent company of Stop & Shop supermarkets, before showing it to the stakeholders, I investigated on this blog how I wanted to write automated tests for their mobile apps.
Building a Geb + Groovy + Spock project with Yeoman:
November 2016
- Serenity BDD: An Automation Framework That Uses Specification by Example (SBE)
- What is the Difference Between TDD and BDD?
- Studying BDD using The Cucumber Book and BDD in Action
- Scaffolding a new project using Maven Archetypes
- Reviewing The Serenity Screenplay Tutorial
Are You Sure the Bus Line is Listed? Gathering data using REST APIs and REST Assured:
February 2017
February 2017
Building a Geb + Groovy + Spock project with Yeoman:
November 2016
New job at Good Start Genetics? New automation toolsets to learn, using Geb + Groovy + Spock.
Learning JavaScript: Nightwatch.js
October 2016
Playing with Protractor:
September 2016
- About Yeoman, scaffolding, and other tooling applications
- A Step-by-Step Process: Installing and Configuring Yeoman using Chris Hluchan's Geb Generator
- Running the Built-In Tests From the Command Line, and Examining How They Are Set Up
- Initial Source Code Generated by the Geb Generator
Learning JavaScript: Nightwatch.js
October 2016
At Good Start Genetics, I joined a Node.js product team and adopted Nightwatch.js to write end-to-end tests for a Vue.js front end, pairing it with Node's PostgreSQL library to verify database state. These posts document the learning curve: navigating the overlap between vanilla JavaScript, ES6, Node.js, Mocha, and in-house libraries when reading unfamiliar production test code.
- Learning JavaScript: The History of Node.js, Nightwatch.js, and JavaScript Testing Frameworks (10/2016)
- This Week at Work: The Hard Part of Learning Nightwatch.js (12/2016)
Playing with Protractor:
September 2016
Demo project for a job interview writing a test framework with Protractor + JavaScript + Jasmine, the toolsets at their company.
RESTful API Testing with Postman and Newman:
July 2016
Fitbit Boston was investigating new ways to write API tests, using Postman. Article covers "What is an API?" and gives sample APIs on the web. Also shows
- Testing an AngularJS application with Protractor, Jasmine, and JavaScript
- Walkthrough of installing PhoneCat Tutorial App: How to learn AngularJS
- The complexities of testing JavaScript frameworks, according to Vojtěch Jína, creator of the Karma Test Runner
RESTful API Testing with Postman and Newman:
July 2016
Fitbit Boston was investigating new ways to write API tests, using Postman. Article covers "What is an API?" and gives sample APIs on the web. Also shows
- Walkthrough Setting up a Postman Test
- How to download and configure Newman, how Postman runs tests from the command line
Configuring Build.Gradle Environments:
June 2016
Experiment with the new way Fitbit Boston was writing tests, using Gradle + JUnit + Hamcrest instead of Maven + TestNG + JUnit.
The Builder Pattern:
April 2016 - May 2016
- IntelliJ: Setting up WebDriver framework in Gradle
- Eclipse: Setting up WebDriver framework in Gradle
- A Bit About Groovy
The Builder Pattern:
April 2016 - May 2016
A Senior Developer at Fitbit walked me through a new way to store data, so of course I had to practice using it during my off-hours.
RESTful Testing with Stripe and Apache HttpComponents:
Feb 2016 - March 2016
Selenium WebDriver + Java + Apache HTTP Components. Experimental proof-of-concept that I demoed to stakeholders to prove to Fitbit Boston that we could add tests to our infrastructure for the Stripe API payment processor. They asked for documentation on what I was planning, so I showed them these blog posts I had just written.
- Introduction
- Part One: Intro to REST APIs
- Part Two: Interacting with Stripe using http and cURL
- Part Three: API Keys, Property files, and Initial Setup
- Part Four: UriBuilder, HttpGet and other Apache HttpComponents
- Part Five: From JSON to Object: HttpEntity and GSON
- Source Code: GitHub, T.J. Maher
Feb 2016 - March 2016
- Introduction
- Part One: Intro to REST APIs
- Part Two: Interacting with Stripe using http and cURL
- Part Three: API Keys, Property files, and Initial Setup
- Part Four: UriBuilder, HttpGet and other Apache HttpComponents
- Part Five: From JSON to Object: HttpEntity and GSON
- Source Code: GitHub, T.J. Maher
Automate Amazon
Dec 2015 - Jan 2016
How to develop a rudimentary framework to create automated tests for Amazon. Selenium WebDriver + Java + TestNG, based on work doing at Fitbit Boston.
- Introduction
- Setup a Development Environment
- Sketch Out a Use Case
- Common Utility Methods
- Writing a Sign In Test
- Product Enums, Product Objects, and Pojos
- Initialize Cart and Login
- Writing the Shopping Cart Test
Testing The-Internet
June - July 2015
Selenium WebDriver + Java demonstrating refactoring out common utilities such as logging and error handling, getting page titles, getting URLs, and sending keys, similar to what we were using at Fitbit Boston. Web locators stored in Page Objects.
Writing automated tests versus Dave Haeffner's Login page on his test site, The-Internet.
- Step One: Sketch out the simple manipulation of a Login page
- Step Two: Draft Common Utilities
- Step Three: Storing Constants: static finals vs enums
- Step Four: Storing Locators for Web Elements
- Step Five: The Page Object Model
- Step Six: Writing the Automated Test