ProvaLab Blog
Testing, security and load testing for teams that write code with AI agents.
Subscribe via RSSTwo free PDFs: the whole of each series, to read offline or print
Testing Basics (23 parts) and Hands-On Testing (7 parts), with every diagram.
· 12 min read
k6 in practice: open vs closed models, per-endpoint thresholds, checks that count, and finding the limit
Hands-on: a k6 test passed at 60 users while the API managed only 46 of the 60 orders a second. Open-model scenarios, tagged thresholds, checks that fail a run, and a ramp to the limit.
Read the post· 12 min read
ZAP in practice: scanning behind a login with the Automation Framework, failing the build, and what no scanner finds
Hands-on: a ZAP scan that never signed in missed the XSS behind the login. We fix that with an Automation Framework plan, triage 3 alerts that are 1 bug, fail CI on High, and test what ZAP can't.
Read the postTesting in Practice · Part 18
· 10 min read
Cross-browser testing (hands-on): Chromium, Firefox and WebKit, and two bugs only Safari users would see
Run the same tests on three browser engines with Playwright. A real run in the official Docker image: a cut-off button and a broken feature only in WebKit, and an old Safari trap that's gone.
Read the postTesting in Practice · Part 16
· 12 min read
Flaky tests (hands-on): measure them, reproduce them, fix the cause, and the one that was a real bug
Find and fix flaky tests with pytest. A real 100-run measurement finds four causes: shared state, timing, the clock and randomness. Retries made it worse, and one flaky test was a real bug.
Read the postTesting in Practice · Part 15
· 13 min read
Localization testing (hands-on): Hindi, German and Arabic, pseudo-localization, and 16 failures on one page
Test an app in other languages with Playwright and pytest: pseudo-localization, text that doesn't fit, Indian and German number formats, ambiguous dates, Arabic plurals and right-to-left.
Read the postTesting in Practice · Part 17
· 9 min read
Property-based testing with Hypothesis (hands-on): seven examples passed, three bugs found, and one property that lied
Describe what must always be true and let Hypothesis find the inputs that break it. A real run on FoodNow's money code: three bugs, shrunk to the smallest input, and two honest limits.
Read the post· 14 min read
pytest in practice: fixtures, parametrize, raises, markers and the plugins worth knowing
Hands-on: a six-test pytest suite with 81% coverage caught none of three bugs. We rebuild it with parametrize, raises with match, fixtures, monkeypatch, strict markers and coverage.
Read the postTesting in Practice · Part 8
· 13 min read
BDD with pytest-bdd (hands-on): Given/When/Then, and the question that wasn't a bug
Behaviour-driven development explained with FoodNow's checkout pricing. A real pytest-bdd run finds two planted bugs and a rule nobody agreed on, plus two traps.
Read the postTesting in Practice · Part 7
· 15 min read
Contract testing with Pact (hands-on): the API change both teams' tests missed
Contract testing explained with Pact and pytest on a FoodNow app and its orders API. A real run: an API change passes the API team's tests, and Pact catches it, plus a lost tip.
Read the postTesting in Practice · Part 12
· 13 min read
Your first Cypress test (hands-on): retrying assertions, cy.intercept, and a test that passed too early
Write a first Cypress test for a FoodNow order page. A real run finds three bugs, two of them only by faking the network with cy.intercept, and a race test that passed on the buggy page.
Read the postTesting in Practice · Part 11
· 11 min read
Your first Selenium test (hands-on): Python, pytest, and the two errors every beginner hits
Write a first Selenium WebDriver test in Python with pytest. A real run hits a blocked click and a total read too early, then finds a planted bug. Plus how it compares with Playwright.
Read the postTesting in Practice · Part 6
· 13 min read
Mobile app testing with Appium and pytest (hands-on): rotation, crashes and the button you can't reach
Test an Android app on an emulator with Appium and pytest. A real run finds three bugs a web test never would: a tip lost on rotation, a crash, and a Pay button off screen.
Read the postTesting in Practice · Part 5
· 11 min read
Test doubles (hands-on): mocks, stubs, fakes and spies, and how a mock lets a real bug through
Dummy, stub, spy, mock and fake, explained with one payment example. A real run: MagicMock tests pass with two bugs in the code, then fail when the code is fixed.
Read the postTesting in Practice · Part 13
· 12 min read
Test estimation (hands-on): three-point estimates, a 100,000-run simulation, and why adding up 'most likely' fails
How to estimate testing from the work, not a guess. Three-point estimates, a simulation and past results show why the sum of 'most likely' times is met only 9% of the time.
Read the postTesting in Practice · Part 14
· 13 min read
The test summary report (hands-on): 96.8% passed, not ready to release, and the metrics that tell you why
How to write a test summary report people can decide from. A real report built from five suites' results: a 96.8% pass rate, two high-risk gaps, and a test that fails every night.
Read the postTesting in Practice · Part 4
· 14 min read
Testing database changes (hands-on): transactions, race conditions and migrations with SQL and pytest
What to check when code writes to a database. A real PostgreSQL run: a refused order that still saves, 20 customers buying 10 wraps, and a migration that fails on real data.
Read the postTesting in Practice · Part 10
· 13 min read
Usability testing (hands-on): a heuristic review, five users, and the form that threw away a correct address
How to find what makes users give up: a heuristic review of a real form, measured tap targets, why five users is enough (and when it isn't), and SUS scoring.
Read the postTesting in Practice · Part 9
· 14 min read
User acceptance testing (hands-on): plan, dry run and sign-off, and the bug only the UAT server had
How to plan and run UAT so it isn't a rubber stamp. A real dry run on a UAT-like server finds a time-zone bug that passed every system test; a script checks the exit criteria.
Read the postTesting in Practice · Part 1
· 13 min read
Accessibility testing for beginners: WCAG 2.2, an axe scan and keyboard tests (hands-on)
What accessibility testing checks, what WCAG 2.2 A and AA mean, then a real run: axe-core, a keyboard test and a screen-reader names test catch planted bugs on a checkout page.
Read the postTesting in Practice · Part 2
· 12 min read
API testing with Postman and Newman (hands-on): tests, variables, a CSV of boundary values, and CI
Build a Postman collection with tests and chained variables, run it from the command line with Newman, then drive it from a CSV of boundary values that catches a real bug.
Read the postTesting in Practice · Part 3
· 10 min read
Visual regression testing with Playwright (hands-on): screenshots, baselines, masks and thresholds
Catch the layout bugs functional tests can't see. A real run: a one-line CSS change breaks a checkout page, every functional test passes, and a Playwright screenshot test catches it.
Read the postHands-On Testing · Part 7
· 8 min read
Your first load test with k6 (hands-on): find where your API slows down
Write and run a k6 load test against the API from Part 4, set pass/fail thresholds, read the summary, then run a stress test to 1,000 users and find where it slows, with the real output.
Read the post· 10 min read
Playwright with Python in practice: fixtures, page objects, saved state, mocked APIs and parallel runs
Hands-on: grow three Playwright tests into a real suite with page objects, pytest fixtures, saved browser state, an API mocked with page.route, and a parallel run that more than halves the time.
Read the post· 10 min read
50 software testing interview questions, with short answers and where to read more
The questions QA and test automation interviews actually ask, grouped by topic, each with a two-sentence answer and a link to the full explanation in our Testing Basics and Hands-On series.
Read the postHands-On Testing · Part 3
· 7 min read
API testing explained: what it is, why test the API before the UI, and what to check
What an API is and how API tests work, why they are faster and more stable than UI tests, the five things to check in every response, the kinds of API tests, and the tools teams use.
Read the postTesting Basics · Part 7
· 6 min read
Test design techniques: black-box, white-box and grey-box testing
The three ways of looking at software when you design tests, and the techniques for each, from boundary values and state transitions to statement and branch coverage.
Read the postTesting Basics · Part 10
· 5 min read
The bug life cycle explained: from New to Closed (and Reopened)
Every status a bug passes through, who moves it at each step, the side exits like Duplicate and Deferred, one bug followed from start to finish, and the habits that keep a bug tracker healthy.
Read the postTesting Basics · Part 22
· 6 min read
Exploratory testing explained: charters, sessions and heuristics
What exploratory testing is and isn't, how session-based testing works, how to write a charter, the heuristics skilled testers use to generate ideas, and how to report what you found.
Read the postHands-On Testing · Part 4
· 8 min read
Your first API tests in 15 minutes (Python, pytest and requests)
Build a tiny discount API you own, then write eleven pytest tests against it: functional, contract, negative, authentication and authorisation checks, with the real output and a planted bug.
Read the postTesting Basics · Part 5
· 5 min read
Your first automated test in 15 minutes (Python + pytest)
A hands-on, step-by-step guide to writing and running your first automated tests with Python and pytest, including what a failing test looks like and how to read it.
Read the postHands-On Testing · Part 2
· 7 min read
Your first Playwright test in 15 minutes (Python)
Install Playwright for Python, write three browser tests against a real website, run them headless, break one on purpose and read the failure, record a trace, and run the suite in CI.
Read the postHands-On Testing · Part 6
· 9 min read
Your first security scan with OWASP ZAP (hands-on)
Run a real DAST scan with OWASP ZAP against the API from Part 4, read the report, plant a SQL injection and watch the scanner find it, triage the findings, fix the bug and re-scan.
Read the post· 3 min read
How do you test code your AI coding agent wrote?
AI agents write features in minutes, but most teams still check that code the old way. Here is a practical way to verify AI-written code before it ships.
Read the postTesting Basics · Part 9
· 5 min read
How to write a good bug report (with template and examples)
What makes a bug report easy to act on, every field to include, severity vs priority explained, a good and a bad example side by side, and a copy-ready template.
Read the postTesting Basics · Part 8
· 5 min read
How to write a test plan (with a one-page example)
What a test plan is, the sections every plan needs, a one-page example you can copy, risk-based testing, and how test plans work in agile teams.
Read the postTesting Basics · Part 6
· 5 min read
How to write good test cases: template, examples and techniques
What goes into a test case, a ready-to-use template with real examples, the techniques testers use to pick the right cases, and the mistakes to avoid.
Read the postTesting Basics · Part 12
· 6 min read
Integration testing explained: approaches, stubs, drivers and examples
What integration testing is, why bugs hide where components meet, the big bang, top-down, bottom-up and sandwich approaches, stubs and drivers, and what to check at every integration point.
Read the postTesting Basics · Part 3
· 5 min read
Manual vs automated testing: what to automate, and what not to
When a person should test and when a machine should, how to decide what to automate, what automation really costs, and the tools teams use.
Read the post· 7 min read
MCP, plugins and skills, explained: how AI agents use ProvaLab
What MCP is, how Claude Code plugins and skills fit around it, what changed in the new stateless MCP, and how your coding agent can use ProvaLab through it.
Read the postTesting Basics · Part 16
· 7 min read
Performance testing and its types: load, stress, spike, soak, volume and scalability
What performance testing is, the six main types and when to use each, the metrics that matter (and why averages lie), how to run a performance test step by step, and the common mistakes.
Read the postTesting Basics · Part 20
· 6 min read
QA vs QC vs testing, and verification vs validation, explained
The difference between quality assurance, quality control and testing, and between verification and validation, with simple definitions, examples, the V-model, and comparison tables.
Read the postTesting Basics · Part 15
· 6 min read
Regression testing vs re-testing: what they are and why we do both
Why every bug fix needs re-testing, how regression testing catches what a change broke elsewhere, the differences between them, how to choose regression tests, and how to keep a regression suite fast.
Read the postTesting Basics · Part 11
· 6 min read
The requirements traceability matrix (RTM): prove everything is tested
What a traceability matrix is, how to build one step by step, forward and backward traceability, how to measure coverage, and how it answers "are we ready to release?"
Read the postHands-On Testing · Part 5
· 8 min read
Security testing basics: the OWASP Top 10 (2025) in plain language
What security testing is, the ten risks in the OWASP Top 10 2025 explained with everyday examples, the six kinds of security testing and which tools do them, and the checks you can add this week.
Read the postTesting Basics · Part 19
· 6 min read
The 7 principles of software testing, explained with examples
The seven testing principles from the ISTQB syllabus in plain language, each with a real-world example and what it means for how you test day to day.
Read the postTesting Basics · Part 14
· 5 min read
Smoke testing vs sanity testing: the difference, with examples
What smoke testing and sanity testing are, how they differ, when to use each, example checklists for a real app, and how to automate them.
Read the postTesting Basics · Part 4
· 6 min read
The Software Testing Life Cycle (STLC): all six phases explained
The six phases of the STLC in plain language, with what goes in and comes out of each, entry and exit criteria, how STLC fits the SDLC, and how it works in agile teams.
Read the postTesting Basics · Part 21
· 7 min read
Static testing explained: reviews, walkthroughs, inspections and static analysis
How to find defects without running the software: the four types of review, the review process, static analysis tools with a real example, and why static testing is the cheapest testing there is.
Read the postTesting Basics · Part 13
· 6 min read
System testing explained: testing the whole product, end to end
What system testing is, how it differs from integration and acceptance testing, its functional and non-functional types, example test cases, and how to do it well.
Read the postTesting Basics · Part 18
· 7 min read
Test coverage explained: the types, and how to calculate each one
The main kinds of test coverage (requirement, execution, code and platform), the formula for each with worked examples, sensible targets, and why 100% coverage isn't bug-free.
Read the postTesting Basics · Part 17
· 6 min read
Test runs and test results explained: statuses, pass rates and how to read them
What a test run and a test result are, how they relate to test cases, every result status, how to calculate pass rates correctly, and how to read a run so nothing important is missed.
Read the postTesting Basics · Part 23
· 8 min read
Testing in agile and CI/CD: how it all fits together
How testing works when a team ships every week or every day: whole-team quality, the agile testing quadrants, shift-left and shift-right, TDD and BDD, and testing at every stage of a CI/CD pipeline.
Read the postTesting Basics · Part 2
· 5 min read
Types of software testing explained: unit, integration, system and acceptance
The four levels of software testing in plain language, with one running example, plus the testing pyramid and the other testing words you will hear at work.
Read the postHands-On Testing · Part 1
· 8 min read
UI testing explained: what it is, how it works, and Selenium vs Playwright vs Cypress
What UI testing is and what it's for, how a browser test actually works, how to choose locators that don't break, why UI tests go flaky, and an honest comparison of Selenium, Playwright and Cypress.
Read the postTesting Basics · Part 1
· 5 min read
What is software testing, and why does every team need it?
A plain-language introduction to software testing: what it is, what it checks, when it happens, who does it, and the myths that trip teams up.
Read the post