how it works

A passing test can still miss a bug.

Write a test for a working practice app. Press Run tests to check whether it passes there. Press Verify to check whether it catches a bug added on purpose. The result shows what your test caught or missed.

We break the app on purpose

Verify first checks your code for issues that prevent grading. Then your test must pass on the working app. Next, it runs against app copies with something broken on purpose. Each copy changes a required behavior and is checked separately. Your test must fail because it detects the bug. If it still passes, the result names the bug it missed.

Use Playwright, Cypress or Selenium

A framework provides commands for writing tests. Every problem supports Playwright, Cypress and Selenium. You can practise the same check with each framework. The browser editor supports a limited set of commands. Open its API reference to see which commands you can use.

Check for flaky tests

A flaky test can pass or fail without an app change. Debug exercises use Grade to repeat your tests and change their order. Your tests must pass each run, including the reverse order. These exercises also reject fixed sleeps. A fixed sleep pauses for a set time instead of waiting for a result.

Review the code behind a passing test

Each run includes a code review. It flags issues such as weak selectors, fixed sleeps and missing assertions. A selector finds an element on the page. An assertion checks that the result is correct. Read each finding and its line reference before changing your code.

Write and run tests in your browser

The practice workspace has a code editor, an app preview and test results. Nothing needs to be installed. Use a laptop or desktop so the editor has enough room. You can read the guides and answer interview practice questions on your phone.

Try a practice problem

Start with the free Foundations lessons or a free practice problem. You do not need an account to run or verify your tests.