SE Unit 4
SE Unit 4
What is Testing?
Testing is the process of evaluating a system or its component(s) with the intent to find whether it
satisfies the specified requirements or not. In simple words, testing is executing a system in order to
identify any gaps, errors, or missing requirements in contrary to the actual requirements.
According to ANSI/IEEE 1059 standard, Testing can be defined as - A process of analyzing a
software item to detect the differences between existing and required conditions (that is
defects/errors/bugs) and to evaluate the features of the software item.
Software Tester
Software Developer
Project Lead/Manager
End User
Different companies have different designations for people who test the software on the basis of
their experience and knowledge such as Software Tester, Software Quality Assurance Engineer, QA
Analyst, etc.
It is not possible to test the software at any time during its cycle. The next two sections state when
testing should be started and when to end it during the SDLC.
It also depends on the development model that is being used. For example, in the Waterfall model,
formal testing is conducted in the testing phase; but in the incremental model, testing is performed at
the end of every increment/iteration and the whole application is tested at the end.
Testing is done in different forms at every phase of SDLC −
During the requirement gathering phase, the analysis and verification of requirements are also
considered as testing.
Reviewing the design in the design phase with the intent to improve the design is also
considered as testing.
Testing performed by a developer on completion of the code is also categorized as testing.
When to Stop Testing?
It is difficult to determine when to stop testing, as testing is a never-ending process and no one can
claim that a software is 100% tested. The following aspects are to be considered for stopping the
testing process −
Testing Deadlines
Completion of test case execution
Completion of functional and code coverage to a certain point
Bug rate falls below a certain level and no high-priority bugs are identified
Management decision
2 Ensures that the software system meets all Ensures that the functionalities meet
the functionality. the intended behavior.
3 Verification takes place first and includes Validation occurs after verification and
the checking for documentation, code, etc. mainly involves the checking of the
overall product.
QA includes activities that ensure It includes activities that It includes activities that
the implementation of processes, ensure the verification of a ensure the identification
procedures and standards in developed software with of bugs/error/defects in a
context to verification of respect to documented (or software.
developed software and intended not in some cases)
requirements. requirements.
Black-Box Testing
The technique of testing without having any knowledge of the interior workings of the application is
called black-box testing. The tester is oblivious to the system architecture and does not have access
to the source code. Typically, while performing a black-box test, a tester will interact with the
system's user interface by providing inputs and examining outputs without knowing how and where
the inputs are worked upon.
The following table lists the advantages and disadvantages of black-box testing.
Advantages Disadvantages
Well suited and efficient for large code segments. Limited coverage, since only a
selected number of test scenarios is
actually performed.
Code access is not required. Inefficient testing, due to the fact that
the tester only has limited knowledge
about an application.
Clearly separates user's perspective from the Blind coverage, since the tester
developer's perspective through visibly defined roles. cannot target specific code segments
or errorprone areas.
Large numbers of moderately skilled testers can test The test cases are difficult to design.
the application with no knowledge of implementation,
programming language, or operating systems.
White-Box Testing
White-box testing is the detailed investigation of internal logic and structure of the code. White-box
testing is also called glass testing or open-box testing. In order to perform white-box testing on
an application, a tester needs to know the internal workings of the code.
The tester needs to have a look inside the source code and find out which unit/chunk of the code is
behaving inappropriately.
The following table lists the advantages and disadvantages of white-box testing.
Advantages Disadvantages
As the tester has knowledge of the source Due to the fact that a skilled tester is needed
code, it becomes very easy to find out which to perform white-box testing, the costs are
type of data can help in testing the increased.
application effectively.
Extra lines of code can be removed which It is difficult to maintain white-box testing, as it
can bring in hidden defects. requires specialized tools like code analyzers
and debugging tools.
Functional Testing
This is a type of black-box testing that is based on the specifications of the software that is to be
tested. The application is tested by providing input and then the results are examined that need to
conform to the functionality it was intended for. Functional testing of a software is conducted on a
complete, integrated system to evaluate the system's compliance with its specified requirements.
There are five steps that are involved while testing an application for functionality.
Steps Description
III The output based on the test data and the specifications of the application.
V The comparison of actual and expected results based on the executed test cases.
An effective testing practice will see the above steps applied to the testing policies of every
organization and hence it will make sure that the organization maintains the strictest of standards
when it comes to software quality.
Unit Testing
This type of testing is performed by developers before the setup is handed over to the testing team
to formally execute the test cases. Unit testing is performed by the respective developers on the
individual units of source code assigned areas. The developers use test data that is different from
the test data of the quality assurance team.
The goal of unit testing is to isolate each part of the program and show that individual parts are
correct in terms of requirements and functionality.
Integration Testing
Integration testing is defined as the testing of combined parts of an application to determine if they
function correctly. Integration testing can be done in two ways: Bottom-up integration testing and
Top-down integration testing.
1
Bottom-up integration
This testing begins with unit testing, followed by tests of progressively higher-
level combinations of units called modules or builds.
2
Top-down integration
In this testing, the highest-level modules are tested first and progressively, lower-
level modules are tested thereafter.
System Testing
System testing tests the system as a whole. Once all the components are integrated, the application
as a whole is tested rigorously to see that it meets the specified Quality Standards. This type of
testing is performed by a specialized testing team.
System testing is important because of the following reasons −
System testing is the first step in the Software Development Life Cycle, where the application
is tested as a whole.
The application is tested thoroughly to verify that it meets the functional and technical
specifications.
The application is tested in an environment that is very close to the production environment
where the application will be deployed.
System testing enables us to test, verify, and validate both the business requirements as well
as the application architecture.
Regression Testing
Whenever a change in a software application is made, it is quite possible that other areas within the
application have been affected by this change. Regression testing is performed to verify that a fixed
bug hasn't resulted in another functionality or business rule violation. The intent of regression testing
is to ensure that a change, such as a bug fix should not result in another fault being uncovered in the
application.
Regression testing is important because of the following reasons −
Minimize the gaps in testing when an application with changes made has to be tested.
Testing the new changes to verify that the changes made did not affect any other area of the
application.
Mitigates risks when regression testing is performed on the application.
Test coverage is increased without compromising timelines.
Increase speed to market the product.
Acceptance Testing
This is arguably the most important type of testing, as it is conducted by the Quality Assurance
Team who will gauge whether the application meets the intended specifications and satisfies the
client’s requirement. The QA team will have a set of pre-written scenarios and test cases that will be
used to test the application.
More ideas will be shared about the application and more tests can be performed on it to gauge its
accuracy and the reasons why the project was initiated. Acceptance tests are not only intended to
point out simple spelling mistakes, cosmetic errors, or interface gaps, but also to point out any bugs
in the application that will result in system crashes or major errors in the application.
By performing acceptance tests on an application, the testing team will reduce how the application
will perform in production. There are also legal and contractual requirements for acceptance of the
system.
Alpha Testing
This test is the first stage of testing and will be performed amongst the teams (developer and QA
teams). Unit testing, integration testing and system testing when combined together is known as
alpha testing. During this phase, the following aspects will be tested in the application −
Spelling Mistakes
Broken Links
Cloudy Directions
The Application will be tested on machines with the lowest specification to test loading times
and any latency problems.
Beta Testing
This test is performed after alpha testing has been successfully performed. In beta testing, a sample
of the intended audience tests the application. Beta testing is also known as pre-release testing.
Beta test versions of software are ideally distributed to a wide audience on the Web, partly to give
the program a "real-world" test and partly to provide a preview of the next release. In this phase, the
audience will be testing the following −
Users will install, run the application and send their feedback to the project team.
Typographical errors, confusing application flow, and even crashes.
Getting the feedback, the project team can fix the problems before releasing the software to
the actual users.
The more issues you fix that solve real user problems, the higher the quality of your
application will be.
Having a higher-quality application when you release it to the general public will increase
customer satisfaction.
Non-Functional Testing
This section is based upon testing an application from its non-functional attributes. Non-functional
testing involves testing a software from the requirements which are nonfunctional in nature but
important such as performance, security, user interface, etc.
Some of the important and commonly used non-functional testing types are discussed below.
Performance Testing
It is mostly used to identify any bottlenecks or performance issues rather than finding bugs in a
software. There are different causes that contribute in lowering the performance of a software −
Network delay
Client-side processing
Database transaction processing
Load balancing between servers
Data rendering
Performance testing is considered as one of the important and mandatory testing type in terms of
the following aspects −
Speed (i.e. Response Time, data rendering and accessing)
Capacity
Stability
Scalability
Performance testing can be either qualitative or quantitative and can be divided into different sub-
types such as Load testing and Stress testing.
Load Testing
It is a process of testing the behavior of a software by applying maximum load in terms of software
accessing and manipulating large input data. It can be done at both normal and peak load
conditions. This type of testing identifies the maximum capacity of software and its behavior at peak
time.
Most of the time, load testing is performed with the help of automated tools such as Load Runner,
AppLoader, IBM Rational Performance Tester, Apache JMeter, Silk Performer, Visual Studio Load
Test, etc.
Virtual users (VUsers) are defined in the automated testing tool and the script is executed to verify
the load testing for the software. The number of users can be increased or decreased concurrently
or incrementally based upon the requirements.
Stress Testing
Stress testing includes testing the behavior of a software under abnormal conditions. For example, it
may include taking away some resources or applying a load beyond the actual load limit.
The aim of stress testing is to test the software by applying the load to the system and taking over
the resources used by the software to identify the breaking point. This testing can be performed by
testing different scenarios such as −
Shutdown or restart of network ports randomly
Turning the database on or off
Running different processes that consume resources such as CPU, memory, server, etc.
Usability Testing
Usability testing is a black-box technique and is used to identify any error(s) and improvements in
the software by observing the users through their usage and operation.
According to Nielsen, usability can be defined in terms of five factors, i.e. efficiency of use, learn-
ability, memory-ability, errors/safety, and satisfaction. According to him, the usability of a product will
be good and the system is usable if it possesses the above factors.
Nigel Bevan and Macleod considered that usability is the quality requirement that can be measured
as the outcome of interactions with a computer system. This requirement can be fulfilled and the
end-user will be satisfied if the intended goals are achieved effectively with the use of proper
resources.
Molich in 2000 stated that a user-friendly system should fulfill the following five goals, i.e., easy to
Learn, easy to remember, efficient to use, satisfactory to use, and easy to understand.
In addition to the different definitions of usability, there are some standards and quality models and
methods that define usability in the form of attributes and sub-attributes such as ISO-9126, ISO-
9241-11, ISO-13407, and IEEE std.610.12, etc.
UI vs Usability Testing
UI testing involves testing the Graphical User Interface of the Software. UI testing ensures that the
GUI functions according to the requirements and tested in terms of color, alignment, size, and other
properties.
On the other hand, usability testing ensures a good and user-friendly GUI that can be easily
handled. UI testing can be considered as a sub-part of usability testing.
Security Testing
Security testing involves testing a software in order to identify any flaws and gaps from security and
vulnerability point of view. Listed below are the main aspects that security testing should ensure −
Confidentiality
Integrity
Authentication
Availability
Authorization
Non-repudiation
Software is secure against known and unknown vulnerabilities
Software data is secure
Software is according to all security regulations
Input checking and validation
SQL insertion attacks
Injection flaws
Session management issues
Cross-site scripting attacks
Buffer overflows vulnerabilities
Directory traversal attacks
Portability Testing
Portability testing includes testing a software with the aim to ensure its reusability and that it can be
moved from another software as well. Following are the strategies that can be used for portability
testing −
Transferring an installed software from one computer to another.
Building executable (.exe) to run the software on different platforms.
Portability testing can be considered as one of the sub-parts of system testing, as this testing type
includes overall testing of a software with respect to its usage over different environments. Computer
hardware, operating systems, and browsers are the major focus of portability testing. Some of the
pre-conditions for portability testing are as follows −
Software should be designed and coded, keeping in mind the portability requirements.
Unit testing has been performed on the associated components.
Integration testing has been performed.
Test environment has been established.
Software Testing - Documentation
Testing documentation involves the documentation of artifacts that should be developed before or
during the testing of Software.
Documentation for software testing helps in estimating the testing effort required, test coverage,
requirement tracking/tracing, etc. This section describes some of the commonly used documented
artifacts related to software testing such as −
Test Plan
Test Scenario
Test Case
Traceability Matrix
Test Plan
A test plan outlines the strategy that will be used to test an application, the resources that will be
used, the test environment in which testing will be performed, and the limitations of the testing and
the schedule of testing activities. Typically the Quality Assurance Team Lead will be responsible for
writing a Test Plan.
A test plan includes the following −
Test Scenario
It is a one line statement that notifies what area in the application will be tested. Test scenarios are
used to ensure that all process flows are tested from end to end. A particular area of an application
can have as little as one test scenario to a few hundred scenarios depending on the magnitude and
complexity of the application.
The terms 'test scenario' and 'test cases' are used interchangeably, however a test scenario has
several steps, whereas a test case has a single step. Viewed from this perspective, test scenarios
are test cases, but they include several test cases and the sequence that they should be executed.
Apart from this, each test is dependent on the output from the previous test.
Test Case
Test cases involve a set of steps, conditions, and inputs that can be used while performing testing
tasks. The main intent of this activity is to ensure whether a software passes or fails in terms of its
functionality and other aspects. There are many types of test cases such as functional, negative,
error, logical test cases, physical test cases, UI test cases, etc.
Furthermore, test cases are written to keep track of the testing coverage of a software. Generally,
there are no formal templates that can be used during test case writing. However, the following
components are always available and included in every test case −
Test case ID
Product module
Product version
Revision history
Purpose
Assumptions
Pre-conditions
Steps
Expected outcome
Actual outcome
Post-conditions
Many test cases can be derived from a single test scenario. In addition, sometimes multiple test
cases are written for a single software which are collectively known as test suites.
Test Case
The test case is defined as a group of conditions under which a tester determines whether a software
application is working as per the customer's requirements or not. Test case designing includes
preconditions, case name, input conditions, and expected result. A test case is a first level action and
derived from test scenarios.
It is an in-details document that contains all possible inputs (positive as well as negative) and the
navigation steps, which are used for the test execution process. Writing of test cases is a one-time
attempt that can be used in the future at the time of regression testing.
Test case gives detailed information about testing strategy, testing process, preconditions, and
expected output. These are executed during the testing process to check whether the software
application is performing the task for that it was developed or not.
Test case helps the tester in defect reporting by linking defect with test case ID. Detailed test case
documentation works as a full proof guard for the testing team because if developer missed
something, then it can be caught during execution of these full-proof test cases.
To write the test case, we must have the requirements to derive the inputs, and the test scenarios
must be written so that we do not miss out on any features for testing. Then we should have the test
case template to maintain the uniformity, or every test engineer follows the same approach to
prepare the test document.
Generally, we will write the test case whenever the developer is busy in writing the code.
o When the customer gives the business needs then, the developer starts developing and says
that they need 3.5 months to build this product.
o And In the meantime, the testing team will start writing the test cases.
o Once it is done, it will send it to the Test Lead for the review process.
o And when the developers finish developing the product, it is handed over to the testing
team.
o The test engineers never look at the requirement while testing the product document
because testing is constant and does not depends on the mood of the person rather than the
quality of the test engineer.
Note: When writing the test case, the actual result should never be written as the product is still being in
the development process. That?s why the actual result should be written only after the execution of the
test cases.
To require consistency in the test case execution: we will see the test case and start testing the
application.
To make sure a better test coverage: for this, we should cover all possible scenarios and document
it, so that we need not remember all the scenarios again and again.
It depends on the process rather than on a person: A test engineer has tested an application
during the first release, second release, and left the company at the time of third release. As the test
engineer understood a module and tested the application thoroughly by deriving many values. If the
person is not there for the third release, it becomes difficult for the new person. Hence all the
derived values are documented so that it can be used in the future.
To avoid giving training for every new test engineer on the product: When the test engineer
leaves, he/she leaves with a lot of knowledge and scenarios. Those scenarios should be documented
so that the new test engineer can test with the given scenarios and also can write the new scenarios.
Note: when the developers are developing the first product for the First release, the test engineer writes
the test cases. And in the second release, when the new features are added, the test engineer writes the
test cases for that also, and in the next release, when the elements are modified, the test engineer will
change the test cases or writes the new test cases as well.
Firstly, we check for which field we will write test cases and then describe accordingly.
In functional testing or if the application is data-driven, we require the input column else; it is a bit
time-consuming.
In this, we should not write something which we already covered in the functional test cases, and
something we have written in the integration test case should not be written in the system test case
again.
When the test engineer writing the test cases, they may need to consider the following aspects:
Note: when we involve fewer numbers of steps or coverage is more, it should be the best test case, and
when these test cases are given to anyone, they will understand easily.
We will write the system test cases for the end-to-end business flows. And we have the entire
modules ready to write the system test cases.
In this, we will understand the application by looking at the requirements or the SRS, which is given
by the customer.
o When the product is launched, what are the possible ways the end-user may use the software
to identify all the possible ways.
o I have documented all possible scenarios in a document, which is called test design/high-
level design.
o The test design is a record having all the possible scenarios.
Convert all the identified scenarios to test claims and group the scenarios related to their features,
prioritize the module, and write test cases by applying test case design techniques and use the
standard test case template, which means that the one which is decided for the project.
Review the test case by giving it to the head of the team and, after that, fix the review feedback given
by the reviewer.
After fixing the test case based on the feedback, send it again for the approval.
Functional Testing:
It is a type of software testing which is used to verify the functionality of the software application,
whether the function is working according to the requirement specification. In functional testing,
each function tested by giving the value, determining the output, and verifying the actual output
with the expected value. Functional testing performed as black-box testing which is presented to
confirm that the functionality of an application or system behaves as we are expecting. It is done to
verify the functionality of the application.
Functional testing also called as black-box testing, because it focuses on application specification
rather than actual code. Tester has to test only the program rather than the system.
The purpose of the functional testing is to check the primary entry function, necessarily usable
function, the flow of screen GUI. Functional testing displays the error message so that the user can
easily navigate throughout the application.
The main objective of functional testing is checking the functionality of the software system. It
concentrates on:
o Basic Usability: Functional Testing involves the usability testing of the system. It checks
whether a user can navigate freely without any difficulty through screens.
o Accessibility: Functional testing test the accessibility of the function.
o Mainline function: It focuses on testing the main feature.
o Error Condition: Function
In this testing, the development team members are included in the testing team to
execute the software's internal design. The working of structural testing is opposite
to Behavioral testing.
In other words, we can say that structural testing tests the different features of an application based
on its types.
Structural testing is also known as white-box testing, glass box testing, and clear-box testing.
Developers mostly implement it to identify the issue and fix them quickly.
The structural testing process requires an in-depth knowledge of the programming language and is
opposite to Functional Testing.
The knowledge of the code's internal executions and how the software is implemented is a necessity
for the test engineer to implement the structural testing.
Throughout the structural testing, the test engineer intends on how the software performs, and it can
be used at all levels of testing.
o Mutation testing
o Data flow testing
o Control flow testing
o Slice-based testing
o Structural testing does not require a lot of manual work as it is an automated process.
o Structural testing is not a time-consuming process.
o All the early defects can easily be identified
o It removes the dead code (extra code) or statements easily.
o It provides easy coding and implementation.
o It delivers detailed testing of the software.
Debugging
To launch an application into the market, it is very necessary to cross-check it multiple times so as to
deliver an error-free product.
When we talk about delivering a bug-free product, then our main concern is all about customer
satisfaction because if you are application is not up to the mark, then eventually it will demolish the
company's reputation in the market.
In this article, we are going to see what makes debugging stand out of the queue and how it is
different from software testing.
o What is Debugging
o Why do we need debugging?
o Steps involved in debugging
o Debugging strategies
o Tools required to debug
What is Debugging?
In the development process of any software, the software program is religiously tested, troubleshot,
and maintained for the sake of delivering bug-free products. There is nothing that is error-free in the
first go.
So, it's an obvious thing to which everyone will relate that as when the software is created, it contains
a lot of errors; the reason being nobody is perfect and getting error in the code is not an issue, but
avoiding it or not preventing it, is an issue!
All those errors and bugs are discarded regularly, so we can conclude that debugging is nothing but
a process of eradicating or fixing the errors contained in a software program.
Debugging works stepwise, starting from identifying the errors, analyzing followed by removing the
errors. Whenever a software fails to deliver the result, we need the software tester to test the
application and solve it.
Since the errors are resolved at each step of debugging in the software testing, so we can conclude
that it is a tiresome and complex task regardless of how efficient the result was.
Debugging Tools
The debugging tool can be understood as a computer program that is used to test and debug
several other programs. Presently, there are many public domain software such as gdb and dbx in
the market, which can be utilized for debugging. These software offers console-based command-line
interfaces. Some of the automated debugging tools include code-based tracers, profilers,
interpreters, etc.
o Radare2
o WinDbg
o Valgrind
Radare2
Radare2 is known for its reverse engineering framework as well as binary analysis. It is made up of a
small set of utilities, either utilized altogether or independently from the command line. It is also
known as r2.
It is constructed around disassembler for computer software for generating assembly language
source code from machine-executable code. It can support a wide range of executable formats for
distinct architectures of processors and operating systems.
WinDbg
WinDbg is a multipurpose debugging tool designed for Microsoft Windows operating system. This
tool can be used to debug the memory dumps created just after the Blue Screen of Death that
further arises when a bug check is issued. Besides, it is also helpful in debugging the user-mode
crash dumps, which is why it is called post-mortem debugging.
Valgrind
The Valgrind exist as a tool suite that offers several debugging and profiling tools to facilitate users
in making faster and accurate program. Memcheck is one of its most popular tools, which can
successfully detect memory-related errors caused in C and C++ programs as it may crash the
program and result in unpredictable behavior.
1. Collection Information:
This step focuses on collecting all possible information (i.e., source design documents,
etc.) about the software.
8. Generate documentation:
Finally, in this step, the complete documentation including SRS, design document,
history, overview, etc. is recorded for future use.
Software Re-engineering
Software Re-engineering is a process of software development which is done to improve the
maintainability of a software system. Re-engineering is the examination and alteration of a
system to reconstitute it in a new form. This process encompasses a combination of sub-
processes like reverse engineering, forward engineering, reconstructing etc.
Re-engineering, also known as reverse engineering or software re-engineering, is the process
of analyzing, designing, and modifying existing software systems to improve their quality,
performance, and maintainability. This can include updating the software to work with new
hardware or software platforms, adding new features, or improving the software’s overall
design and architecture.
Software re-engineering, also known as software restructuring or software renovation, refers
to the process of improving or upgrading existing software systems to improve their quality,
maintainability, or functionality. It involves reusing the existing software artifacts, such as
code, design, and documentation, and transforming them to meet new or updated
requirements.
The primary goal of software re-engineering is to improve the quality and maintainability of
the software system, while minimizing the risks and costs associated with the redevelopment
of the system from scratch. Software re-engineering can be initiated for various reasons, such
as:
1. Improving software quality: Re-engineering can help improve the quality of software by
eliminating defects, improving performance, and enhancing reliability and
maintainability.
2. Updating technology: Re-engineering can help modernize the software system by
updating the technology used to develop, test, and deploy the system.
3. Enhancing functionality: Re-engineering can help enhance the functionality of the
software system by adding new features or improving existing ones.
4. Resolving issues: Re-engineering can help resolve issues related to scalability,
security, or compatibility with other systems.
The process of software re-engineering involves the following steps:
1. Planning: The first step is to plan the re-engineering process, which involves identifying
the reasons for re-engineering, defining the scope, and establishing the goals and
objectives of the process.
2. Analysis: The next step is to analyze the existing system, including the code,
documentation, and other artifacts. This involves identifying the system’s strengths and
weaknesses, as well as any issues that need to be addressed.
3. Design: Based on the analysis, the next step is to design the new or updated software
system. This involves identifying the changes that need to be made and developing a
plan to implement them.
4. Implementation: The next step is to implement the changes by modifying the existing
code, adding new features, and updating the documentation and other artifacts.
5. Testing: Once the changes have been implemented, the software system needs to be
tested to ensure that it meets the new requirements and specifications.
6. Deployment: The final step is to deploy the re-engineered software system and make it
available to end-users.
Overall, software re-engineering can be a cost-effective way to improve the quality and
functionality of existing software systems, while minimizing the risks and costs associated
with starting from scratch.
Re-engineering can be done for a variety of reasons, such as:
To improve the software’s performance and scalability: By analyzing the existing code and
identifying bottlenecks, re-engineering can be used to improve the software’s performance
and scalability.
1. To add new features: Re-engineering can be used to add new features or
functionality to existing software.
2. To support new platforms: Re-engineering can be used to update existing software
to work with new hardware or software platforms.
3. To improve maintainability: Re-engineering can be used to improve the software’s
overall design and architecture, making it easier to maintain and update over time.
4. To meet new regulations and compliance: Re-engineering can be done to ensure
that the software is compliant with new regulations and standards.
5. Re-engineering can be a complex and time-consuming process, and it requires a
thorough understanding of the existing software system. It also requires a structured
and disciplined approach to software development, similar to software engineering.
6. Re-engineering can be beneficial in many cases, it can help to improve the quality,
performance, and maintainability of existing software systems, but it also has its own
drawbacks, such as:
7. High costs: Re-engineering can be a resource-intensive process and can require a
significant investment in tools and training.
8. Risk of introducing new bugs: Changing existing code can introduce new bugs and
compatibility issues.
9. High learning curve: Re-engineering can be complex, and it requires a lot of learning
and training, which can be challenging for new developers.
Software re-engineering, also known as software system re-engineering or software
renovation, is the process of transforming an existing software system into a new system
that meets the changing needs of users or business requirements. Re-engineering
involves analyzing the existing system, identifying its strengths and weaknesses, and
making changes to improve its overall quality, maintainability, and functionality.
The goals of software re-engineering include improving the maintainability, reliability, and
performance of the software system, reducing the cost of maintenance and support, and
extending the useful life of the system. Re-engineering can also involve updating the
technology stack or migrating the system to a new platform or architecture.
1. Assessment: The existing software system is analyzed to identify its strengths and
weaknesses, and to determine the extent of the required re-engineering effort.
2. Planning: A plan is developed to guide the re-engineering effort, including the
identification of goals, objectives, and performance metrics.
3. Requirements analysis: The requirements of the new system are defined based on
user needs and business requirements.
4. Architecture and design: The architecture and design of the new system are
developed, taking into account the requirements of the new system and the limitations
of the existing system.
5. Implementation: The new system is developed and implemented, either by modifying
the existing system or by developing a new system from scratch.
6. Testing: The new system is tested to ensure that it meets the requirements of the new
system and is free from errors and defects.
7. Maintenance: The new system is maintained over time to ensure that it remains
reliable, performant, and secure.
1. Increased development time and cost: Re-engineering requires significant time and
resources, which can increase development costs and delay time-to-market.
2. Risk of introducing new errors or defects: Re-engineering can introduce new errors or
defects into the software system if not done carefully and thoroughly.
3. Overall, software re-engineering can be an effective way to improve the quality and
functionality of an existing software system. However, it is important to carefully assess
the risks and benefits of re-engineering and to plan and execute the re-engineering
effort carefully to ensure a successful outcome.
Several individuals (programs) works together to achieve these common goals. This individual
produces several work product (SC Items) e.g., Intermediate version of modules or test data used
during debugging, parts of the final product.
The elements that comprise all information produced as a part of the software process are
collectively called a software configuration.
As software development progresses, the number of Software Configuration elements (SCI's) grow
rapidly.
These are handled and controlled by SCM. This is where we require software configuration
management.
A configuration of the product refers not only to the product's constituent but also to a particular
version of the component.
o Identify change
o Monitor and control change
o Ensure the proper implementation of change made to the item.
o Auditing and reporting on the change made.
CM is used to essential due to the inventory management, library management, and updation
management of the items essential for the project.
Why do we need Configuration Management?
Multiple people are working on software which is consistently updating. It may be a method where
multiple version, branches, authors are involved in a software project, and the team is geographically
distributed and works concurrently. It changes in user requirements, and policy, budget, schedules
need to be accommodated.
Importance of SCM
It is practical in controlling and managing the access to various SCIs e.g., by preventing the two
members of a team for checking out the same component for modification at the same time.
It provides the tool to ensure that changes are being properly implemented.
It has the capability of describing and storing the various constituent of software.
SCM is used in keeping a system in a consistent state by automatically producing derived version
upon modification of the same component.