CSE 270: Software Testing - Reading Material

Unit 1.2: Testing Terminology and Concepts

Software testing is a comprehensive and intricate process that hinges on a rich tapestry of terminology and concepts, forming the bedrock of software quality assurance. A test is essentially an experiment to determine whether something (typically software or a system) executes correctly.

Testing Types and Levels

At the heart of software testing lies the categorization of testing types and levels, each serving a unique purpose in the pursuit of quality assurance. The spectrum of validation encompasses a diverse array of testing methodologies that provide comprehensive coverage of software functionality and behavior.

A figure commonly used to illustrate this point is called the “testing pyramid.” This figure demonstrates how modern testing is built first on the foundation of unit tests, then other, less granular types of testing are employed to ensure completeness.

Image of testing pyramid with Unit Tests at the bottom, Integration testing in the middle and End to End Test at the top.
Testing Pyramid

Unit Testing

The foundation of the testing pyramid, unit testing involves testing individual components or units of software in isolation. By verifying the correctness of each unit, developers can catch defects at an early stage and establish a solid base for more comprehensive testing.

Integration Testing

As components are integrated into larger subsystems, integration testing scrutinizes the interactions and interfaces between these units. This phase ensures that the different parts of the software work seamlessly together, preventing integration-related issues.

System Testing/End-To-End Testing

System testing assesses the entire software application as a complete entity. It validates that the integrated components function harmoniously and meet the specified requirements. System testing is often a precursor to User Acceptance Testing.

Acceptance Testing

The culmination of testing efforts, acceptance testing evaluates the software's readiness for deployment from the user's perspective. It aims to ensure that the software fulfills user requirements and is fit for production release.

These testing types create a structured hierarchy that progressively validates software at various levels of granularity, safeguarding against defects and ensuring a robust end product.

Test Cases and Test Scripts: The Blueprints of Validation

At the heart of the testing process lie test cases and test scripts—foundational elements that drive the systematic validation of software applications.

Test Cases

Test cases are formalized documents that outline specific scenarios, inputs, and expected outcomes. They serve as a roadmap for testers, guiding them through the process of validating software functionality. Well-constructed test cases cover a wide range of scenarios, ensuring comprehensive coverage.

Test Scripts

Test scripts take testing a step further by automating the execution of test cases. Written in scripting languages, these scripts allow testers to repeat the same tests with precision and consistency. Automated testing accelerates the validation process and frees testers to focus on more complex scenarios.

Together, test cases and test scripts empower testers to execute systematic and repeatable tests, ensuring thorough validation of software features and functionality.

Test Data and Environments: Crafting Realistic Scenarios

Effective testing hinges on the use of diverse and representative test data that mirror real-world scenarios. Test data encompass a spectrum of inputs—normal inputs, boundary values, and erroneous inputs—that challenge the software's limits and uncover vulnerabilities.

Test Environments

In parallel, test environments replicate the conditions in which the software will be deployed. Creating a controlled environment that mimics production settings is essential for uncovering potential issues that might arise in real-world usage.

Collectively, test data and environments foster the creation of realistic testing scenarios, enabling testers to identify defects and vulnerabilities that might otherwise go unnoticed.

Defects and Bug Tracking: Navigating the Imperfections

The process of software testing often reveals defects—deviations from expected behavior that require rectification. Effective defect management is essential for maintaining software quality.

Defect Identification

Testers identify defects by comparing actual outcomes to expected outcomes. When a discrepancy is discovered, it is documented as a defect.

Bug Tracking

The management of defects involves recording, categorizing, prioritizing, and tracking them throughout their lifecycle. This process ensures that defects are appropriately addressed and resolved, preventing issues from slipping through the cracks.

Defects and bug tracking are integral to the iterative improvement of software quality, facilitating collaboration between development and testing teams.

Regression Testing and Test Maintenance: A Cycle of Continuous Improvement

Software is a dynamic entity, subject to continuous enhancements and modifications. Regression testing and test maintenance address the challenges posed by evolving software.

Regression Testing

As new features are added and changes are made, regression testing validates that existing functionality remains unaffected. This process safeguards against unintended side effects of modifications.

Test Maintenance

Ensuring that test cases, scripts, and environments are updated to align with changes is a critical aspect of test maintenance. Adapting tests to reflect the evolving software landscape guarantees accurate validation.

By integrating regression testing and test maintenance into the development cycle, software teams uphold the integrity of the software even as it undergoes continuous enhancements.

Functional Testing vs. Non-Functional Testing

Two fundamental categories within the landscape of testing are functional testing and non-functional testing. While both are essential for delivering robust software, they focus on different aspects of validation. Let's delve into the distinctions between functional and non-functional testing to unveil their unique dimensions.

Functional Testing: Validating Behavior and Functionality

Functional testing centers on assessing the software's behavior and functionality against specified requirements. It involves systematically testing each function, feature, and component of the software to ensure that it performs as intended. The primary objective is to verify whether the software meets user expectations and fulfills its designated tasks accurately.

Key Characteristics of Functional Testing:

Non-Functional Testing: Evaluating Quality Attributes

Non-functional testing, in contrast, examines the quality attributes of the software beyond its functional aspects. It assesses how well the software performs under different conditions and evaluates its characteristics such as performance, security, usability, and more. The objective is to ascertain whether the software meets standards related to various non-functional dimensions.

Key Characteristics of Non-Functional Testing:

The Symbiotic Role of Both Types: Delivering Holistic Quality Assurance

While functional testing ensures that software performs tasks accurately, non-functional testing assesses the software's overall quality attributes, which significantly impact user satisfaction and experience. Both types of testing are interdependent and contribute to a holistic quality assurance approach.

In essence, functional testing validates the "what" of software—whether it functions as specified—while non-functional testing scrutinizes the "how" of software—how well it performs, secures data, and provides a seamless user experience. Together, these testing dimensions contribute to a comprehensive evaluation that guarantees not only accurate functionality but also high-quality attributes that elevate the software's value in the eyes of users and stakeholders.