CAREER GROWTH

Building a Test Automation Portfolio That Gets Interviews

Most test automation portfolios I've reviewed share the same problem: they're collections of passing tests, not demonstrations of engineering judgment. A recruiter or hiring manager opening your GitHub repo doesn't want to count your assertions — they want to see that you understand why a suite is structured a certain way, what tradeoffs you made, and whether you can own a framework end-to-end. That distinction is what separates a portfolio that gets a callback from one that gets a polite no-reply.

I've seen testers with genuinely strong skills get passed over because their public work looked like tutorial exercises — a flat folder of test files, no fixtures, no configuration management, no CI pipeline. And I've seen candidates with less raw experience land senior roles because their repo told a coherent story: here's the problem, here's the architecture I chose, here's how it runs in CI, here's what I'd do differently next time. Presentation of thinking is the actual interview, and your portfolio is round one.

This article is a practical guide to building that kind of portfolio from scratch — or refactoring the one you already have into something that earns a second look. We'll cover what projects to build, how to structure and document them so the design decisions are visible, and how to avoid the common mistakes that quietly disqualify otherwise strong candidates.

Build an API Automation Framework in Python

Learn Python, Behave, GitHub Copilot, APIs, and CI/CD by building a real framework you can finish in a weekend.

Learn more

What Projects Actually Belong in a Test Automation Portfolio

The first mistake people make is picking projects based on what's easy to test rather than what demonstrates range. A portfolio with three nearly identical REST API test suites against public "todo" APIs tells a hiring manager almost nothing new after the first one. You want a small number of projects — two or three is enough — that each demonstrate a distinct capability.

Here's a framework I use when advising people on project selection. Think in terms of three axes: API complexity, framework design, and operational maturity. A strong portfolio has at least one project that scores high on each axis, and ideally one project that scores high on all three.

  • API complexity: Does your project test something non-trivial? Authentication flows (OAuth2, JWT refresh), paginated endpoints, webhook callbacks, or multi-step transactional sequences all signal that you've dealt with real-world messiness. Testing GET /users and asserting a 200 is not a portfolio piece.
  • Framework design: Is there actual architecture visible — a clear separation between test logic and HTTP client wrappers, reusable fixtures, a configuration layer that handles multiple environments? If someone can read your conftest.py and understand your design philosophy in five minutes, that's a good sign. If it's a 400-line file with no clear structure, that's a red flag. When I'm building something I want to show off, I follow the same patterns I'd use for production-ready test automation frameworks — not because it's overkill for a portfolio project, but because it proves you know the standard.
  • Operational maturity: Does the suite actually run somewhere other than your laptop? A GitHub Actions workflow that runs your tests on every push is table stakes at this point. Bonus points for environment-specific config, test reporting artifacts, and a badge in the README showing the last build status.

A concrete project I'd recommend to almost anyone starting out: pick a public API with real authentication (Spotify, GitHub, or any OAuth2-protected API), build a Python + pytest suite that covers happy path, error handling, and at least one multi-step flow, wrap the HTTP calls in a client class, use environment variables for credentials, and wire it to GitHub Actions. That single project, done well, demonstrates more than ten shallow ones.

If you want to show BDD fluency — which is increasingly relevant for teams that involve product owners in test design — add a second project using Behave with a clear Gherkin layer on top of the same kind of API client. The key is that the feature files read like specifications, not like test code with cucumber syntax bolted on. Understanding that distinction is what BDD test automation with Behave and pytest is really about, and a hiring manager who knows the space will spot the difference immediately.

How to Structure and Document Your Repos So Design Decisions Are Visible

Code is only half of what a reviewer reads. The other half is structure and documentation — and this is where most portfolios fall apart silently. A repo with good tests and a missing or one-line README is a missed opportunity. The README is your cover letter for that project, and it needs to answer three questions within the first thirty seconds of reading: what does this test, why is it designed this way, and how do I run it?

Here's the README structure I use for portfolio projects:

  1. One-paragraph project summary. What API or system is under test, what the suite covers, and what the primary design goal was (e.g., "demonstrates layered architecture with a reusable API client, environment-based config, and CI integration").
  2. Architecture overview. A short section — even just a bullet list — explaining the folder structure and why it's organized that way. If you have a clients/ directory with HTTP wrappers, say so and explain why you separated it from the test layer. If you use a base test class or shared fixtures, call that out.
  3. Setup and run instructions. Exact commands. Don't assume. A hiring manager who can't get your suite running in five minutes will move on.
  4. What you'd do differently. This one surprises people, but it's powerful. A short "Known limitations / future improvements" section shows self-awareness and engineering maturity. It signals that you understand your own tradeoffs, which is exactly the mindset senior engineers look for in a collaborator.

On folder structure: consistency matters more than any specific convention, but there are patterns that read as professional. A layout like this is immediately legible to most Python automation engineers:

project-root/
├── clients/          # HTTP client wrappers
├── tests/
│   ├── conftest.py   # shared fixtures
│   ├── test_auth.py
│   └── test_orders.py
├── config/           # environment configs
├── .github/
│   └── workflows/    # CI pipeline
├── requirements.txt
└── README.md

What makes this structure legible isn't just the folders — it's that each layer has a clear responsibility. The clients/ layer knows about HTTP; the test files know about assertions and scenarios; the fixtures in conftest.py handle setup and teardown. That separation is the core of test automation architecture that holds together at scale, and demonstrating you understand it — even in a small project — is a meaningful signal.

One more documentation habit that pays off: inline comments that explain why, not what. A comment that says # retry on 429 to handle rate limiting in CI tells a reviewer something real about your experience. A comment that says # call the login endpoint above a function named login() adds nothing. Reviewers notice the difference.

Common Portfolio Mistakes That Quietly Kill Your Chances

Beyond the structural advice, there are specific patterns I see repeatedly in portfolios that otherwise have decent test coverage but still don't land interviews. These are worth calling out directly because they're not obvious until someone points them out.

Hardcoded credentials and URLs. This is the most common red flag, and it's an immediate disqualifier for any security-conscious team. If your repo has a literal API key, base URL, or password anywhere in the source files — even in a comment — it signals that you don't practice the basics of secrets management. Use environment variables and a .env.example file. Add .env to your .gitignore. Make it obvious in the README how to configure credentials. This is a five-minute fix with a large signal.

Tests that only test the happy path. A suite that only asserts 200 responses and valid JSON bodies looks like a tutorial, not a professional test suite. Real API testing means covering 4xx responses, malformed inputs, missing required fields, and boundary conditions. You don't need exhaustive coverage — you need enough to show that you think about failure modes. A test named test_create_user_with_missing_email_returns_400 communicates more about your instincts than ten test_get_user_success tests.

No CI, or a CI pipeline that never actually runs. A .github/workflows/ folder with a broken or empty YAML file is worse than no CI at all — it looks like you copied a template without understanding it. If you add CI, make it run. Make it pass. Pin your Python version. Cache your dependencies. A green badge in the README is a small thing that reads as professional diligence.

Copying tutorial code without adapting it. Hiring managers who do a lot of technical screening have seen every popular pytest tutorial. If your conftest.py looks like it was lifted directly from a blog post, that's noticeable. The fix isn't to make it unrecognizable — it's to extend it. Add a fixture that actually reflects a real design decision you made. Change the structure to fit your project's needs. Show that you understand the code well enough to modify it, not just run it.

No evidence of iteration. A portfolio project with a single commit labeled "initial commit" and no subsequent changes looks abandoned. Real projects evolve. Even if you built it in a weekend, break the work into logical commits: add the client layer, add fixtures, add CI, add error-case tests. Your commit history is a secondary signal about how you work, and a thoughtful one is worth having.

The underlying theme across all of these: hiring managers are trying to answer one question — "would I trust this person to own a test framework on my team?" Everything in your portfolio either builds or erodes that trust. The good news is that the bar for standing out is genuinely low, because most portfolios ignore these basics entirely. A well-structured repo with honest documentation, real design decisions, and a running CI pipeline puts you in a small minority, and that's exactly where you want to be when someone is deciding who to call.