Software Testing Methods
Software Testing Methods
net
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 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.
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 is when the tester has access to the internal data structures and
algorithms including the code that implement these.
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:
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.
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.
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
testing may be performed as part of the hand-off process between any two
phases of development.[citation needed]
Alpha testing
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]
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.
Destructive testing
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]
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]
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.
Testing Tools
Program testing and fault detection can be aided significantly by testing tools and
debuggers. Testing/debug tools include features such as:
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
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
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.