What is software testing?
Introduction
Imagine the frustration when the app you rely on crashes or your online purchase fails due to a glitch.
Software testing strives to prevent these mishaps. It's the detective work that ensures the user experience is as smooth as intended.
What is Software Testing?
"Software testing is a process, or a series of processes, designed to make sure computer code does what it was designed to do and that it does not do anything unintended." (Myers et al. 1-2).
The Goal of Software Testing
Software testing aims to find bugs, not to attest that software has no bugs or that it works (Patton 10).
That's the right approach to software testing, which should guide all testing activities. You'll miss bugs if you only test the software to ensure it works.
You can only say the software has bugs. You cannot say the software has no bugs.
Software testing is a complex process involving numerous variables, and all you can say is that your test suite didn't catch any bugs.
Finding Bugs Sooner Rather Than Later
Software testing aims to find bugs as soon as possible and make sure they get fixed.
The sooner we find a bug, the cheaper it is to fix it.
Finding and fixing bugs before deploying code to production is much cheaper and avoids a poor user experience.
We can also identify flawed requirements before turning them into buggy code. That's even better.
The worst time to find and fix a bug is after we deploy it to production. Your users will suffer, and you might spend a lot of money fixing it or even lose money because of it.
What Are Software Bugs?
Many issues arise throughout the software development lifecycle, but not everything is a bug.
I wrote a dedicated article presenting solid parameters to identify software bugs correctly.
What is a Product Specification?
The product specification is a key documentation describing what a product is, what it is supposed to do, and what it is not supposed to do.
We cannot identify software bugs without a well-written product specification.
Black-Box vs. White-Box Testing
We can perform functional testing using two primary methodologies: black-box and white-box testing.
These terms describe the tester's knowledge of the software's internal workings.
Black-Box Testing
Imagine the software as a black box.
The tester only sees the inputs and outputs, focusing on the system's behavior without knowing its internal code structure.
Test cases are designed based on requirements and specifications to ensure the software works as expected from a user's perspective.
White-Box Testing: Lifting the Lid
In contrast, white-box testing lifts the lid on the box.
The tester knows the internal code and can design test cases that target specific code paths and logic.
This method is helpful for intricate functionalities or areas where error-prone code is suspected.
Choosing the Right Approach
Both black-box and white-box testing have their strengths and weaknesses and are suitable for unit, integration, and E2E testing (further explained).
A balanced testing strategy often employs a combination of both methodologies.
Types of Software Testing
While there are many different techniques, here are some common types of software testing:
Unit Testing
Unit testing focuses on the smallest testable parts of the code, usually individual functions or methods.
Developers typically write unit tests to ensure their code works as intended at the most basic level.
Unit tests help catch bugs early in development, making them faster and cheaper to fix.
They also serve as documentation, making the code easier to understand and maintain.
Integration Testing
Integration testing examines how well different software modules or components work together, checking how data flows between system parts.
Integration tests uncover issues that might arise when different parts of the software interact, preventing unexpected behavior that could be harder to isolate later.
End-to-End Testing (E2E)
End-to-end testing simulates real-world user scenarios and interactions.
The goal is to test the entire system, from the user interface to the business logic and database, ensuring the software works as a whole.
E2E testing provides confidence that the software will function correctly in a real-world environment.
Performance Testing
Performance testing evaluates how the software performs under different workloads.
It checks the system's speed, responsiveness, and stability as the number of users or transactions increases.
That helps identify potential bottlenecks and ensures that the software can handle the demands placed upon it in real-world use.
Security Testing
Security testing aims to uncover vulnerabilities that malicious actors could exploit.
It involves techniques like penetration testing, where testers simulate attacks to find weaknesses in the system's defenses.
That helps protect sensitive data and prevent breaches that could damage the software's reputation.
Accessibility Testing
Accessibility testing ensures we design and develop software people with disabilities can use. That includes users with visual and hearing impairments.
Accessibility testing considers screen reader compatibility, color contrast, and keyboard navigation.
Risk-Based Testing (RBT)
Risk-based testing focuses testing efforts on the areas of the software that pose the highest risk.
Risks can include the complexity of code, the likelihood of a given part failing, or the potential impact on users if a failure happens.
RBT helps optimize testing resources and prioritize the most critical functionality.
Manual vs. Automated Testing
While some types of testing lend themselves to automation (like unit, integration, and some E2E tests), others require a human touch.
Manual Testing
Manual testing involves a human tester interacting with and evaluating the software from a user's perspective.
This method is essential for testing aspects like usability, visual design, difficult-to-automate scenarios, or scenarios where human insight and creativity are needed to uncover unexpected issues.
Exploratory testing, where a tester explores the software without predefined test cases, is a prime example of manual testing.
Automated Testing
With automated testing, scripts and software tools execute predefined test cases written by developers.
That's especially valuable for repetitive tasks and regression testing, i.e., checking that previously working features don't break with new changes.
Automated tests bring speed, efficiency, and consistency to the testing process.
Unit, integration, and E2E tests are typically part of an automated test suite that runs as part of a continuous integration and delivery pipeline to prevent buggy code from merging into a stable code branch.
A Combined Approach
The most effective testing strategies use both manual and automated testing.
Automation handles routine checks, freeing testers to focus on more complex scenarios requiring creativity and human judgment.
Conclusion
Software testing is a continuous process to build quality software. If you are involved in any part of software development, start thinking about how to contribute to testing the software to improve its quality.
Please share your insights in the comments below. I'd love to hear your thoughts.
I'm using Giscus, so you can comment and give a thumbs up with your GitHub account. 😉
While you're here, please share this article. Your support means a lot to me!
Thanks for reading!
Related posts
- Testing is not quality assurance (QA)
- What is a software bug?
- What is a product specification?
- How to report bugs effectively?
Interesting links
Bibliography
Myers, Glenford J., et al. The Art of Software Testing. 2nd ed. John Wiley & Sons, 2004.
Patton, Ron. Software Testing. 2nd ed. Sams, 2005.
I incorporated generative AI tools into my workflow, and I love them. But I use them carefully to brainstorm, research information faster, and express myself clearly. It's not copy/paste in any way.
What is software testing? by Flavio Silva is licensed under a Creative Commons Attribution 4.0 International License.