#Testing
16 posts
Python Testing #7: Running Tests in CI — People Forget, Machines Don't
Build a CI workflow that runs pytest automatically with GitHub Actions. Covers uv caching, a Python version matrix, coverage comments on PRs, pre-commit, and separating slow tests to wrap up the series.
Python Testing #6: Test Design — Good Tests and How to Read Coverage
Test design fundamentals from the AAA pattern and behavior-driven tests to test double terminology, dealing with flaky tests, and reading pytest-cov coverage numbers the right way.
Python Testing #5: Testing the Outside World — Files, HTTP, Databases, and Web Frameworks
A test that mocks everything guarantees nothing about real behavior. A strategy for testing the outside world: write real files with tmp_path, block only the network boundary with respx, and reset databases with transaction rollbacks.
Python Testing #4 mock and monkeypatch: Controlling What You Can't Control
How to pin down dependencies that change on every run — time, randomness, external APIs — with monkeypatch and unittest.mock, including the patch-path trap and where over-mocking begins.
Python Testing #3 parametrize and Markers: Multiply Cases, Run Selectively
How to collapse input-only test variations into one case table with @pytest.mark.parametrize, and run only the tests you want using skip, skipif, xfail, custom markers, and the -m and -k options.
Python Testing #2 Fixtures: Injecting Setup and Teardown
How to inject test setup code with @pytest.fixture — yield teardown, scope trade-offs, sharing via conftest.py, and built-in fixtures like tmp_path.
Python Testing #1 Getting Started with pytest: Why One assert Is All You Need
How to install pytest and write your first test with a single assert — plus how it differs from unittest, how to read failure output, and the test discovery rules.
Testing #6 E2E with Playwright and CI Integration — Closing the Track
The track's finale. E2E verifies real user flows in a real browser. Playwright setup, where locators fit, the page object pattern in brief, GitHub Actions CI integration, coverage reports, and a recap of all six posts.
Testing #5 — User Events and Form Tests: Where userEvent Belongs
All about user input and form submission. The difference between userEvent and fireEvent, the patterns of type/clear/click/keyboard/upload, form tests on top of React Hook Form, validation error scenarios, and what a form test should really verify.
Testing #4 — Async and Network Mocking with MSW
The post for components that fetch data. When to use findBy and waitFor, why we intercept the network layer with MSW instead of mocking fetch directly, writing handlers and happy-path / error-path scenarios, and the common async pitfalls.
Testing #3: React Testing Library — See Like a User
RTL's philosophy and your first component test. Where render and screen fit, the priority order of queries like getByRole/getByLabelText/getByText, why you don't reach for querySelector, and how jest-dom matchers help.
Testing #2 — Vitest Setup and Your First Unit Test (describe / it / expect)
Wire Vitest into a project and write your first test against the simplest possible function. The Jest comparison takes one paragraph — the real focus is the meaning of describe/it/expect, watch mode, where vitest.config.ts lives, and the small wrinkles between your first failure and your first pass.