Software Testing methods
The box approach
Software
testing methods are traditionally divided into black box testing
and white box testing.
These two approaches are used to describe the point of view that a test
engineer takes when designing test cases.
Black box testing
Black box testing
treats the software as a "black box"—without any knowledge of
internal implementation. Black box testing methods include: equivalence
partitioning, boundary value
analysis, all-pairs testing,
fuzz testing, model-based testing,
traceability matrix,
exploratory testing
and specification-based testing.
Specification-based testing:
Specification-based testing aims to test the functionality of software
according to the applicable requirements.[21] Thus, the tester inputs data into,
and only sees the output from, the test object. This level of testing usually
requires thorough test cases to be provided to the tester, who then can simply
verify that for a given input, the output value (or behavior), either
"is" or "is not" the same as the expected value specified
in the test case.
Specification-based testing is
necessary, but it is insufficient to guard against certain risks.[22]
Advantages and disadvantages: The
black box tester has no "bonds" with the code, and a tester's
perception is very simple: a code must have bugs. Using the principle,
"Ask and you shall receive," black box testers find bugs where
programmers do not. But, on the other hand, black box testing has been
said to be "like a walk in a dark labyrinth without a flashlight,"
because the tester doesn't know how the software being tested was actually
constructed. As a result, there are situations when (1) a tester writes many
test cases to check something that could have been tested by only one test
case, and/or (2) some parts of the back-end are not tested at all.
Therefore,
black box testing has the advantage of "an unaffiliated opinion," on
the one hand, and the disadvantage of "blind exploring," on the
other. [23]
White box testing
White box testing
is when the tester has access to the internal data structures and algorithms including
the code that implement these.
Types of white box testing
The following types of white
box testing exist:
·
API
testing (application programming interface) - Testing of the application using
Public and Private APIs
·
Code coverage
- creating tests to satisfy some criteria of code coverage (e.g., the test designer
can create tests to cause all statements in the program to be executed at least
once)
·
Fault injection
methods - improving the coverage of a test by introducing faults to test code
paths
·
Mutation testing
methods
·
Static testing
- White box testing includes all static testing
Test coverage
White box testing methods can
also be used to evaluate the completeness of a test suite that was created with
black box testing methods. This allows the software team to examine parts of a
system that are rarely tested and ensures that the most important function points have been tested.[24]
Two common forms of code
coverage are:
·
Function coverage, which
reports on functions executed
·
Statement coverage, which
reports on the number of lines executed to complete the test
They
both return a code coverage metric, measured as a percentage.
Grey Box Testing
Grey box testing (American spelling: Gray
box testing) involves having access to internal data structures and
algorithms for purposes of designing the test cases, but testing at the user,
or black-box level. Manipulating input data and formatting output do not
qualify as grey box, because the input and output are clearly outside of the
"black-box" that we are calling the system under test. This
distinction is particularly important when conducting integration testing
between two modules of code written by two different developers, where only the
interfaces are exposed for test. However, modifying a data repository does
qualify as grey box, as the user would not normally be able to change the data
outside of the system under test. Grey box testing may also include reverse engineering
to determine, for instance, boundary values or error messages.
Testing Levels
Tests
are frequently grouped by where they are added in the software development
process, or by the level of specificity of the test.
Unit Testing
Unit testing refers to tests that verify the
functionality of a specific section of code, usually at the function level. In
an object-oriented environment, this is usually at the class level, and the
minimal unit tests include the constructors and destructors.[25]These type of tests are usually written by developers as they work on code (white-box style), to ensure that the specific function is working as expected. One function might have multiple tests, to catch corner cases or other branches in the code. Unit testing alone cannot verify the functionality of a piece of software, but rather is used to assure that the building blocks the software uses work independently of each other.
Unit testing is also called Component Testing.
Integration Testing
Integration testing is any type of software
testing that seeks to verify the interfaces between components against a
software design. Software components may be integrated in an iterative way or
all together ("big bang"). Normally the former is considered a better
practice since it allows interface issues to be localised more quickly and
fixed.Integration testing works to expose defects in the interfaces and interaction between integrated components (modules). Progressively larger groups of tested software components corresponding to elements of the architectural design are integrated and tested until the software works as a system.
System Testing
System testing tests a completely integrated
system to verify that it meets its requirements.
System Integration Testing
System integration
testing verifies that a system is integrated to any external or
third party systems defined in the system requirements.[citation needed]
Regression Testing
Regression testing focuses on finding defects
after a major code change has occurred. Specifically, it seeks to uncover software
regressions, or old bugs that have come back. Such regressions occur
whenever software functionality that was previously working correctly stops
working as intended. Typically, regressions occur as an unintended consequence
of program changes, when the newly developed part of the software collides with
the previously existing code. Common methods of regression testing include
re-running previously run tests and checking whether previously fixed faults
have re-emerged. The depth of testing depends on the phase in the release
process and the risk of
the added features. They can either be complete, for changes added late in the
release or deemed to be risky, to very shallow, consisting of positive tests on
each feature, if the changes are early in the release or deemed to be of low
risk.
Acceptance testing
Acceptance
testing can mean one of two things:- A smoke test is used as an acceptance test
prior to introducing a new build to the main testing process, i.e. before integration
or regression.
- Acceptance
testing performed by the customer, often in their lab environment on their
own HW, is known as user acceptance
testing (UAT). Acceptance testing may be performed as part of
the hand-off process between any two phases of development.[citation
needed]
Alpha testing
Alpha testing is simulated or actual operational testing
by potential users/customers or an independent test team at the developers'
site. Alpha testing is often employed for off-the-shelf software as a form of
internal acceptance testing, before the software goes to beta testing.[citation needed]
Beta testing
Beta testing comes after alpha testing. Versions of the
software, known as beta versions, are
released to a limited audience outside of the programming team. The software is
released to groups of people so that further testing can ensure the product has
few faults or bugs. Sometimes, beta
versions are made available to the open public to increase the feedback field to a maximal number of future
users.[citation needed]
Non Functional Software Testing
Special
methods exist to test non-functional aspects of software. In contrast to
functional testing, which establishes the correct operation of the software
(correct in that it matches the expected behavior defined in the design
requirements), non-functional testing verifies that the software functions
properly even when it receives invalid or unexpected inputs. Software fault injection, in the form of fuzzing, is an example of non-functional
testing. Non-functional testing, especially for software, is designed to establish
whether the device under test can tolerate invalid or unexpected inputs,
thereby establishing the robustness of input validation routines as well as
error-handling routines. Various commercial non-functional testing tools are
linked from the Software fault
injection page; there are also numerous open-source and free
software tools available that perform non-functional testing.
Software performance testing and load testing
Performance
testing is executed to determine how fast a system or sub-system
performs under a particular workload. It can also serve to validate and verify
other quality attributes of the system, such as scalability, reliability and
resource usage. Load testing is
primarily concerned with testing that can continue to operate under a specific
load, whether that be large quantities of data or a large number of users. This is generally referred to as software
scalability. The related load testing activity
of when performed as a non-functional activity is often referred to as Endurance
Testing.Volume testing is a way to test functionality. Stress testing is a way to test reliability. Load testing is a way to test performance. There is little agreement on what the specific goals of load testing are. The terms load testing, performance testing, reliability testing, and volume testing, are often used interchangeably.
Stability testing
Stability testing checks to see if the software
can continuously function well in or above an acceptable period. This activity
of Non Functional Software Testing is oftentimes referred to as load (or endurance) testing.
Usability testing
Usability testing is needed to check if the user
interface is easy to use and understand.
Security testing
Security testing is essential for software that
processes confidential data to prevent system intrusion
by hackers.
Internationalization and localization
Internationalization
and localization is needed to test these aspects of software, for
which a pseudolocalization
method can be used. It will verify that the application still works, even after
it has been translated into a new language or adapted for a new culture (such
as different currencies or time zones).
Destructive testing
Destructive
testing attempts to cause the software or a sub-system to fail, in order to
test its robustness.
The testing process
Traditional CMMI
or waterfall development model
A
common practice of software testing is that testing is performed by an
independent group of testers after the functionality is developed, before it is
shipped to the customer.[28] This practice often results in the
testing phase being used as a project
buffer to compensate for project delays, thereby compromising the time devoted
to testing.[29]Another practice is to start software testing at the same moment the project starts and it is a continuous process until the project finishes.[30]
Agile or Extreme development model
In
counterpoint, some emerging software disciplines such as extreme
programming and the agile software
development movement, adhere to a "test-driven software
development" model. In this process, unit tests are written first, by the software
engineers (often with pair programming in the extreme programming
methodology). Of course these tests fail initially; as they are expected to.
Then as code is written it passes incrementally larger portions of the test
suites. The test suites are continuously updated as new failure conditions and
corner cases are discovered, and they are integrated with any regression tests
that are developed. Unit tests are maintained along with the rest of the
software source code and generally integrated into the build process (with
inherently interactive tests being relegated to a partially manual build
acceptance process). The ultimate goal of this test process is to achieve continuous deployment
where software updates can be published to the public frequently. [31] [32]
A sample testing cycle
Although
variations exist between organizations, there is a typical cycle for testing[33]. The sample below is common among
organizations employing the Waterfall development
model.- Requirements
analysis: Testing should begin in the requirements phase
of the software
development life cycle. During the design phase, testers work
with developers in determining what aspects of a design are testable and
with what parameters those tests work.
- Test planning: Test strategy, test plan, testbed creation. Since many activities
will be carried out during testing, a plan is needed.
- Test
development:
Test procedures, test scenarios,
test cases, test datasets, test scripts to
use in testing software.
- Test execution: Testers
execute the software based on the plans and tests and report any errors
found to the development team.
- Test reporting: Once testing
is completed, testers generate metrics and make final reports on their test effort and whether or not the software
tested is ready for release.
- Test result
analysis:
Or Defect Analysis, is done by the development team usually along with the
client, in order to decide what defects should be treated, fixed, rejected
(i.e. found software working properly) or deferred to be dealt with later.
- Defect
Retesting:
Once a defect has been dealt with by the development team, it is retested
by the testing team. AKA Resolution
testing.
- Regression
testing:
It is common to have a small test program built of a subset of tests, for
each integration of new, modified, or fixed software, in order to ensure
that the latest delivery has not ruined anything, and that the software
product as a whole is still working correctly.
- Test Closure: Once the
test meets the exit criteria, the activities such as capturing the key
outputs, lessons learned, results, logs, documents related to the project
are archived and used as a reference for future projects.
Automated testing
Many
programming groups are relying more and more on automated testing, especially groups that use Test-driven
development. There are many frameworks to write tests in, and Continuous Integration
software will run tests automatically every time code is checked into a version control system.While automation cannot reproduce everything that a human can do (and all the strange ways they think of to do it), it can be very useful for regression testing. However, it does require a well-developed test suite of testing scripts in order to be truly useful.
Testing Tools
Program
testing and fault detection can be aided significantly by testing tools and debuggers. Testing/debug tools include features
such as:- Program
monitors, permitting full or partial monitoring of program code including:
- Instruction
Set Simulator, permitting complete instruction level
monitoring and trace facilities
- Program animation,
permitting step-by-step execution and conditional breakpoint at source level or in machine code
- Code coverage reports
- Formatted dump or Symbolic debugging,
tools allowing inspection of program variables on error or at chosen
points
- Automated
functional GUI testing tools are used to repeat system-level tests through
the GUI
- Benchmarks,
allowing run-time performance comparisons to be made
- Performance
analysis (or profiling tools) that can help to highlight hot spots and resource usage
Measuring software testing
Usually,
quality is constrained to such topics as correctness, completeness, security,[citation needed]
but can also include more technical requirements as described under the ISO
standard ISO 9126, such as capability, reliability,
efficiency,
portability, maintainability, compatibility, and usability.There are a number of common software measures, often called "metrics", which are used to measure the state of the software or the adequacy of the testing.
Testing artifacts
Software
testing process can produce several artifacts.
Test plan
A test specification is called
a test plan. The developers are well aware what
test plans will be executed and this information is made available to
management and the developers. The idea is to make them more cautious when
developing their code or making additional changes. Some companies have a
higher-level document called a test strategy.
Traceability matrix
A traceability matrix
is a table that correlates requirements or design documents to test documents.
It is used to change tests when the source documents are changed, or to verify
that the test results are correct.
Test case
A test case normally consists of a unique
identifier, requirement references from a design specification, preconditions,
events, a series of steps (also known as actions) to follow, input, output,
expected result, and actual result. Clinically defined a test case is an input
and an expected result.[34] This can be as pragmatic as 'for
condition x your derived result is y', whereas other test cases described in
more detail the input scenario and what results might be expected. It can
occasionally be a series of steps (but often steps are contained in a separate
test procedure that can be exercised against multiple test cases, as a matter
of economy) but with one expected result or expected outcome. The optional
fields are a test case ID, test step, or order of execution number, related
requirement(s), depth, test category, author, and check boxes for whether the
test is automatable and has been automated. Larger test cases may also contain
prerequisite states or steps, and descriptions. A test case should also contain
a place for the actual result. These steps can be stored in a word processor
document, spreadsheet, database, or other common repository. In a database
system, you may also be able to see past test results, who generated the
results, and what system configuration was used to generate those results.
These past results would usually be stored in a separate table.
Test script
The test script is the combination of a test case,
test procedure, and test data. Initially the term was derived from the product
of work created by automated regression test tools. Today, test scripts can be
manual, automated, or a combination of both.
Test suite
The most common term for a
collection of test cases is a test suite. The test
suite often also contains more detailed instructions or goals for each
collection of test cases. It definitely contains a section where the tester
identifies the system configuration used during testing. A group of test cases
may also contain prerequisite states or steps, and descriptions of the
following tests.
Test data
In most cases, multiple sets of
values or data are used to test the same functionality of a particular feature.
All the test values and changeable environmental components are collected in
separate files and stored as test data. It is also useful to provide this data
to the client and with the product or a project.
Test harness
The software, tools, samples of
data input and output, and configurations are all referred to collectively as a
test harness.
No comments:
Post a Comment