Fundamentals of Software Testing

Sırat Boydaş
Huawei Developers
Published in
9 min readSep 19, 2023

Introduction

Hello everyone, in my first Medium article, I wanted to write an article about what I learned by collecting information from different sources when I first stepped into the world of testing, but I thought that all of them should be gathered under a single title. I will try to convey basic information about Software Testing with small details, I wish you a pleasant reading in advance :)

Why Software Testing?

The software testing process should be present in all Software Development Life Cycle (SDLC) of a software, because even when the software goes live and customers start to use it, errors can be encountered, and their detection must be done as quickly as possible, and solutions must be found.

In fact, as we can understand from this definition, we need to start from the very beginning of the process, which is the Software Development Life Cycle.

Software Development Life Cycle

Software development lifecycle (SDLC) is a methodology that software development teams use for high quality, cost-effectiveness and efficient use of time. The purpose of this methodology is to meet customer expectations during and after production, and to minimize risks with forward-looking project planning. This methodology consists of several steps.

  1. Planning: The planning phase is one of the most important phases of the Software Development process. Actually, what we want, what should be the aim of this project and what are the requirements and situations are determined.
  2. Analysis: Analysis phase included to gather and understand the requirements from stakeholders. This involves meetings, interviews, and documentation to define what the software should do. Evaluate the feasibility of the project in terms of technical, financial, and operational aspects. Determine if it’s worth pursuing.
  3. Design: Create a high-level architecture and design for the software. Decide on the overall structure, components, and how they will interact.
  4. Implementation: With the other name ‘coding phase’ where developers write the actual source code for the software based on the design specifications
  5. Testing and Integration: The phase of the Software Development Life Cycle’s is crucial part of software development process. This phase is carried out to ensure that the software functions correctly and that different components work together harmoniously.
  6. Maintenance: The maintenance phase is the last stage of the software development life cycle, and it focuses on keeping the software operational and up to date after it has been deployed.

Now that we have learned about the Software Development Life Cycle, we will continue our article with Software Test Types after 2 basic Software Test Techniques.

Two Essential Software Test Techniques

In the realm of software development, testing is a cornerstone of ensuring the quality and reliability of applications. Among the various testing methodologies, two prominent approaches stand out: White Box Testing and Black Box Testing.

Black Box Testing

Black Box Testing takes a different approach, treating the software as an opaque entity. Testers do not have access to the source code; instead, they evaluate the application’s functionalities based on external inputs and expected outputs. This method is akin to how end-users interact with the software, making it a valuable technique for assessing user experience.

White Box Testing

White Box Testing is an intricate testing methodology that delves deep into the internal structure of the software. Also known as structural testing, it involves examining the code, logic paths, and data flows within the application. Testers employing this technique have access to the source code, allowing them to design test cases based on an intimate understanding of the program’s inner workings.

Software Testing Types

In fact, we can say that Software Testing Types are divided into two main headings which are Functional Software Test Types and Non-Functional Software Test Types.

The Software Test Types

As you can see on the table both of Functional Tests and Non-Functional Tests are included some different testing types, so lets continue with them.

Functional Test Types

Type of software testing that evaluates the system’s behavior against specified functional requirements. It verifies if the software functions as intended, including user interface, APIs, databases, and client/server applications.

1-Unit Testing: Focuses on testing individual units or components of the software to ensure they function correctly in isolation.

2-Integration Testing: Verifies that different units or module of the software work together as expected when integrated.

3-System Testing: Evaluates the complete, integrated system against specified requirements. It ensures that the software meets its intended purpose.

4-Acceptance Testing: Determines whether the software meets the acceptance criteria set by the stakeholders or end-users.

5-Smoke Testing: A preliminary tests to check if the basic functionalities of the software are working correctly. It’s often used before more detailed testing.

6-Regression Testing: Ensures that new changes or updates to the software do not negatively impact existing detailed testing.

7-User Interface (UI) Testing: Focuses on testing the graphical user interface to ensure its user-friendly and functions as excepted.

8-Usability Testing: Assesses the software’s user-friendliness, including ease of navigation, intuitiveness, and overall user experience.

9-Compatibility Testing: Checks if the software works correctly on different operating systems, browsers, devices, or network environments.

10-Localization Testing: Ensures that the software is adapted for specific regional or cultural settings, such as language, date formats, and currency.

Non-Functional Test Types

This type of tests are attributes like performance, usability, reliability, and security. It focuses on aspects that are not related to specific behaviors or functions of the system.

1-Performance Testing: Performance testing is a comprehensive evaluation of a software application’s speed, responsiveness, scalability, and stability under various conditions. Its primary aim is to ensure that an application functions optimally, even when subjected to heavy loads or adverse circumstances. There are 4 important Performance Testing methodologies which are:

  • Load Testing: Checks how the system performs under anticipated user loads.
  • Stress Testing: Evaluates system behavior under extreme conditions to identify breaking points.
  • Capacity Testing: Determines the maximum capacity the system can handle.
  • Scalability Testing: Assesses the system’s ability to scale up or down as the load changes.

2-Reliability/Availability Testing

  • Reliability Testing: Ensures that the system functions consistently over a specified period.
  • Availability Testing: Verifies the availability of the system during expected and unexpected situations.

3-Usability Testing: Completely user-focused testing technique. It is not interested in whether the product works correctly in a functional sense, but in how accurately, how reliable and how comfortable it is used by the users of the product that is assumed to work correctly.

4-Security Testing: Security testing is a systematic evaluation of a software application’s security features. Its primary objective is to uncover vulnerabilities that could potentially be exploited by malicious actors. This process involves a series of tests designed to identify weaknesses in various layers of a system, including the application layer, network layer, and database layer.

5-Compatibility Testing: Compatibility testing is a systematic evaluation of how a software application performs across different environments. Its primary goal is to ensure that the application functions consistently and effectively across a range of devices, browsers, and operating systems.

In fact, we can further diversify the subheadings of functional and non-functional test types. Although there are many other types of tests that I could not include in my article, I wanted to briefly mention the most basic and important ones. On the other hand, to sum up, functional testing checks what the system does, while non-functional testing evaluates how well it performs under various conditions.

Levels of Testing

Testing is carried out at various levels of the development process to identify and rectify any issues. There are 4 different test levels which are;

  • Unit Testing
  • Integration Testing
  • System Testing
  • Acceptance Testing
Levels of Testing

Let’s delve into the different levels of software testing and their significance.

Unit Testing

Unit testing is the first level of testing and focuses on individual units or components of the software. A unit is the smallest testable part of an application, such as a function or method. In unit testing, each unit is tested in isolation to verify that it performs as expected. This is typically automated and helps catch basic coding errors early in the development process.

Integration Testing

Integration testing comes after unit testing and involves testing the interactions between different units or modules. It ensures that units work together as intended when integrated. The goal is to identify any interface or communication issues that might arise when different components interact.

System Testing

System testing evaluates the entire software system as a whole. It verifies that the software meets all specified requirements and functions correctly on its intended environment. This level of testing often includes functional, non-functional, and performance testing to ensure that the system behaves as expected under various conditions.

Acceptance Testing

Acceptance testing is the final level of testing and is performed to determine if the software meets the business requirements and if it is ready for deployment. It is usually conducted by end-users, customers, or stakeholders. There are two main types of acceptance testing: User Acceptance Testing (UAT), where end-users validate the system against their actual needs and Alpha/Beta Testing, where the software is tested by a select group of users in real-world environment.

In conclusion about levels of testing, it is a multi-level process that ensures the quality and reliability of software applications. Each level serves specific purpose in identifying and rectifying defects. But remind that; Test Types and Levels of Testing are different things.

We can do all these tests and methods in two different ways which are: Manual Testing and Automation Testing.

Manual Testing vs. Automation Testing

Two primary approaches to testing are manual testing and automation testing. Each has its advantages and is suited to different scenarios. I will try to explain with small details, when and how which is the best approaches for our test scenarios.

Manual Testing

Manual testing is a method in which testers execute test cases without using any automation tools. It involves human intervention to simulate end-user behavior, exploring various features, and identifying bugs or defects.

Automation Testing

Automation testing involves using specialized tools and scripts to perform test cases automatically. It aims to increase efficiency, repeatability, and accuracy in the testing process.

The decision between manual and automation testing depends on various factors, including project size, budget, timeline, and the nature of the application. In many cases, a combination of both approaches, known as hybrid testing, provides the best balance.

Also, as I said, there are some frameworks and tools for both automation and manual testing, but it is another article subject :)

Conclusion

In this article, we have mentioned all the important topics in small details so that even someone who has no knowledge about software testing can have knowledge about the basics of software testing from start to finish. Of course, remind that, there are a lot of details about Software Testing except from my article, continue researching and learning new things day by day. 💪

I hope you enjoyed reading it and it was useful for you :)

--

--