Unit-4 SEngineering
Unit-4 SEngineering
Software Testing
Software testing is the process of assessing the functionality of a software program. The process
checks for errors and gaps and whether the outcome of the application matches desired
expectations before the software is installed and goes live.
Or
Software testing is the process of evaluating and verifying that a software application or system
behaves as intended. The goal is to identify any defects, errors, or bugs in the software and ensure
that it meets the specified requirements. The testing process involves the execution of the software
or its components with the intent of finding discrepancies between expected and actual results.
Software testing is the process of assessing the functionality of a software program. The process
checks for errors and gaps and whether the outcome of the application matches desired
expectations before the software is installed and goes live.
Functional testing
Functional testing is a type of testing that seeks to establish whether each application feature works
as per the software requirements. Each function is compared to the corresponding requirement to
ascertain whether its output is consistent with the end user's expectations.
Or
Functional testing is all about making sure that each part of a software application works as intended
and aligns with the specified requirements. It's like checking off a list to ensure that every function
and feature performs correctly.
By performing functional testing, development teams can gain confidence that each function of the
software is behaving correctly and meeting the expectations outlined in the requirements. It's an
essential step in the software development life cycle to deliver a reliable and user-friendly product.
Structural Testing
Structural Testing is a type of software testing. This testing is used to test the internal design of the
software or the structure of the coding for the particular software. Structural testing uses white box
testing techniques.
Or
Structural testing is a type of software testing that focuses on examining the internal design and
structure of the software, particularly the code. Unlike functional testing, which evaluates the
software based on its external behaviour, structural testing delves into the underlying
implementation details.
Structural testing is about inspecting the internal structure of the software to ensure it is well-
designed, follows best practices, and is robust in terms of code quality and logic. It plays a crucial
role in building reliable and maintainable software systems.
Types of Structural Testing:
Some common types of structural testing include:
• Path Testing: Ensuring that every possible path through the code is executed at least once.
• Data Flow Testing: Analyzing how data is processed and propagated through the code.
• Mutation Testing: Introducing small changes (mutations) to the code to check if the tests
can detect and identify these changes.
Unit Testing
Isolation of Components:
• In unit testing, each component or unit of the software is tested independently of
the rest of the system. This means that the focus is solely on the specific
functionality of that unit.
Purpose of Unit Testing:
• The goal is to validate that each unit performs as intended, adhering to the specified
requirements and producing the expected outputs for various inputs.
Benefits of Unit Testing:
• Early Detection of Defects: Unit testing allows for the early identification and
rectification of defects, ensuring that issues are addressed at the component level
before they propagate to the entire system.
• Simplified Debugging: When a unit test fails, it's easier to pinpoint the specific
component responsible for the failure, making the debugging process more
straightforward.
• Support for Refactoring: Unit tests provide a safety net when making changes to the
code. If existing functionality is inadvertently altered, unit tests will catch it.
Debugging
Integration and System Testing verifies that components work together correctly and the system as a
whole meets requirements. It verifies that components work together correctly and the system as a
whole meets requirements.
Both integration testing and system testing play a critical role in the software development lifecycle.
Integration testing helps to ensure that the individual components are integrated correctly and work
together as intended, while system testing helps to ensure that the software functions correctly as a
whole.
Software Testing
Software Testing tools are the tools that are used for the testing of software. Software testing tools
are often used to assure firmness, thoroughness, and performance in testing software products.
Unit testing and subsequent integration testing can be performed by software testing tools. These
tools are used to fulfill all the requirements of planned testing activities. These tools also work as
commercial software testing tools. The quality of the software is evaluated by software testers
with the help of various testing tools.
Types of Testing Tools: Software testing is of two types, static testing, and dynamic testing.
The tools used during these testing are named accordingly on these testing.
Testing tools can be categorized into two types which are as follows:
• Flow analyzers: Flow analyzers provides flexibility in the data flow from input to
output.
• Path Tests: It finds the not used code and code with inconsistency in the software.
• Coverage Analyzers: All rationale paths in the software are assured by the coverage
analyzers.
• Interface Analyzers: They check out the consequences of passing variables and data in
the modules.
• Test driver: The test driver provides the input data to a module-under-test (MUT).
• Test Beds: It displays source code along with the program under execution at the same
time.
• Emulators: Emulators provide the response facilities which are used to imitate parts of
the system not yet developed.
• Mutation Analyzers: They are used for testing the fault tolerance of the system by
knowingly providing the errors in the code of the software.
There is one more categorization of software testing tools. According to this classification,
software testing tools are of 10 types:
1. Test Management Tools: Test management tools are used to store information on
how testing is to be done, help to plan test activities, and report the status of quality
assurance activities. For example, JIRA, Redmine, Selenium, etc.
2. Automated Testing Tools: Automated testing tools helps to conduct testing activities
without human intervention with more accuracy and less time and effort. For
example, Appium, Cucumber, Ranorex, etc.
3. Performance Testing Tools: Performance testing tools helps to perform effectively and
efficiently performance testing which is a type of non-functional testing that checks
the application for parameters like stability, scalability, performance, speed, etc. For
example, WebLOAD, Apache JMeter, Neo Load, etc.
4. Cross-browser Testing Tools: Cross-browser testing tools helps to perform cross-
browser testing that lets the tester check whether the website works as intended
when accessed through different browser-OS combinations. For example, Testsigma,
Testim, Perfecto, etc.
5. Integration Testing Tools: Integration testing tools are used to test the interface
between the modules and detect the bugs. The main purpose here is to check whether
the specific modules are working as per the client’s needs or not. For example, Citrus,
FitNesse, TESSY, etc.
6. Unit Testing Tools: Unit testing tools are used to check the functionality of individual
modules and to make sure that all independent modules works as expected. For
example, Jenkins, PHPUnit, JUnit, etc.
7. Mobile Testing Tools: Mobile testing tools are used to test the application for
compatibility on different mobile devices. For example, Appium, Robotium, Test IO,
etc.
8. GUI Testing Tools: GUI testing tools are used to test the graphical user interface of the
software. For example, EggPlant, Squish, AutoIT, etc.
9. Bug Tracking Tools: Bug tracking tool helps to keep track of various bugs that come up
during the application lifecycle management. It helps to monitor and log all the bugs
that are detected during software testing. For example, Trello, JIRA, GitHub, etc.
10. Security Testing Tools: Security testing is used to detect the vulnerabilities and
safeguard the application against the malicious attacks. For example, NetSparker,
Vega, ImmuniWeb, etc.
Software Maintenance
It refers to the process of modifying and updating a software system after it has been delivered to
the customer. This can include fixing bugs, adding new features, improving performance, or
updating the software to work with new hardware or software systems. The goal of software
maintenance is to keep the software system working correctly, efficiently, and securely, and to
ensure that it continues to meet the needs of the users.
Software maintenance is a continuous process that occurs throughout the entire life cycle of the
software system. It is important to have a well-defined maintenance process in place, which
includes testing and validation, version control, and communication with stakeholders.
Several Types of Software Maintenance:
• Corrective Maintenance: This involves fixing errors and bugs in the software system.
• Patching: It is an emergency fix implemented mainly due to pressure from
management. Patching is done for corrective maintenance but it gives rise to
unforeseen future errors due to lack of proper impact analysis.
• Adaptive Maintenance: This involves modifying the software system to adapt it to
changes in the environment, such as changes in hardware or software, government
policies, and business rules.
• Perfective Maintenance: This involves improving functionality, performance, and
reliability, and restructuring the software system to improve changeability.
• Preventive Maintenance: This involves taking measures to prevent future problems,
such as optimization, updating documentation, reviewing and testing the system, and
implementing preventive measures such as backups.
1. Quick-Fix Model
A quick-fix model in software maintenance is a method for addressing bugs or issues in the software
by prioritizing a fast resolution over a more comprehensive solution.
This approach typically involves making a small, localized change to the software to address the
immediate problem rather than fully understanding and addressing the underlying cause. However,
organizations adopt this approach of maintenance only in the case of emergency situations that call
for quick resolutions.Under the quick-fix model, tech teams carry out the following software
maintenance activities:
The iterative enhancement model treats the application target as a known quantity. It incorporates
changes in the software based on the analysis of the existing system. The iterative model best suits
changes made to confined application targets, with little cross-impact on other apps or
organizations.
3. Reuse-Oriented Model
The reuse-oriented model identifies components of the existing system that are suitable to use again
in multiple places. In recent years, this model also includes creating components that can be reused
in multiple applications of a system.
There are three ways to incorporate the reuse-oriented model — object and function, application
system, and component.
• Object and function reuse: This model reuses the software elements that implement a single
well-defined object.
• Application system reuse: Under this model, developers can integrate new components in an
application without making changes to the system or re-configuring it for a specific user to
reuse.
• Component reuse: Component reuse refers to using a pre-existing component rather than
creating a new one in software development. This can include using pre-built code libraries,
frameworks, or entire software applications.
4. Barry Bohem
The intermediate level of characteristics represented by the model displays different factors that
validate the expected quality of a software system. These characteristics are:
Developed by B.J. Taute in 1983, the Taute maintenance model facilitates development teams to
update and perform necessary modifications after executing the software.
The Taute model for software maintenance can be carried out in the following phases:
• Change request phase: In this phase, the client sends the request to make changes to the
software in a prescribed format.
• Estimate phase: Then, developers conduct an impact analysis on the existing system to
estimate the time and effort required to make the requested changes.
• Schedule phase: Here, the team aggregates the change requests for the upcoming scheduled
release and creates the planning documents accordingly.
• Programming phase: In the programming phase, requested changes are implemented in the
source code, and all the relevant documents, like design documents and manuals, are
updated accordingly.
• Test phase: During this phase, the software modifications are carefully analyzed. The code is
tested using existing and new test cases, along with the implementation of regression
testing.
• Documentation phase: Before the release, system and user documentation are prepared
and updated based on regression testing results. Thus, developers can maintain the
coherence of documents and code.
• Release phase: The customer receives the new software product and updated
documentation. Then the system’s end users perform acceptance testing.
Regression Testing
It is the process of testing the modified parts of the code and the parts that might get affected due
to the modifications to ensure that no new errors have been introduced in the software after the
modifications have been made. Regression means the return of something and in the software
field, it refers to the return of a bug.
Reverse Engineering
Reverse engineering in software engineering refers to the process of analyzing a software system to
understand its design, functionality, and inner workings. Unlike traditional software development,
where the focus is on creating new software, reverse engineering involves working backward from an
existing software product to gain insights into its structure and code.
While reverse engineering can provide valuable insights and benefits, it's essential to approach it
with a clear understanding of legal and ethical considerations. Respect for intellectual property rights
and adherence to relevant laws and regulations are critical aspects of responsible reverse
engineering practices.
Or
Software Reverse Engineering is a process of recovering the design, requirement specifications,
and functions of a product from an analysis of its code. It builds a program database and generates
information from this.
The purpose of reverse engineering is to facilitate the maintenance work by improving the
understandability of a system and producing the necessary documents for a legacy system.
Reverse engineering can extract design information from source code, but the abstraction level,
the completeness of the documentation, the degree to which tools and a human analyst work
together, and the directionality of the process are highly variable.
Configuration Management:
Managing changes systematically to maintain the integrity of the software.
Software configuration management is a systems engineering process that tracks and monitors
changes to a software systems configuration metadata. In software development, configuration
management is commonly used alongside version control and CI/CD infrastructure.
By implementing SCM practices, software development teams can enhance collaboration, maintain
code quality, and effectively manage the evolution of their software systems throughout the
development life cycle.
Documentation:
Keeping thorough and up-to-date documentation for future reference and understanding.