The term
software engineering
Software
engineering is the application of principles, skills, and art to the design
and
construction of programs and systems of programs.
Software
engineering is the practical application of scientific knowledge
for the economical
production and use of high-quality software.
Software
is:
Instructions
(computer programs) which when executed, provide desired
function
and performance.
What are
software characteristics?
Software
is logical unlike hardware, which is physical (contains chips,
circuit
boards, power supplies etc.,) Hence its characteristics are
entirely
different.
Software
does not “wear out” …as do hardware components, from
dust,
abuse, temperature and other environmental factors. .
A
software component should be built such that it can be reused in
many
different programs
What is
the 'software Development life cycle'?
Software
life cycle models describe phases of the software cycle and the order
in which
those phases are executed.There are tons of models, and many
companies
adopt their own, but all have very similar patterns.The general, basic
model is
shown below:
General
Life Cycle Model
Testing
Implementation
Design
Requirements
Each
phase produces deliverables required by the next phase in the life
cycle.Requirements
are translated into design.Code is produced during
implementation
that is driven by the design.Testing verifies the
deliverable
of the implementation phase against requirements.
They are:
Requirements:Business
requirements are gathered in this phase.
Meetings
with managers, stake holders and users are held in order to
determine
the requirements.Who is going to use the system?How will they
use the
system?What data should be input into the system? What data
should be
output by the system?how the user interface should work?The
overall
result is the system as a whole and how it performs, not how it is
actually
going to do it.
Design:The
software system design is produced from the results of
the
requirements phase.This is where the details on how the system will
work is
produced.Design focuses on high level design like, what
programs
are needed and how are they going to interact, low-level
design
(how the individual programs are going to work), interface
design
(what are the interfaces going to look like) and data design
(what
data will be required). During these phases, the software's
overall
structure is defined. Analysis and Design are very crucial in
the whole
development cycle. Any glitch in the design phase could be very expensive to
solve in the later stage of the software development.
Coding:
Code is produced from the deliverables of the design phase during
implementation, and this is the longest phase of the software development life
cycle.For a developer, this is the main focus of the life cycle because this is
where the code is produced.Different high level programming languages like C,
C++, Pascal, Java are used for coding. With respect to the type of application,
the right programming language is chosen.Implementation my overlap with both
the design and testing phases.
Testing:During
testing, the implementation is tested against the requirements to make sure
that the product is actually solving the needs addressed and gathered during
the requirements phase.Normally programs are written as a series of individual
modules, the system is tested to ensure that interfaces between modules
work(integration
testing),
the system works on the intended platform and with the expected volume of data
(volume testing) and that the system does what the user requires
(acceptance/beta testing)
Installation,
Operation and maintenance: Software will definitely undergo change once it is
delivered to the customer. There are many reasons for the change. Change could
happen because of some unexpected input values into the system. In addition,
the changes in the system could directly affect the software operations.
Water
Fall Method:
This is
the most common and classic of life cycle models, also referred to as a
linear-sequential life cycle model.It is very simple to understand and use.In a
waterfall model, each phase must be completed in its entirety before the next
phase can begin.At the end of each phase, a review takes place to determine if
the project is on the right path and whether or not to continue or discard the
project.Unlike what I mentioned in
the
general model, phases do not overlap in a waterfall model.
Advantages:
Simple
and easy to use.
Easy to
manage due to the rigidity of the model – each phase has
specific
deliverables and a review process.
Phases
are processed and completed one at a time.
Works
well for smaller projects where requirements are very well understood.
Disadvantages:
1. Time
consuming,
2. Never
backward,
3.
Difficulty responding to change while developing.
4. No
early prototypes of the software are produced.
V- model:
Just like the waterfall model, the V-Shaped life cycle is a
sequential
path of execution of processes.Each phase must be
completed
before the next phase begins.Testing is emphasized in this
model
more so than the waterfall model though.The testing
procedures
are developed early in the life cycle before any coding is
done,
during each of the phases preceding implementation.
Requirements
begin the life cycle model just like the waterfall model.Before development is
started, a system test plan is created.The test plan focuses on meeting the
functionality specified in the requirements gathering.
The
high-level design phase focuses on system architecture and design.An integration
test plan is created in this phase as well in order to test the pieces of the
software systems
ability
to work together.
The
low-level design phase is where the actual software components are designed,
and unit tests are created in this phase as well.
The
implementation phase is, again, where all coding takes place.Once coding is
complete, the path of execution continues up the right side of the V where the
test plans developed earlier are now put to use.
Advantages:
Simple
and easy to use.
Each
phase has specific deliverables.
Higher
chance of success over the waterfall model due to the
development
of test plans early on during the life cycle.
Works
well for small projects where requirements are easily
understood.
Disadvantages:
Very
rigid, like the waterfall model.
Little
flexibility and adjusting scope is difficult and expensive.
Software
is developed during the implementation phase, so no early prototypes of the
software are produced. Incremental Model:The incremental model is an intuitive
approach
to the
waterfall model.Multiple development cycles take place here, making the life
cycle a “multi-waterfall” cycle.Cycles are divided up into smaller, more easily
managed iterations.Each iteration passes through the requirements, design,
implementation and testing phases.
A working version of software is produced
during the first iteration, so you have working software early on during the
software life cycle. Subsequent iterations build on the initial software
produced during the first iteration
Advantages
•
Generates working software quickly and early during the software
life
cycle. • More flexible – less costly to change scope and requirements.
• Easier
to manage risk because risky pieces are identified and
handled
during its iteration. • Each iteration is an easily managed milestone.
Disadvantages
• Each phase of an iteration is rigid and do not overlap each other.
•
Problems may arise pertaining to system architecture because not all
requirements are gathered up front for the entire software life cycle.
The
spiral model:
The spiral model is similar to the incremental
model, with more emphases placed on risk analysis.The spiral model has four
phases: Planning, Risk Analysis, Engineering and Evaluation.A software project
repeatedly passes through these phases in iterations (called Spirals in this
model).The baseline spiral, starting in the planning phase, requirements
are
gathered and risk is assessed.Each subsequent spirals builds on the baseline
spiral.
Requirements are gathered during the planning
phase.In the risk analysis phase, a process is undertaken to identify risk and
alternate solutions.A prototype is produced at the end of the risk analysis
phase.
Software is produced in the engineering phase,
along with testing at the end of the phase.The evaluation phase allows the
customer to evaluate the output of the project to date before the project
continues to the next spiral.
In the spiral model, the angular component
represents progress, and the radius of the spiral represents cost.The spiral
model is intended for large, expensive, and complicated projects.
Advantages
• High amount of risk analysis • Good for large and mission-critical projects.
•
Software is produced early in the software life cycle.
Disadvantages
• Can be a costly model to use. • Risk analysis requires highly specific
expertise. • Project’s success is highly dependent on the risk analysis phase.
• Doesn’t
work well for smaller projects. What are the four components of the Software
Development Process?
a. Plan
b. Do
c. Check
d. Act
What are
common problems in the software development process? 1.Poor requirements :If
requirements are unclear, incomplete, too general, or not testable, there will
be problems.
2.Unrealistic
Schedule:If too much work is crammed in too little time, problems are
inevitable
3.Inadequate
testing:No one will know whether or not the program is any good until the
customer complains or systems crash.
4.Features:A
request to pile on new features after development is underway; extremely
common.
5.Miscommunication:If
developers don't know what's needed or customer's have erroneous expectations,
problems are guaranteed
(or)
Reasons
for defect injections
1.
Incorrect estimations – If effort is not estimated properly, defect injection
rate will increase. 2. Vague requirements - if requirements are unclear,
incomplete, too general, and not testable, there will be problems. 3. Changes
after development - requests to pile on new
features
after development is underway; extremely common. 4. Miscommunication -if
evelopers don't know what's needed or customers' have erroneous expectations,
problems are guaranteed.
Life
Cycle Testing means perform testing in parallel with systems development
Life
Cycle testing-Role of Testers
Concept Phase
Evaluate
Concept Document,
Learn as
much as possible about the product and project
Analyze
Hardware/software Requirements,
Strategic
Planning
Requirement
Phase
Analyze
the Requirements
Verify
the Requirements using the review methods.
Prepare
Test Plan
Identify
and develop requirement based test cases
. Design
Phase,
Analyze
design specifications
Verify
design specifications
Identify
and develop Function based test cases
Begin
performing Usability Tests
. Coding
Phase
Analyze
the code
Verify
the code
Code
Coverage
Unit test
.
Integration & Test Phase
Integration
Test
Function
Test
System
Test
Performance
Test
Review
user manuals
.
Operation/Maintenance Phase
Monitor
Acceptance Test
Develop
new validation tests for confirming problems
Software
TESTING :
The
process of executing computer software in order to determine
whether
the results it produces are correct”, Glass ‘79
“The
process of executing a program with the intent of finding errors”, Myers ’79
A “DESTRUCTIVE”,
yet creative process
Testing
is the measure of software quality”
Testing
is the process of exercising or evaluating a system or system component by
manual or automated means to verify that it satisfies specified requirements,
(or) to identify differences between expected and actual
results."(or)Software testing is an important technique for assessing the
quality of a software product. A purpose of testing is to cause failures in
order to make faults visible [10] so that the faults can be fixed and not be
delivered in the code that goes to customers. Program testing can be used to
show the presence of bugs, but never to show their absence.
1.Testing
is the process of showing the presence of defects.
2.There
is no absolute notion of \correctness".
3.Testing
remains the most cost effective approach to building confidence within most
software systems.
Test
plan:
A test
plan is a systematic approach to testing a system such as a machine or
software.
The plan
typically contains a detailed understanding of what the eventual work flow will
be (or)
The test
plan defines the objectives and scope of the testing effort, and identifies the
methodology
that your team will use to conduct tests. It also identifies the hardware,
software, and tools required for testing and the features and functions that
will be tested. A well-rounded test plan notes any risk factors that jeopardize
testing and includes a testing schedule(or) A test plan is a document
describing the scope, approach, resources,and
schedule
of intended test activities. It identifies test items, the features to be
tested,the testing tasks, who will do each task, and any risks requiring
contingency plans. An important component of the test plan is the individual
test cases. Some form of test plan should be developed prior to any test.
TESTCASE:A
test case is a set of test inputs, execution conditions, and expected results
to determine if a feature of an application is working correctly, such as to
exercise a particular program path or to verify compliance with a specific
requirement. Think diabolically! What are the worst things someone could try to
do to your program? Write test for these.
Testing
process:The test development life cycle contains the following
components/steps:
• System study-Assess
development plan and status
• Collect
SFS/SRS
• Develop
Test plan
• Design
test cases
Tests
specifications:This document includes technicaldetails ( Software requirements
)required prior to thetesting.
• Execute
tests
•
Evaluate tests
•
Evaluate results
•
Acceptance test
•
Document results(defect reports, summary reports)
Recreating
the problem is essentially important intesting so that problems that are
identified can be repeated and corrected.
Testing
strategy:Test Strategy provides the road map describing the
steps to
be undertaken while testing, and the effort, time and resources
required
for the testing.
2.The
test Strategy should incorporate test planning, test case design, test
execution,
resultant data collection and data analysis.
Monkey
Testing:
Testing
the application randomly like hitting keys irregularly and try to
brake
down the system there is no specific test cases and scenarios for monkey
testing
Verification
refers to set of activities that involves reviews and meetings to evaluate
documents, plans, code, requirements and specifications(to ensure that software
correctly implements a specific function, imposed at the start of that phase);
this can be done with checklists, issues lists, and walkthroughs and inspection
meetings.
For
example, in the software for the Monopoly game, we can verify that two players
cannot own the same house.
Validation is the process of evaluating a
system or component during or at the end of the development process to
determine whether it satisfies specified requirements. (or)
Validation
refers to a different set of activities that the software that has been built
is traceable to customer requirements For example, we validate that when a
player lands on “Free Parking,” they get all the money that was collected.
validation always involves
comparison
against requirements. In the language of V&V, black box testing is often
used for
validation
(are we building the right software?) and white box testing is
often
used for verification (are we building the software right?).
Quality
Assurance (QA) The system implemented by
an
organization which assures outside bodies that the data generated is
of proven
and known quality and meets the needs of the end user. This
assurance
relies heavily on documentation of processes, procedures,
capabilities,
and monitoring of such. .
Helps
establish processes
Identifies
weaknesses in processes and improves them
.QA is
the responsibility of the entire team
Quality
Control (QC) Mechanism to ensure that the
required
quality characteristics exist in the finished product (or)
It is a
system of routine technical activities, to measure and control the quality of
the
product as it is being developed..
Quality
control activities may be fully automated, entirely manual, or a
combination
of automated tools and human interaction
.
implements the process. .
Identifies
defects for the primary purpose of correcting defects.
. QC is
the responsibility of the tester. White-Box Testing
White-box testing is a verification technique
software
engineers
can use to examine if their code works as expected or
White-box
test design allows one to peek inside the "box", and it focuses
specifically
on using internal knowledge of the software to guide the selection
of test
data.
The tests
written based on the white box testing strategy incorporate
coverage
of the code written, branches, paths, statements and internal
logic of
the code etc.Test data required for such testing is less exhaustive
than that
of Black Box testing.
White-box
testing is also known as structural testing, clear box testing, and glass box
testing
(Beizer, 1995). The connotations of “clear box” and “glass box” appropriately
indicate
that you have full visibility of the internal workings of the software product,
specifically,
the logic and the structure of the code.
sing the
white-box testing techniques outlined in this chapter, a software engineer can
design
test cases that
(1)
exercise independent paths within a module or unit;
(2) exercise
logical decisions on both their true and false side;
(3)
execute loops at their boundaries and within their operational bounds; and
(4)
exercise internal data structures to ensure their validity
White Box
Testing Techniques
(a)Basis
Path Testing : In most software units, there is a
potentially
(near) infinite number of different paths through the code,
so
complete path coverage is impractical
Cyclomatic
Complexity :
Cyclomatic
complexity is a software metric that provides a quantitative measure of the
logical complexity of a program. When used in the context of a basis path
testing method, the value
computed
for Cyclomatic complexity defines the number for independent paths in the basis
set of a program and provides us an upper bound for the number of tests that
must be conducted to ensure that all statements have been executed at least
once. White-box testing is used for the following types:
1.Unit
testing, This is done to ensure whether a particular module in a system is
working properly.Typically done by the programmer, as it requires detailed
knowledge of the internal program design and code. A unit is a software
component that cannot be subdivided into other components (IEEE, 1990).Unit
testing is important for ensuring the code is solid before it is integrated
with other code. Approximately 65% of all bugs can be caught in unit testing.
May require developing test driver modules or test harnesses.
Testing stubs are frequently used in unit
testing. A stub simulates a module which is being called by the program. This
is very important because most of the called modules are not ready at this
stage.
2.Integration
testing, which is testing in which software components, hardware components, or
both are combined and tested to evaluate the interaction between them (IEEE,
1990). Test cases are written which explicitly examine the interfaces between
the various units.
There are
two common ways to conduct integration testing. · Non-incremental Integration
Testing · Incremental Integration Testing Non-incremental Integration Testing
(big bang or umbrella): All the software units are assembled into the entire
program. This assembly is
then
tested as a whole from the beginning, usually resulting in a chaotic situation,
as the causes of defects are not easily isolated and corrected Incremental
Integration Testing: The program is constructed and tested in small increments
by adding a minimum number of components at each interval. Therefore, the
errors are easier to isolate and correct, and the interfaces are more likely to
be tested completely. There are two common approaches to conduct incremental
integration testing:
·
Top-Down Incremental Integration Testing
·
Bottom-up Incremental Integration Testing
(a)Top-Down
Incremental Integration Testing: The top-down
approach
to integration testing requires the highest-level modules be test and
integrated
first. Modules are integrated from the main module (main program) to the
subordinate modules either in the depth-first or breadth-first manner.
Integration testing starts with the highest-level, control module, or ‘main
program’, with all its subordinates replaced by stubs.
(b)Bottom-up
Incremental Integration Testing: The bottom-up
approach
requires the lowest-level units be tested and integrated first. The lowest
level sub-modules are integrated and tested, then the successively superior
level components are added and tested, transiting the hierarchy from the
bottom, upwards
Scaffolding
is defined as computer programs and data files built to support software
development and testing but not intended to be included in the final product.
Scaffolding code is code that simulates the functions of components that don’t
exist yet and allow the program to execute [16]. Scaffolding code involves the
creation of stubs and test drivers.
Test
driver allows you to call a function and display its return values. Test
drivers are defined as a software module used to involve a module under test
and often, provide test inputs, controls, and monitor execution and report test
results [11]. Test drivers simulate the calling
components
(e.g. hard-coded method calls) river
Module
Under
Test
Stub
Stub
Reso
Module
Under
Test
Stub
Stub
Reso
A stub
returns a value that is sufficient for testing
Stubs are
modules that simulate components that aren’t written yet, formally defined as a
computer program statement substituting for the body of a software module that
is or will be defined elsewhere [11]. For example, you might write a skeleton
of a method with just the method signature and a hard-coded but valid return
value.
Example
-For Unit Testing of ‘Sales Order Printing’ program, a ‘Driver’ program will
have the code which will create Sales Order records using hard coded data and
the call ‘Sales Order Printing’ program. Suppose this printing program uses
another unit whichcalculates Sales discounts by some complex calculations. Then
call to this unit will be replaced by a ‘Stub’, which will simply return fix
discount data.
Mock
objects are temporary substitutes for domain code that emulates the real code.
For example, if the program is to interface with a database, you might not want
to wait for the database to be fully designed and created before you write and
test a partial program. You can create a mock object of the database that the
program can use temporarily. The interface of the mock object and the real
object would be the same.
BLACK BOX
TESTING
Also
known as behavioral, functional, opaque-box, closed-box, concrete box testing.
Test engineer need not know the internal working of the “Black box”. It focuses
on the functionality part of the module. Black box testing is testing against
the specification.Test data needs to be exhaustive in such testing.(or)The test
designer selects valid and invalid input and determines the correct output.
There is no knowledge of the test object's internal structure.While this method
can uncover unimplemented parts of the specification, one cannot be sure that
all existent paths are tested. Testing Strategy: The base of the Black box testing
strategy lies in the selection of appropriate data as per functionality and
testing it against the functional specifications in order to check for normal
and abnormal
behavior
of the system.
Strategies
for Black Box Testing
Ideally, we’d like to test every possible
thing that can be done with our program. But, as we said, writing and executing
test cases is expensive. We want to make sure that we definitely write test
cases for the kinds of things that the customer will do most often or even fairly
often. Our objective is to find as many defects as possible in as few test
cases as possible. To accomplish this objective, we use some strategies that
will be discussed in this subsection. We want to avoid writing redundant test
cases that won’t tell us anything new (because they
have
similar conditions to other test cases we already wrote). Each test case should
probe a different mode of failure. We also want to design the simplest test
cases that could possibly reveal this mode of failure – test cases themselves
can be error-prone if we don’t keep this in mind.
Black Box
Testing Techniques:
1.Error
Guessing:
2.Equivalence
Partitioning:To keep down our testing costs, we don’t
want to
write several test cases that test the same aspect of our program.
A good
test case uncovers a different class of errors (e.g., incorrect
processing
of all character data) than has been uncovered by prior test
cases.
Equivalence partitioning is a strategy that can be used to reduce
the
number of test cases that need to be developed. Equivalence
partitioning
divides the input domain of a program into classes. For each
of these
equivalence classes, the set of data should be treated the same by
the
module under test and should produce the same answer. Test
cases should
be designed so the inputs lie within these equivalence
classes.
Once you have identified these partitions, you choose test cases
from each
partition. To start, choose a typical value somewhere in the
middle of
(or well into) each of these two ranges.
1.To
reduce the number of test cases to a necessary minimum.
2.To
select the right test cases to cover all possible scenarios.
An
additional effect by applying this technique is that you also find
the so
called "dirty" test cases
3.Boundary
Value Analysis:Boris Beizer, well-known author of
testing
book advises, “Bugs lurk in corners and congregate at boundaries.” Programmers
often make mistakes on the boundaries of the equivalence classes/input domain.
As a result, we need to focus testing at these boundaries. This type of testing
is called Boundary Value
Analysis
(BVA) and guides you to create test cases at the “edge” of the equivalence
classes. Boundary value is defined as a data value that corresponds to a
minimum or maximum
When creating BVA test cases, consider the
following [17]:
1. If
input conditions have a range from a to b (such as a=100 to b=300),
create
test
cases:
.
immediately below a (99)
. at a
(100)
immediately
above a (101)
.
immediately below b (299)
. at b
(300)
. immediately
above b (301)
2.If
input conditions specify a number of values that are allowed, test
these
limits. For example, input conditions specify that only one train is
allowed
to start in each direction on each station. In testing, try to add a
second train
to the same station/same direction. If (somehow) three trains
could
start on one station/direction, try to add two trains (pass), three
trains
(pass), and four trains (fail).
Decision
Table Testing:
Decision tables are used to record complex
business rules that must be implemented in the program, and therefore tested. A
sample decision table is found in Table 7. In the table, the conditions
represent possible input conditions. The actions are the events that should
trigger,
depending upon the makeup of the input conditions. Each column in the table is
a unique combination of input conditions (and is called a rule) that result in
triggering the action(s) associated with the rule. Each rule (or column) should
become a test case. If a Player (A) lands on property owned by another player
(B), A must pay rent to B. If A does not have enough money to pay B, A is out
of the game.
Decision
table:
Rule 1
Rule 2 Rule 3 Conditions
A lands
on B’s property Yes Yes No A has enough money to pay rent Yes No ---Actions
A stays
in game Yes No Yes
Black Box
Testing Types:
(0)Integration
testing – This involves testing of combined parts of an application to
determine if they function together correctly. The 'parts' can be code modules,
individual applications, client and server applications on a network, etc. This
type of testing is especially relevant to client/server and distributed
systems.
(1)Functional
Testing:
Function
testing is used to find out differences between the program
and its
external specifications. Testing that ignores the internal
mechanism
or structure of a system or component and focuses on the
outputs
generated in response to selected inputs and execution
conditions.
This stage will include Validation Testing.
(2)Smoke
Testing(sanity testing):
Smoke is
the initial level of testing effort to determine if the new software version is
performing well enough for its major level of testing effort. The Smoke test
scenarios should emphasize breadth more than depth. All components should be
touched, and every major
feature
should be tested briefly. This is normally done when a change in program is
made and the tester wants to ensure that this change has not impacted the
program at some other location. A subset of the regression test cases can be set
aside as smoke tests. A smoke test is a group of test cases that establish that
the system is stable and all major functionality is present and works under
“normal” conditions. The purpose of smoke tests is to demonstrate stability,
not to find bugs with the system. (or)
Sanity
Testing is performed to test validate the stabilityof the build ( software
application under test). Undersanity testing we check whether the application
is readilyaccessible and the check for basic functionalities. Once this are
verified we go ahead with the test case execution. We start when the build
released
(3)Exploratory
Testing( ad-hoc): Exploratory Tests are categorized under Black Box Tests and
are aimed at testing in conditions when sufficient time is not available for testing
or proper documentation is not available. This type of testing is done without
any formal Test Plan or Test Case creation..With ad hoc testing, people just
start trying anything they can think of without any rational road map through
the customer requirements.Requires highly skilled resources who can smell
errors.(or) A type of testing where we explore software, write and execute the
test scripts simultaneously.
Exploratory
testing is a type of testing where tester does not have specifically planned
test cases, but he/she does the testing more with a point-of-view to explore
the software features and tries to break it in order to find out unknown bugs.
Exploratory
Testing is a learn and work type of testing activity where a tester can at
least learn more and understand the software if at all he/she was not able to
reveal any potential bug
The only
limit to the extent to which you can perform exploratory testing is your
imagination and creativity, more you can think of ways to explore, understand
the software, more test cases you will be able write and execute
simultaneously. For smaller groups or projects, an ad-hoc process is more
appropriate
Advantages of Exploratory Testing:
• It helps testers in learning new strategies,
expand the horizon of their imagination that helps them in understanding &
executing more and more test cases and finally improve their productivity.
•
Exploratory testing helps tester in confirming that he/she understands the
application and its functionality properly and has no confusion about the
working of even a smallest part of it, hence covering the most important part
of requirement understanding.
• As in
case of exploratory testing, we write and execute the test cases
simultaneously. It helps in collecting result oriented test scripts and shading
of load of unnecessary test cases which do not yield and result.
(4)Regression
Testing Rerunning test cases which a program has previously executed correctly
in order to detect errors spawned by changes or corrections made during
software evelopment and maintenance. Ensures that changes have not propagated
unintended
side
affects.(or)
Regression
testing, which is selective retesting of a system or component to verify that
modifications have not caused unintended effects and that the system or
component still complies with its specified requirements This is a more
detailed kind of testing which starts once the application passes the Smoke
testing. Most of the time the testing team is asked to check last minute
changes in the code just before making a release to the client, in this
situation
the testing team needs to check only the affected areas. Regression tests are a
subset of the original set of test cases. The purpose of running the regression
test case is to make a “spot check” to examine whether the new code works
properly and has not damaged any previously-working functionality by
propagating unintended side effects.
Most often, it is impractical to re-run all
the test cases when changes are made. Since egression tests are run throughout
the development cycle, there can be white box regression tests at the unit and
integration levels and black box tests at the integration, function, ystem,
and
acceptance test levels. The Regression test suit contains different classes of
test cases:
(a)Retesting:Tests
that focus on the software components that have
been
changed.(or)
Retesting
In the
Test Execution if we come across any bugs for that will be reported to the
Development. Once the bugsare fixed in the subsequent build the bugs that are
fixed will be RETESTED. This is Retesting.
REGRESSION
TESTING
In the
regression testing instead of validating the bugs that were fixed , we validate
the impact of bugs on the dependent functionalities.....
(b)Regional
Regression Testing:
(c)Full
Regression Testing: Tests that will exercise all software functions
(5)System
Testing:
System
testing concentrates on testing the complete system with a variety of
techniques and methods. This is done to compare the program against its
original objectives. (or),
System
testing involves putting the new program in many different environments to
ensure the program works in typical customer environments with various versions
and types of operating systems
Various
type of system testing are: (a)Compatibility Testing(portability
testing):Testing whether the system is compatible with other systems with which
it should
communicate.
when you develop applications on one platform, you need to check if
the
application works on other operating systems as well. This is the
main goal
of Compatibility Testing.
(b)Recovery
Testing:
Testing
aimed at verifying the system's ability to recover from varying degrees of
failure. Testing how well a system recovers from crashes, hardware failures, or
other catastrophic problems.(or) Recovery testing is basically done in order to
check how fast and better the application can recover against any type of crash
or hardware failure etc. Type or extent of recovery is specified in the
requirement specifications
(c)Security
Testing:
Security
testing attempts to verify that protection mechanisms built into a system will,
in fact, protect it from improper penetration. During Security testing,
password cracking, unauthorized entry into the software, network security are
all taken into consideration.It is
done to
check the security objectives of a program. This testing might not be required
in some cases.
(6)Usability
Testing( UI testing): Usability is the degree to which a user can easily learn
and use a product to achieve a goal. A simpler description is testing the
software from a user’s point of view.This is done to check whether the user
interfaces are proper, output of the program is relevant
Are the
communication device(s) designed in a manner such that the information is
displayed in a understandable fashion enabling the operator to correctly
interact with the system?
(7)Performance
Testing: This is done to validate whether the output of a particular program is
given
within a particular time period. In general, we want to measure the Response
Time, Throughput, and Utilization of the Web site while simulating attempts by
virtual users to simultaneously access the site. One of the main objectives of
performance testing is to
maintain
a Web site with low response time, high throuhput, and low utilization.(or)
Testing
conducted to evaluate the compliance of a system or component with specified
performance requirements . To continue the
above
example, a performance requirement might state that the price lookup must
complete in less than 1 second. Performance testing evaluates whether the
system can look up prices in less than 1 second (even if there are 30 cash
registers running simultaneously).
(a)Response
Time
Response
Time is the delay experienced when a request is made to the server and the
server's response to the client is received. It is usually measured in units of
time, such as seconds or milliseconds.
(b)Throughput
Throughput
refers to the number of client requests processed within a certain unit of
time. Typically, the unit of measurement is requests per second or pages per
second. From a marketing perspective, throughput may also be measured in terms
of visitors per day or page
views per
day,
(c)Utilization
Utilization
refers to the usage level of different system resources, such as the server's
CPU(s), memory, network bandwidth, and so forth. It is usually measured as a
percentage of the maximum available level of the specific resource. Utilization
versus user load for a Web server typically produces a curve, as shown in
Figure
Types of
performance testing: Load testing:Load
testing is defined as the testing to
determine
whether the system is capable of handling anticipated number of users or not.
The objective of load testing is to check whether the system can perform well
for specified load. The system may be capable of accommodating more than 1000
concurrent users. But, validating that is not under the scope of load testing.
No attempt is made to determine how many more concurrent users the system is capable
of servicing. .
Stress
testing:Unlike load testing where testing is conducted for specified number of
users, stress testing is conducted for the number of concurrent users beyond
the specified limit. The
objective
is to identify the maximum number of users the system can handle before
breaking down or degrading drastically. Since the aim is to put more stress on
system,
think
time of the user is ignored and the system is exposed to excess oad
Let us
take the same example of on line shopping application to illustrate the
objective of stress testing. It determines the maximum number of concurrent
users an on line system can service which can be beyond 1000 users (specified
limit). However, there is a possibility
that the
maximum load that can be handled by the system may found to be same as the
anticipated limit. .
Volume
Testing:Volume Testing, as its name implies, is testing that purposely subjects
a system (both hardware and software) to a series of tests where the volume of
data being
processed
is the subject of the test. Such systems can be transactions processing systems
capturing real time sales or could be database updates and or data retrieval.
Volume Testing is to find weaknesses in the system with respect to its handling
of large amounts of data during short time periods.This is an expensive type of
testing and done only when it is essential.
Scalability testing We perform scalability
testing to determine how effectively your Web
site will
expand to accommodate an increasing load. Scalability testing allows you to
plan Web site capacity improvements as your business grows and to anticipate
problems that could cost you revenue down the line. Scalability testing also
reveals when your site
cannot
maintain good performance at higher usage levels, even with increased capacity.
(8)Installation
Testing
Installation
testing is often the most under tested area in testing. This type of testing is
performed to ensure that all Installed features and options function properly.
It is also performed to verify that all necessary components of the application
are, indeed, installed. The Uninstallation of the product also needs to be
tested to ensure that all data, executables, and DLL files are removed.
(9)Alpha
Testing
Alpha
testing happens at the development site just before the roll out of the
application to the customer. Alpha tests are conducted replicating the live
environment where the application would be installed and running. A software
prototype stage when the software is first available for run. Here the software
has the core functionalities in it but complete functionality is not aimed at.
It would be able to accept inputs and give outputs. The test is conducted at
the developer’s site only.
In a
software development cycle, depending on the functionalities the number of
alpha phases required is laid down in the project plan itself.
During
this, the testing is not a through one, since only the prototype of the
software is available. Basic installation – uninstallation tests, the completed
core functionalities are tested.
(10)Acceptance
testing (UAT or Beta testing) :-also called beta testing, application testing,
and end user testing -is a phase of software development in which the software
is tested in the "real world" by the intended audience. UAT can be
done by in-house
testing
in which volunteers use the software by making the test version available for
downloading and free trial over the Web .The experiences of the early users are
forwarded back to the developers who make final changes before releasing the
software commercially.
It is the
formal means by which we ensure that the new system or process does actually
meet the essential user requirements. Acceptance testing allows customers to
ensure that
the
system meets their business requirements. In fact, depending on how your other
tests were performed, this final test may not always be necessary. If the
customers and users participated in system tests, such as requirements testing
and usability testing, they may not need to perform a formal acceptance test.
However, this additional test willprobably be required for the customer to give
final approval for the system.
The
actual acceptance test follows the general approach of the Acceptance Test
Plan. After the test is completed, the customer either accepts the system or
identifies further changes that
are
required. After these subsequent changes are completed, either the entire test
is performed again or just those portions in question are retested.
Results
of these tests will allow both the customers and the developers to be confident
that the system will work as intended.
11.Robustness
testing:Test cases are chosen outside the domain to test robustness to
unexpected, erroneous input.
12.Defensive
testing:Which includes tests under both normal and abnormal conditions
13.Soak
testing (Endurance testing):
It is performed by running high volume of data
for a prolonged period. This is to check the behavior of a system on a busy
day. Normally this kind of testing is a must for banking products.
14.End to
End Testing - This is the testing of a complete application environment in a
situation that simulates actual use, such as interacting with other
applications if applicable
However,
methods with very straightforward functionality, for example, getter and setter
methods, don't need unit tests unless they do their getting and setting in some
"interesting" way. A good guideline to follow is to write a unit test
whenever you feel the need to comment some behavior in the code. If you're like
many programmers who aren't fond of commenting code, unit tests are a way of
documenting your code behavior. Avoid using domain objects in unit tests While
writing unit tests, I have used the following guidelines to determine if the
unit test
being
written is actually a functional test:
• If a
unit test crosses class boundaries, it might be a functional test.
• If a
unit test is becoming very complicated, it might be a functional test.
• If a
unit test is fragile (that is, it is a valid test but it has to change
continually to
handle
different user permutations), it might be a functonal test.
• If a
unit test is harder to write than the code it is testing, it might be a
functional
test.
Conclusion
Unit tests are written from the developer's perspective and focus on particular
methods of the class under test. Use these guidelines when writing unit
tests:
Write the
unit test before writing code for class it tests.
• Capture
code comments in unit tests.
• Test
all the public methods that perform an "interesting" function (that
is, not getters and setters, unless they do their getting and setting in some
unique way).
• Put
each test case in the same package as the class it's testing to gain access to
package
and protected members.
• Avoid
using domain-specific objects in unit tests.
Functional
tests are written from the user's perspective and focus on system behavior.
After there is a suite of functional tests for the system, the members of the
development team responsible for functional testing should bombard the system
with variations of the initial tests.
• A test
case suite is simply a table of contents for the individual test cases
•
Organizing the suite of test cases by priority, functional area, actor,
business object, or release can help identify parts of the system that need
additional test cases.
• We can
test the application for Negative testing by giving the invalid inputs...for
example in order to testing pin for ATM it only accepts 4 lettered PIN...try
giving 3 lettered or 5-lettered.... all zeroes and so on....... What is meant
by Framework?Is the framework related only to AUTOMATIO or else it will
applicable to MANUAL testing too?
a)
Framework is nothing but how to execute the testcase process
b) That
is clearly what steps I will follow to thegiven test cases
(or) Frame Work means, what type of actions or
process we rfollowing before going to test the applications.....insimple words
we can say "Architecture".it will beapplicable for both, but in terms
of terminologywe use only for automation. Whether we write one test case for
one use case? Some use cases are very simple so that only one test caseis
required to cover the functionality many times use casesare very complicated so
that a lot of test cases are
required
to cover the whole functionalityexample:"use case->Applicant login the
screen
This use
case needs a minimum of 10 test cases id to cover the whole functionality
In a
nutshell, the aim of a bug report is to enable the programmer to see the
program failing in front of them. You can either show them in person, or give
them careful and detailed
instructions
on how to make it fail. If they can make it fail, they will try to gather extra
information until they know the cause. If they can't make it fail, they will
have to ask you to gather that information for them.
In bug
reports, try to make very clear what are actual facts ("I was at the
computer and this happened") and what are speculations ("I think the
problem might be this"). Leave out speculations if you want to, but don't
leave out facts.
They
don't know what's happened, and they can't get close enough to watch it
happening for themselves, so they are searching for clues that might give it
away. Error messages, incomprehensible strings of numbers, and even unexplained
delays are all just as important as fingerprints at the scene of a crime. Keep
them!
If you
manage to get out of the problem, whether by closing down the affected program
or by rebooting the computer, a good thing to do is to try to make it happen
again. Programmers like problems that they can reproduce more than once. Happy
programmers fix bugs
faster
and more efficiently. you describe the symptoms, the actual discomforts and
aches and pains and rashes and fevers, and you let the doctor do the diagnosis of
what the problem is and what to do about it. Otherwise the doctor dismisses you
as a hypochondriac or crackpot, and quite rightly so.
It's the same with programmers. Providing your
own diagnosis might be helpful sometimes, but always state the symptoms. The
diagnosis is an optional extra, and not an alternative to
giving
the symptoms. Equally, sending a modification to the code to fix the problem is
a useful addition to a bug report but not an adequate substitute for one.
If a
programmer asks you for extra information, don't make it up! Somebody reported
a bug to me once, and I asked him to try a command that I knew wouldn't work.
The reason I asked him to try it was that I wanted to know which of two
different error messages it would give. Knowing which error message came back
would give a vital
clue. But
he didn't actually try it -he just mailed me back and said "No, that won't
work". It took me some time to persuade him to try it for real.
Say
"intermittent fault" to any programmer and watch their face fall. The
easy problems are the ones where performing a simple sequence of actions will
cause the failure to occur. The
programmer
can then repeat those actions under closely observed test conditions and watch
what happens in great detail. Too many problems simply don't work that way:
there will be programs that fail once a week, or fail once in a blue moon, or
never fail when you try them n front of the programmer but always fail when you
have a deadline coming up.
Most
intermittent faults are not truly intermittent. Most of them have some logic
somewhere. Some might occur when the machine is running out of memory, some
might occur when another program tries to modify a critical file at the wrong
moment, and some might occur only in the first half of every hour! (I've
actually seen one of these.) Also, if you can reproduce the bug but the
programmer can't, it could very well be that their computer and your computer
are different in some way and this difference is causing the problem. I had a
program once whose window curled up into a little ball in the top left corner
of the
screen,
and sat there and sulked. But it only did it on 800x600 screens; it was fine on
my 1024x768 monitor
• Be
specific. If you can do the same thing two different ways, state which one you
used. "I selected Load" might mean "I clicked on Load" or
"I pressed Alt-L". Say which you did. Sometimes it matters.
• Be
verbose. Give more information rather than less. If you say too much, the
programmer can ignore some of it. If you say too little, they have to come back
and ask more questions. One bug report I received was a single sentence; every
time I asked for more
information,
the reporter would reply with another single sentence. It took me several weeks
to get a useful amount of information, because it turned up one short sentence
at a time.
• Be
careful of pronouns. Don't use words like "it", or references like
"the window", when it's unclear what they mean. Consider this:
"I started FooApp. It put up a warning window. I tried to close it and it
crashed." It isn't clear what the user tried to close. Did they try to
close the warning window, or the whole of FooApp? It makes a difference.
Instead, you could say "I started FooApp, which put up a warning window. I
tried to close the warning window, and FooApp crashed." This is longer and
more repetitive, but also clearer and less easy to misunderstand.
• Read
what you wrote. Read the report back to yourself,and see if you think it's
clear. If you have listed a sequence of actions which should produce the
failure, try following them yourself, to see if you missed a step.
Summary
• The
first aim of a bug report is to let the programmer see the failure with their
own eyes. If you can't be with them to make it fail in front of them, give them
detailed instructions so that they can make it fail for themselves.
• In case
the first aim doesn't succeed, and the programmer can't see it failing
themselves, the second aim of a bug report is to describe what went wrong.
Describe everything in detail. State what you saw, and also state what you
expected to see. Write down the error messages, especially if they have numbers
in.
• When your computer does something
unexpected, freeze. Do nothing until you're calm, and don't do anything that
you think might be dangerous.
• By all
means try to diagnose the fault yourself if you think you can, but if you do,
you should still report the symptoms as well.
• Be
ready to provide extra information if the programmer needs it. If they didn't
need it, they wouldn't be asking for it. They aren't being deliberately
awkward. Have version numbers at your fingertips, because they will probably be
needed.
• Write
clearly. Say what you mean, and make sure it can't be misinterpreted.
• Above
all, be precise. Programmers like precision. Don't write titles like these:
1."Can't
install" - Why can't you install? What happens when you try to install?
2."Severe
Performance Problems" - ...and they occur when you do what?
3."back
button does not work" - Ever? At all?
Good bug
titles:
1."1.0
upgrade installation fails if Mozilla M18 package
present"
- Explains problem and the context.
2."RPM
4 installer crashes if launched on Red Hat 6.2 (RPM
3)
system" - Explains what happens, and the context.
What are
the different types of Bugs we normally see in any of the
Project?
Include the severity as well.
1. User
Interface Defects -------------------------------- Low
2.
Boundary Related Defects ------------------------------- Medium
3. Error
Handling Defects --------------------------------- Medium
4.
Calculation Defects ------------------------------------ High
5.
Improper Service Levels (Control flow defects) --------- High
6.
Interpreting Data Defects ------------------------------ High
7. Race
Conditions (Compatibility and Intersystem defects)- High
8. Load
Conditions (Memory Leakages under load) ----------- High
9.
Hardware Failures:-------------------------------------- High
(or)
1)GUI
Related(spelling mistake,non-uniformity of text
box,
colors)--Low--P3
2)Functionality
related--Medium--P2
3)System/application
crashes---High---P1
Generally
high priority defect are those on basis of those
build may
be rejected
BUG LIFE
CYCLE:
The Life
Cycle of a bug in general context is:
So let me
explain in terms of a tester's perspective:
A tester
finds a new defect/bug, so using a defect tracking tool logs it.
1. Its
status is 'NEW' and assigns to the respective Dev team (Team lead
orManager).
2. The
team lead assigns it to the team member, so the status is
'ASSIGNED
TO'
3. The
developer works on the bug fixes it and re-assigns to the tester for
testing.
Now the status is 'RE-ASSIGNED'
4. The
tester, check if the defect is fixed, if its fixed he changes the status
to
'VERIFIED'
5. If the
tester has the authority (depends on the company) he can after
verifying
change the status to 'FIXED'. If not the test lead can verify it
and
change the status to 'fixed'.
6. If the
defect is not fixed he re-assigns the defect back to the Dev team
for
re-fixing.
So this
is the life cycle of a bug.
Bug
status description:
These are
various stages of bug life cycle. The status caption may vary
depending
on the bug tracking system you are using.
1) New:
When QA files new bug.
2)
Deferred: If the bug is not related to current build or can not be fixed
in this
release or bug is not important to fix immediately then the project
manager
can set the bug status as deferred.
3)
Assigned: ‘Assigned to’ field is set by project lead or manager and
assigns
bug to developer.
4)
Resolved/Fixed: When developer makes necessary code changes and
verifies
the changes then he/she can make bug status as ‘Fixed’ and the
bug is
passed to testing team.
5) Could
not reproduce: If developer is not able to reproduce the bug by
the steps
given in bug report by QA then developer can mark the bug as
‘CNR’. QA
needs action to check if bug is reproduced and can assign to
developer
with detailed reproducing steps.
6) Need
more information: If developer is not clear about the bug
reproduce
steps provided by QA to reproduce the bug, then he/she can
mark it
as “Need more information’. In this case QA needs to add
detailed
reproducing steps and assign bug back to dev for fix.
7)
Reopen: If QA is not satisfy with the fix and if bug is still
reproducible
even after fix then QA can mark it as ‘Reopen’ so that
developer
can take appropriate action.
8 )
Closed: If bug is verified by the QA team and if the fix is ok and
problem
is solved then QA can mark bug as ‘Closed’.
9)
Rejected/Invalid: Some times developer or team lead can mark the
bug as
Rejected or invalid if the system is working according to
specifications
and bug is just due to some misinterpretation.
LIFE
CYCLE OF SOFTWARE TESTING:
·
Requirement gathering: Includes collecting requirements, functional
specifications, and other necessary documents
• Obtain
end dates for completion of testing
•
Identify resources and their responsibilities, required standards
and
processes.
•
Identify application's high risk area, prioritize testing, and
determine
scope and assumptions of testing
•
Determine test strategy and types of testing to be used –
Smoke,
System, Performance etc
•
Determine hardware and software requirements
•
Determine test data requirements
• Divide
the testing into various tasks
•
Schedule testing process
• Create
test cases: A test case is a document that describes an input, action, or event
and an expected response, to determine if a feature of an application is
working correctly.
• Review
the test cases
•
Finalize test environment and test data. Make sure the test environment is
separated from development environment.
• Get and
install software deliveries (basically the developed application)
• Perform
tests using the test cases available
• Analyze
and inform results
• The
defect needs to be informed and assigned to programmers
who can
fix those.
• Track
reported defects till closure
• Perform
another cycle/s if needed : After the defects is fixed,
the
program needs to be re-tested, for the fix done and also to
confirm
that defect fixing has not injected some other defect.
• Update
test cases, test environment, and test data through
life
cycle as per the change in requirements, if any.
What is
an inspection?
A: An
inspection is a formal meeting, more formalized than a walk-through and
typically
consists
of 3-10 people including a moderator, reader (the author of whatever is being
reviewed)
and a recorder (to make notes in the document). The subject of the inspection
is
typically a document, such as a requirements document or a test plan. The
purpose of
an
inspection is to find problems and see what is missing, not to fix anything.
The result
of the
meeting should be documented in a written report.
What
makes a good test engineer?
A: A person
is a good test engineer if he
• Has a
"test to break" attitude,
• Takes
the point of view of the customer,
• Has a
strong desire for quality,
• Has an
attention to detail, He's also
• Tactful
and diplomatic and
• Has
good a communication skill, both oral and written. And he
• Has
previous software development experience, too. Good test engineers have a
"test to break" attitude, they take the point of view of the
customer, have a strong desire for quality and an attention to detail.
AND In case
of GOOD QUALITY ASSURANCE ENGINEERS (Good QA engineers),they need
to
understand the entire software development process and how it fits into the
business
approach
and the goals of the organization. Communication skills and the ability to
understand
various sides of issues are important.
What
makes a good QA/Test Manager?
A:
QA/Test Managers are familiar with the software development process; able to
maintain
enthusiasm of their team and promote a positive atmosphere; able to promote
teamwork
to increase productivity; able to promote cooperation between Software and
Test/QA
Engineers
How do you know when to stop testing?
A: This
can be difficult to determine. Many modern software applications are so complex
and run
in such an interdependent environment, that complete testing can never be
done.
Common factors in deciding when to stop are...
•
Deadlines, e.g. release deadlines, testing deadlines;
• Test
cases completed with certain percentage passed;
Test
budget has been depleted;
•Coverage
of code, functionality, or requirements reaches a specified point;
• Bug
rate falls below a certain level; or
• Beta or
alpha testing period ends.
What if
there isn't enough time for thorough testing?
A: Since
it's rarely possible to test every possible aspect of an application, every
possible
combination
of events, every dependency, or everything that could go wrong, risk
analysis
is appropriate to most software development projects. Use risk analysis to
determine
where testing should be focused. This requires judgment skills, common
sense and
experience. The checklist should include answers to the following questions:
• Which
functionality is most important to the project's intended purpose?
• Which
functionality is most visible to the user?
• Which
functionality has the largest safety impact?
• Which
functionality has the largest financial impact on users?
• Which
aspects of the application are most important to the customer?
• Which
aspects of the application can be tested early in the development cycle?
• Which
parts of the code are most complex and thus most subject to errors?
• Which
parts of the application were developed in rush or panic mode?
• Which
aspects of similar/related previous projects caused problems?
• Which
aspects of similar/related previous projects had large maintenance
expense?
• Which
parts of the requirements and design are unclear or poorly thought out?
• What do
the developers think are the highest-risk aspects of the application?
• What
kinds of problems would cause the worst publicity?
• What
kinds of problems would cause the most customer service complaints?
• What
kinds of tests could easily cover multiple functionalities?
• Which
tests will have the best high-risk-coverage to time-required ratio?
Reliability
of a software system is defined as the probability that this
system
fulfills a function (determined by the specifications) for a
specified
number of input trials under specified input conditions in a
specified
time interval (assuming that hardware and input are free of
errors).
A
software system is robust if the consequences of an error in its
operation,
in the input, or in the hardware, in relation to a given application, are
inversely proportional to the probability of the occurrence of this error in
the given application.
.
Frequent errors (e.g. erroneous commands, typing errors) must be handled with
particular care . Less frequent errors (e.g. power failure) can be handled more
laxly, but still must not lead to irreversible consequences.
Thanks for sharing valuable information and very well explained.
ReplyDeleteETL Testing Online Training
ETL Testing Certification