Why it matters

Every later milestone builds on this. A project anyone can clone and run with one command is the first thing a reviewer or interviewer tries.

What to build

  1. Choose your stack. Pick one tool, one language and one test runner, and stick with them for all nine milestones. Common choices are below; any of them works with DojoCover.
  2. Create the repository. Start a Git repository with a .gitignore for your language and a short README.md that says what the project is.
  3. Lay out the folders. Separate tests from the code that supports them. You will fill these in over the next milestones.
  4. Create a practice account. Register at DojoCover with made-up details. Save the user IDs it shows you: they are not shown again.
  5. Write the first test. Open https://testdojo.dev/cover/login, sign in as your -customer user, and check that the dashboard greets you by the name you registered with.
ToolLanguageTest runnerBuild or package tool
SeleniumJavaTestNG or JUnit 5Maven or Gradle
SeleniumPythonpytestpip with a virtual environment
SeleniumC#NUnit or xUnitdotnet
PlaywrightTypeScript or JavaScriptPlaywright Testnpm
PlaywrightPythonpytest with pytest-playwrightpip
PlaywrightJava or C#JUnit 5, NUnit or MSTestMaven or dotnet

A typical layout to grow into (names vary by language):

your-framework/
  README.md
  config/        settings for each environment
  pages/         page objects and component objects (milestone 3)
  api/           API client (milestone 5)
  data/          test data files (milestone 7)
  utils/         waits, helpers, reporting
  tests/         the tests themselves

Rules

  • Don't commit your password. For now read it from an environment variable such as DOJO_PASSWORD; milestone 2 turns this into proper configuration.
  • Use the tool's own browser setup (Selenium Manager, or npx playwright install), not a driver file committed to the repo.
  • Keep the first test small: sign in and check one thing.

Hints

Selenium

Find the fields by their IDs (login-username, login-password, login-submit), then wait for the URL to end in /dashboard before checking [data-testid=user-name]. DojoCover is a single-page app, so the page doesn't reload: wait for the new screen, not for a page load.

Playwright

Use page.goto, fill and click, then expect(page).toHaveURL(/dashboard/) and expect(page.getByTestId("user-name")).toHaveText(...). Playwright waits for each element automatically.

These are pointers, not solutions. TestDojo doesn't publish a finished framework: the point is that you build and understand your own.

Done when

Ticks are saved in this browser only, for your own tracking.

In an interview

Questions this milestone prepares you for, and what a good answer covers. Answer them in your own words, about your own framework.

Why did you choose this tool and language?
What the team or job uses, the tool's strengths (Selenium: many languages and browsers, a W3C standard; Playwright: auto-waiting, tracing, fast parallel runs), and what you would weigh up for a real project.
How is your project organised?
Tests kept apart from page objects, API code, data and configuration, and why that separation makes changes cheaper.
How do you keep credentials out of the code?
Environment variables now, a config layer and CI secrets later, and never committing them.

Note the decision you made in this milestone and why. Those notes become your README in milestone 9.