Interview Insights · Automation Tester
How I Spot a Copy-Pasted Automation Tester Project in Minutes
Quick summary — Copied projects
Copying a framework is not the problem; being unable to explain it is. Many automation testers learn by following tutorials, and that is fine. The trouble starts when the tutorial project goes on the resume unchanged, and the candidate cannot explain the code inside it. I do not need to read the whole repository. I ask about one utility class, one wait, one design choice and one failure. Copied projects fall apart on at least one of those. Owned projects get more interesting with each question.
In this guide you will learn:
- The repository signs that suggest a project was copied
- The questions about core classes that reveal ownership quickly
- Why design decisions are the hardest thing to fake
- How to make a tutorial project your own with real changes
- A checklist to test your own project before the interview
SECTION 01What the repository tells me before I ask anything
If a candidate shares a GitHub link, I spend a minute on it before the interview. I am not judging code quality yet. I am looking for signs of how the project was made. A single commit called 'initial commit' containing a full framework, a README copied from a tutorial, or a target site that every tutorial uses are all hints, though none is proof on its own.
These signs are not reasons to reject. They are reasons to ask more questions. A candidate who built on a tutorial and extended it will have good answers.
| Repository sign | What it might mean | Question I ask | Good answer sounds like |
|---|---|---|---|
| One large initial commit | Uploaded all at once from elsewhere | How did the framework grow over time? | I started with one test, then added POM, then reports |
| Tutorial demo site as target | Followed a course step by step | What did you add beyond the course? | I added API checks and data-driven login |
| Unused classes and dependencies | Copied a template with extras | What does this ExcelUtils class do? | It was from the template; I removed it later |
| README with no run instructions | Never run by anyone else | How would I run this on my machine? | Clone, set env vars, mvn test, report in target |
# What I look at (you can run these on your own repo)
git log --oneline | head -20
# Copied: a1b2c3d initial commit
# Owned: f9e8d7c add retry-free wait for cart badge
# c6b5a4e move login locators to LoginPage
# b3a2f1e add data-driven invalid login cases
# ...
git log --stat --follow src/test/java/base/BaseTest.java
# Shows how the core class changed over time
git shortlog -sn
# Shows who committed; a single unknown author
# different from the candidate raises a question# Shop UI and API tests
Selenium 4 + TestNG + REST Assured, Java 17, Maven.
## What is tested
- Login: valid, invalid, locked user (data-driven)
- Cart: add, update quantity, remove
- Checkout API: order created, total matches cart
## Run
export APP_URL=... TEST_PASSWORD=...
mvn test # all tests, headless
mvn test -Dgroups=smoke # smoke only
Report: target/surefire-reports and ExtentReport in
target/report.html
## Known issues
- Cart badge test was flaky; fixed with an explicit
wait on the badge text (see commit c6b5a4e).
A 'known issues' section is one of the strongest ownership signals in any README. Only someone who has run the tests many times knows where they break.
SECTION 02One line of BaseTest: the fastest ownership test
Every Selenium framework has core classes: a BaseTest or driver factory, a config reader, maybe a listener for screenshots and reports. In copied projects, these are the parts the candidate has never touched, because they 'just work'. So I open one and point at a line: why is this here, what happens if I remove it?
If you built or truly studied the framework, this is an easy conversation. If you did not, it is usually where the interview turns.
| Line I point at | Copied answer | Owned answer | Why it matters |
|---|---|---|---|
| ThreadLocal<WebDriver> | It is for the driver | Each parallel thread gets its own driver instance | Shows you understand parallel runs |
| driver.manage().timeouts().implicitlyWait(...) | It makes it wait | I removed it; mixing implicit and explicit waits gives unpredictable timing | Shows real wait knowledge |
| ITestListener onTestFailure | Takes screenshot | On failure it saves a screenshot named after the test and attaches it to the report | Shows you used it to debug |
| Reading config.properties | Reads values | Defaults from file, overridden by system properties in CI | Shows you ran it in more than one place |
public class BaseTest {
public static WebDriver driver;
@BeforeMethod
public void setup() throws Exception {
System.setProperty("webdriver.chrome.driver",
"C:\\Users\\someone\\drivers\\chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30));
Thread.sleep(3000);
driver.get("...");
}
}
// Signs: static driver (breaks in parallel), hard-coded
// path from another person's machine, a 30s implicit
// wait plus a sleep, and no teardown method at all.public class BaseTest {
private static final ThreadLocal<WebDriver> DRIVER = new ThreadLocal<>();
protected WebDriver driver() { return DRIVER.get(); }
@BeforeMethod(alwaysRun = true)
public void setUp() {
ChromeOptions options = new ChromeOptions();
if (Boolean.parseBoolean(Config.get("headless", "true"))) {
options.addArguments("--headless=new");
}
options.addArguments("--window-size=1366,768");
// Selenium Manager (Selenium 4.6+) finds the driver,
// so no hard-coded chromedriver path is needed.
DRIVER.set(new ChromeDriver(options));
driver().get(Config.get("appUrl"));
}
@AfterMethod(alwaysRun = true)
public void tearDown() {
WebDriver d = DRIVER.get();
if (d != null) {
d.quit();
DRIVER.remove();
}
}
}
Every difference between the two versions is a question I might ask: why ThreadLocal, why no implicit wait, why remove() after quit(), why no driver path. A candidate who made those changes themselves will answer each one with a reason, often with a story about what broke first.
SECTION 03Decisions and failures: the parts nobody can copy
Code can be copied. Decisions and failures cannot. When I ask why you chose CSS selectors over XPath for a component, why your cart tests use API setup instead of UI clicks, or which test was the hardest to stabilise, a copied project has no story behind it. An owned one has several.
This is also the good news: you can turn a tutorial project into your own by making real decisions on top of it and recording what broke along the way.
| Change you can make | Decision it creates | Failure you will likely meet | Story you can tell |
|---|---|---|---|
| Switch to your own target site | Which flows matter on this site | Locators that change between pages | How I chose stable locators |
| Add API setup for test data | UI vs API for preconditions | Data clashes between tests | Why each test creates its own data |
| Run in parallel | Thread safety of the driver | Tests sharing a static driver | Moving to ThreadLocal |
| Run in CI headless | Config per environment | Tests passing locally but failing in CI | Window size and timing differences |
// Instead of clicking through the UI to fill a cart,
// create the cart through the API, then test the UI.
@Test
public void cartPageShowsItemsAddedViaApi() {
String token = Api.loginAndGetToken("cart_user");
Api.addToCart(token, "SKU-1001", 2);
// Reuse the session in the browser
driver().get(Config.get("appUrl"));
driver().manage().addCookie(new Cookie("auth_token", token));
driver().get(Config.get("appUrl") + "/cart");
CartPage cart = new CartPage(driver());
Assert.assertEquals(cart.quantityOf("SKU-1001"), 2);
}
// Assumes the app accepts the API token as a cookie.
// Check how your target app stores its session first.DATE TEST SYMPTOM
-------- ------------------------ -----------------------
Week 3 cartBadgeUpdates Passed locally, failed
in CI about 1 in 4 runs
WHAT I CHECKED
- Screenshot on failure: badge still showed old count
- CI uses headless with smaller default window
- Badge text updates after an async call
CAUSE
Assertion ran before the badge text changed.
FIX
wait.until(ExpectedConditions.textToBe(badge, "2"))
instead of reading the text immediately.
LESSON
Wait for the state I am asserting, not just for the
element to exist.
The failure log is not for the interviewer to read. It is for you. When I ask 'what was the hardest test to stabilise?', the candidate with a log answers instantly, with detail, because they wrote it down when it happened.
SECTION 04Make your automation project interview-proof
Use these three tabs to check your own project as an interviewer would, and to upgrade a tutorial project into something clearly yours. In Uncodemy project reviews, trainers use a very similar list.
Answer aloud, without opening the code:
[ ] How did the framework grow? First test to now.
[ ] What does each core class do? (BaseTest, Config,
Listener, DriverFactory)
[ ] Why that wait strategy?
[ ] Why those locators on the trickiest page?
[ ] How do tests get their data?
[ ] How do you run it in CI?
[ ] Which test was hardest to stabilise, and why?
[ ] What would you change if you started again?
Fewer than six confident answers: spend a weekend
on the upgrade plan before applying.WEEKEND 1
- Point the tests at a different practice site
- Rewrite locators for the new pages yourself
- Delete every class you do not use or understand
WEEKEND 2
- Add data-driven tests for one form
- Add API calls for test data setup
- Remove Thread.sleep and implicit waits
WEEKEND 3
- Make the driver ThreadLocal and run in parallel
- Run in CI (GitHub Actions or Jenkins), headless
- Write a README with run steps and known issues
Commit small and often, with clear messages.Prepare one sentence for each:
Origin: "I started from ___ and changed ___."
Scope: "It covers ___ flows on ___ site."
Design: "I used POM because ___, and ___ for data."
Stability: "The hardest test was ___ because ___."
CI: "It runs on ___ with ___ reports."
Next: "With more time I would add ___."
Six sentences, all true, all yours. That is a
project explanation no copied repository can match.
SECTION 05Habits that make a project unmistakably yours
These habits build ownership naturally while you work, so you do not need to invent it before the interview.
- Commit every meaningful change — Small commits with messages like 'replace sleep with wait for cart badge' create a history that tells your story for you.
- Delete what you do not use — Unused utilities from a template invite questions you cannot answer. Removing them is itself a decision you can explain.
- Keep a failure log — Write two lines whenever a test breaks unexpectedly. It becomes your best source of interview stories.
- Pick a less common target site — A practice site that tutorials rarely use forces you to write your own locators and solve your own problems.
- Explain it to someone weekly — Walking a friend through one class a week keeps the whole framework fresh in your memory.
SECTION 06Interview Q&A — Copied projects
Q1Is it wrong to use a tutorial framework for my project?
No, as long as you understand it fully and say where it came from. Interviewers mind when a candidate presents copied work as their own and cannot explain it. Extending a tutorial with your own target site, data handling and CI makes it genuinely yours.
Q2Why use ThreadLocal for WebDriver?
When tests run in parallel, each thread needs its own browser. A static WebDriver would be shared, so one test could close or navigate another test's browser. ThreadLocal gives each thread its own driver instance, and calling remove() after quit() avoids leaks.
Q3Why should you not mix implicit and explicit waits?
Selenium's documentation warns that mixing them can cause unpredictable wait times, because both mechanisms can apply to the same lookup. I use explicit waits for specific conditions and keep implicit wait at zero.
Q4How do you set up test data for UI tests?
Where possible I create data through APIs before the UI test, such as adding items to a cart, because it is faster and more reliable than clicking. Each test creates its own data so tests do not affect each other.
Q5What was the hardest test to stabilise in your project?
Answer with a real example from your failure log: the symptom, what you checked, the root cause and the fix. For example, a cart badge assertion that ran before an async update finished, fixed by waiting for the expected text.
SECTION 07Test yourself — Copied projects quiz
Five questions. No sign-up.
0 / 5Pick an answer to see why it is right or wrong.
SECTION 08Frequently asked questions
Can interviewers tell if a Selenium project is copied?
Often, yes. A few questions about core classes, wait choices, locator decisions and failures usually show whether the candidate built or studied the project deeply. Git history and README quality add further clues.
How do I make my automation testing project unique?
Use a less common practice site, write your own locators, add data-driven and API-supported tests, run in parallel and in CI, and document known issues. Commit small changes regularly so your history shows the work.
What should a Selenium framework project include?
A clear structure with page objects, a driver setup that supports parallel runs, config handling for environments, explicit waits, reporting with screenshots on failure, a README with run steps, and CI integration.
Should I put my automation project on GitHub?
Yes, if you can explain everything in it. Keep it clean, with a useful README and small meaningful commits. Never commit real passwords or keys; use environment variables instead.
What questions are asked about automation frameworks in interviews?
Expect questions on framework structure, page objects, driver management, waits, locators, test data, reporting, parallel execution, CI integration, and the hardest problems you faced while building it.
Where can I practise Automation Tester interview answers with expert feedback?
Yes. Uncodemy's Automation Testing Training Course in Noida (classroom and online) includes live projects, one-to-one mock interviews and resume reviews, so you practise Automation Tester interview answers with trainer feedback before the real interview. You can book a free demo class from this page to see how the sessions work.
SECTION 09Related reads
Classroom & online · Noida
Build an automation framework you truly own
Our Automation Testing Training Course guides you through building Selenium and API frameworks step by step, with your own target apps, CI runs and project reviews, so every line is one you can explain.
Talk to a counsellor for current fees- Build your own framework
- Selenium, TestNG & REST Assured
- CI and parallel runs
- Project review sessions