1. Home
  2. Blog
  3. Custom Software

Custom Software

How to Do Software Testing: A Step-by-Step Course from Test Cases to Bug Reports

How to do software testing? Test types, writing test cases, boundary value analysis, decision tables, bug reports and test metrics, taught with worked examples.

Contents 12 sections
  1. What Is Software Testing?
  2. How Should You Use This Guide?
  3. Lesson 1: What Are the Types of Software Testing?
  4. Lesson 2: How Do You Write Test Scenarios and Test Cases?
  5. Lesson 3: How Do You Apply Boundary Value Analysis and Equivalence Classes?
  6. Lesson 4: How Do You Test Rule Combinations with a Decision Table?
  7. Lesson 5: How Do You Write a Good Bug Report?
  8. Lesson 6: What Are Regression Testing and Test Automation?
  9. Lesson 7: How Do Test Metrics Support the Release Decision?
  10. What Are the Most Common Software Testing Mistakes?
  11. Software Testing with İnovabil
  12. Frequently Asked Questions

The software goes live, and on day one a dealer orders 501 units and the system accepts it, even though the warehouse can ship 500 at most. Or the invoices add up wrong at month end, or nobody can finish an order on a phone. Such bugs look fine to the author, who uses the software the way they know it works, while customers use it in ways nobody expected. Software testing is the work of finding that gap before customers do.

In this guide we answer how to do software testing step by step, using one example screen, from test types to bug reports and the release decision. It works like a short course: seven lessons, each explaining a concept, showing it with an example and ending with a small exercise for your own project. You don't need a technical background to follow it.

Key ideaTesting is not proving the software works; it's trying to find where it doesn't. A test that finds no bugs may show not that the software is flawless but that the test wasn't hard enough. Good testing thinks of the use the author never imagined.

What Is Software Testing?

Software testing is the process of checking, with predefined scenarios, whether software behaves as expected, and recording where it doesn't as bugs. Its purpose is to find defects before users do and to base the release decision on data.

Two terms are often confused. A defect (bug) is a flaw in the software or its design; a failure is that flaw showing up in front of a user while the software runs. Testing means triggering the failure before the user does, in order to find the defect.

Testing can show that defects exist but cannot prove they don't, and trying every combination is impossible. So good testing isn't trying everything; it's choosing, cleverly, the cases most likely to reveal bugs. The lessons below teach exactly that.

Recommended reading: Our custom software development service

How Should You Use This Guide?

Follow the lessons in order. Every example tests the same screen: the order screen of a manufacturer's dealer portal. The rules: a dealer orders by product code; quantity per line must be between 1 and 500; the order total must be at least ₺1,000; orders of ₺10,000 or more get an extra 5% discount; an inactive dealer cannot order. Amounts and rules are illustrative.

LessonTopicWhat you will be able to do
1Test types and the test pyramidKnow which bug is caught by which test, and how cheaply
2Writing test scenarios and test casesWrite a test anyone else can run
3Equivalence classes and boundary value analysisTest with a few clever values instead of hundreds
4Decision tablesTest rule combinations completely and simply
5Writing bug reportsWrite a report a developer understands on first read
6Regression and automationCheck that a change hasn't broken what worked
7Metrics and the release decisionAnswer "can we ship?" with numbers

Lesson 1: What Are the Types of Software Testing?

Test types depend on which layer is being checked: unit tests check the smallest piece of code, integration tests check that parts work together, system tests check the whole application, and acceptance tests check that it meets the business need. Non-functional tests (speed, security, usability, compatibility) come on top.

Test typeWhat it checksWho does itDealer portal example
Unit testA single function or piece of codeDeveloperDoes the discount function apply 5% at exactly 10,000?
Integration testParts and systems working togetherDeveloper, testerDoes an order reach the ERP with the right amount and product code?
System testEnd-to-end behavior of the whole applicationTesterLog in, pick a product, place an order, see it in history
Acceptance testThat the software meets the business needCustomer, business unitA real dealer places a real order through the portal
Performance testSpeed and resilience under loadTesterWhat happens when hundreds of dealers order at once on a campaign morning?
Security testUnauthorized access and data leaksTester, security specialistCan one dealer see another dealer's orders?

What is the test pyramid?

The test pyramid says you need many fast, cheap unit tests at the base, fewer integration tests in the middle and a small number of slow, expensive end-to-end tests at the top. Base-layer tests run in seconds and point to the exact spot; upper-layer tests are slow and hard to diagnose.

Test pyramid: many fast unit tests at the base, integration tests in the middle, few end-to-end tests at the top and exploratory testing above; cost and time rise going up
The test pyramid: the closer to the base, the faster and cheaper the test.
Lesson 1 exerciseList the bugs found in your project over the last three months and write which test type could have caught each. If most were found "during acceptance" or "in production", the lower layers lack tests.

Lesson 2: How Do You Write Test Scenarios and Test Cases?

A test scenario says in one sentence what will be tested; a test case says how to run it, step by step, with inputs and expected results. A good test case is clear enough that someone who didn't write it gets the same result.

Example: "A dealer can order by product code" is a scenario. One test case derived from it:

FieldExample
IDTC-012
ScenarioA dealer can order by product code
PreconditionLogged in with an active dealer account; product MUT-TRM-500-CLK has at least 10 units in stock
Steps1) Open the order screen. 2) Type MUT-TRM-500-CLK in the product code field. 3) Type 10 in the quantity field. 4) Press "Add to cart".
Expected resultThe product name and dealer-specific unit price appear; the cart has 1 line and 10 units; the total equals quantity × unit price.
PriorityHigh (main workflow)
ResultPassed / Failed (filled in when run)

Follow three rules: write the expected result concretely ("works correctly" is not an expected result; "the total must be ₺4,800" is); let each test case check one thing, or you won't know why it failed; and write negative cases too (wrong code, empty field, non-existent product). Users don't only walk the happy path.

Lesson 2 exercisePick your project's most critical flow (ordering, payment, sign-up) and write five test cases in the format above: two positive, three negative. Give one to a friend outside the project and see whether they reach the result from the written steps alone.
Recommended reading: How to do software requirements analysis: where acceptance criteria come from

Lesson 3: How Do You Apply Boundary Value Analysis and Equivalence Classes?

An equivalence class is a group of values the software should treat the same way. Boundary value analysis, starting from the fact that bugs cluster at boundaries, tests the values at and around the edge of each class. Together they give almost the same confidence as hundreds of values with only a handful.

The valid range of the quantity field is 1–500, giving three equivalence classes: values below 1 (invalid), values from 1 to 500 (valid) and values above 500 (invalid). One value per class isn't enough, because confusing "less than" with "less than or equal to" is a common mistake, so we test the boundaries and the values beside them.

Boundary value analysis for the quantity field: 0 and 501 invalid, 1 and 500 valid boundary values; a mid-range value and invalid input types
Equivalence classes and boundary values for the quantity field (1–500).
InputClassExpected resultWhy this value?
0Invalid (below)Rejected, "Quantity must be at least 1"Just below the lower boundary
1ValidAcceptedThe lower boundary itself
2ValidAcceptedJust above the lower boundary
250ValidAcceptedA typical value from the middle
499ValidAcceptedJust below the upper boundary
500ValidAcceptedThe upper boundary itself
501Invalid (above)Rejected, "Quantity can be 500 at most"Just above the upper boundary
empty, "abc", 2.5, −3Invalid input typesRejected with a clear messageNon-numeric and decimal input

More than 500 possible values shrank to 8 test cases. The same logic applies to the order total rules (at least ₺1,000; 5% off from ₺10,000): try ₺999.99 (rejected), ₺1,000.00 (accepted, no discount), ₺9,999.99 (no discount) and ₺10,000.00 (discount ₺500.00; total ₺9,500.00). Only the ₺10,000.00 value shows whether the discount applies at exactly 10,000; that single value catches the difference between "10,000 or more" and "more than 10,000", and a boundary bug like this turns directly into a money difference once it's found in production.

Lesson 3 exerciseList the numeric and date fields in your project (quantity, amount, age, date range, character limit). Write the valid range for each and build the boundary table. If you find a field nobody knows the range of, that's a requirements gap.

Lesson 4: How Do You Test Rule Combinations with a Decision Table?

A decision table tests rules that give different results depending on a combination of conditions by writing out every combination. With n conditions there are 2ⁿ combinations; the table makes sure none is forgotten and lets you merge combinations with the same outcome to reduce the number of tests.

The order screen has three conditions: is the dealer active, is the credit limit sufficient, is stock sufficient? Three conditions make 2³ = 8 combinations. The business rule: an inactive dealer's order is always rejected; if the limit is exceeded, the order goes to manager approval; if the limit is fine but stock is short, the order is put on hold; if all three are fine, it is approved.

CombinationDealer active?Limit sufficient?Stock sufficient?Outcome
1YesYesYesOrder approved
2YesYesNoPut on hold
3YesNoYesSent to manager approval
4YesNoNoSent to manager approval
5NoYesYesRejected
6NoYesNoRejected
7NoNoYesRejected
8NoNoNoRejected

Now merge by outcome. In rows 3 and 4 stock doesn't change the result; in rows 5 to 8 only the dealer being inactive matters. These "don't care" cases are shown with a dash, and the table shrinks to four:

RuleDealer active?Limit sufficient?Stock sufficient?Outcome
R1YesYesYesOrder approved
R2YesYesNoPut on hold
R3YesNo-Sent to manager approval
R4No--Rejected

Eight combinations became four tests, but writing all eight first is essential, since only the full table shows whether you merged correctly. It also lets you ask the business, before coding: "An inactive dealer is rejected regardless of limit and stock, correct?"

Lesson 4 exercisePick a rule in your project that depends on several conditions (discount, approval, shipping fee). Count the conditions, write all 2ⁿ combinations, merge those with the same outcome and show the result to the business. You will probably find a combination nobody had answered.

Lesson 5: How Do You Write a Good Bug Report?

A good bug report lets the developer understand the problem on first read and reproduce it on their own machine. If the reader can't reproduce the bug, fixing can't begin; the clearer the report, the sooner it does.

FieldBad exampleGood example
TitleOrder screen brokenQuantity field accepts 501 (maximum should be 500)
StepsI tried to order1) Log in as an active dealer. 2) On the order screen, enter MUT-TRM-500-CLK. 3) Type 501 in quantity. 4) Press "Add to cart".
Expected resultShould work properlyA "Quantity can be 500 at most" message should appear and the product should not be added
Actual resultThere's a bugThe product was added with 501 units and no message appeared
Environment-Test environment, version 1.4.2, phone (Android), browser version
Severity and priorityVery urgent!Severity: High. Priority: fix before release

Are severity and priority the same thing?

No. Severity is how big the bug's impact is on the system and the business; priority is when it will be fixed. The tester sets severity; the project manager and business unit set priority, weighing the number of users and the release schedule. They often point the same way, but not always.

For example, a wrongly calculated order total is critical severity and urgent; a crash in a report used once a year is high severity but low priority (big impact, rare use, a workaround exists); a misspelled company name on the home page is low severity but high priority (it doesn't break function, but everyone sees it and it is quick to fix).

Lesson 5 exerciseRewrite a recent bug in the format above. Give the report to someone who has never seen the bug and see whether they can reproduce it by following the steps. If they can't, the report is incomplete.

Lesson 6: What Are Regression Testing and Test Automation?

Regression testing checks that old, working features haven't been broken by a new change. A fix in one place often breaks another; regression testing catches that before release.

Repeating every test by hand after each change takes time and invites mistakes, so frequently repeated tests are automated and run on their own after each change. But not everything needs automating: flows that repeat every release, have clear inputs and expected results and rarely change (discount calculation, boundary values, login and ordering) suit automation, while one-off tests, subjective judgments and screens whose design is still changing are better done by hand.

Lesson 6 exercisePick the five flows in your project where "if it breaks, work stops" and write a regression list. Run it before every release, and after each production bug add a test that would have caught it.
Recommended reading: How to create a project plan: putting testing in the schedule

Lesson 7: How Do Test Metrics Support the Release Decision?

"Is testing done?" is answered with simple metrics and exit criteria set in advance, not with "I think so". The example below calculates the results of a release with 26 requirements. Figures are illustrative.

MetricFormulaWorked example
Execution rateTests run ÷ Tests planned108 ÷ 120 = 90%
Pass rateTests passed ÷ Tests run96 ÷ 108 ≈ 88.9%
Requirements coverageRequirements with a test ÷ Total requirements24 ÷ 26 ≈ 92.3%
Defect densityDefects found ÷ Size (for example thousand lines of code)18 ÷ 6 = 3 defects per 1,000 lines
Defect removal efficiency (DRE)Defects found before release ÷ (Found before + after release)45 ÷ (45 + 5) = 90%

Reading the table: 10% of planned tests haven't been run, 11% of those run have failed and two requirements have no test at all; we're not ready to ship. Defect density shows which module needs the most attention, and defect removal efficiency shows how many defects were found before customers did, that is, how well the test process works.

Software test metrics with worked examples: execution rate, pass rate, requirements coverage and defect removal efficiency
Four test metrics with worked examples.

How do you set exit criteria for release?

Exit criteria are the conditions for calling testing done and releasing, written down before testing. Criteria set after seeing the results turn the decision into a defense of the result; set in advance, they give you a threshold to decide against. The thresholds below are examples; set yours for your own risk.

CriterionExample threshold
Open critical and high-severity bugsZero
Pass rate of main workflows (login, ordering, ERP transfer)100%
Execution rate of all tests100%, with a pass rate of at least 95%
Acceptance test approvalWritten, from the customer or business unit
Lesson 7 exerciseWrite this exit criteria list for your next release before it starts and have the project sponsor approve it. When the release is done, decide by the list, not by argument.

What Are the Most Common Software Testing Mistakes?

Most testing mistakes come not from missing tools but from missing perspective. The most frequent are:

  • Leaving testing to the end: When time runs out, testing is cut first. Plan it at the requirements stage.
  • Authors testing their own work: Developers try the cases they thought of; the rest go untested. System and acceptance tests should be someone else's job.
  • Trying only the happy path: Empty fields, wrong input, a dropped connection and pressing the same button twice get skipped, and customers hit exactly those.
  • Not writing expected results: If the expected result isn't known in advance, every outcome looks "correct".
  • Using real customer data in the test environment: Once real names, phone numbers and addresses are accessible in test, you have a data security and personal data (KVKK) problem. Use sample or anonymized data.
We recommend reading: How to Get Custom Software Developed: Choosing a Company, Quotes, Contract and Payment Plan
We recommend reading: How to secure an API: authentication, authorization, tokens and rate limiting
Recommended reading: What Is Technical Debt?

Software Testing with İnovabil

At İnovabil we treat testing not as a check at the end of development but as a step planned from the start of the project. The acceptance criteria we write during requirements analysis form the basis of test scenarios. We test the software with real business scenarios, including different roles, devices and edge cases, and add performance and security checks to scenario-based functional tests. We run acceptance tests together with you and deliver test scenarios and acceptance sign-off as outputs.

Tell us in a few sentences how your software project will be tested and what your acceptance criteria are, and we will prepare a test plan outline tailored to you.

Recommended reading: Our software development process: from analysis to launch, step by step

Frequently Asked Questions

How do you do software testing, and what are the steps?

In seven steps: choose test types and approach, write test scenarios and cases, pick test data with boundary value and equivalence class analysis, check rule combinations with decision tables, report bugs, run regression tests and decide on release against exit criteria.

What is the difference between a test scenario and a test case?

A scenario says in one sentence what to test, such as "a dealer can order by product code". A test case records how to run it, with preconditions, steps, input and expected results. One scenario usually yields several test cases.

What is boundary value analysis and why is it used?

It tests the values at and just beside the edges of the valid range, because bugs cluster at boundaries. For a quantity field of 1–500, you try 0, 1, 2, 499, 500 and 501.

What is the difference between severity and priority?

Severity is how large the bug's impact is, usually set by the tester. Priority is when it will be fixed, set by the project manager and business unit. A bug on a rarely used screen can be high severity but low priority.

When is software testing done?

When the exit criteria written down in advance are met: no open critical or high-severity bugs, main workflows passing and acceptance sign-off received. Set criteria before testing, not after seeing results; testing cannot prove the absence of bugs, only that the remaining risk is acceptable.

Let's talk about your project

Tell us briefly about the software you have in mind; we'll listen and prepare a tailored roadmap and proposal.

Get a quote