Although testing can determine the correctness of software under the assumption of some specific hypotheses

Although testing can determine the correctness of software under the assumption of some specific
hypotheses (see hierarchy of testing difficulty below), testing cannot identify all the defects within
software.2 Instead, it furnishes a criticism or comparison that compares the state and behavior of the
product against test oracles—principles or mechanisms by which someone might recognize a problem.
These oracles may include (but are not limited to) specifications, contracts,3 comparable products, past
versions of the same product, inferences about intended or expected purpose, user or customer
expectations, relevant standards, applicable laws, or other criteria.
A primary purpose of testing is to detect software failures so that defects may be discovered and
corrected. Testing cannot establish that a product functions properly under all conditions, but only that it
does not function properly under specific conditions.4 The scope of software testing often includes
examination of code as well as execution of that code in various environments and conditions as well as
examining the aspects of code: does it do what it is supposed to do and do what it needs to do. In the
current culture of software development, a testing organization may be separate from the development
team. There are various roles for testing team members. Information derived from software testing may
be used to correct the process by which software is developed.5:41–43
Every software product has a target audience. For example, the audience for video game software is
completely different from banking software. Therefore, when an organization develops or otherwise
invests in a software product, it can assess whether the software product will be acceptable to its end
users, its target audience, its purchasers and other stakeholders. Software testing aids the process of
attempting to make this assessment.
A fundamental problem with software testing is that testing under all combinations of inputs and
preconditions (initial state) is not feasible, even with a simple product.4:17–187 This means that the
number of defects in a software product can be very large and defects that occur infrequently are
difficult to find in testing. More significantly, non-functional dimensions of quality (how it is supposed
to be versus what it is supposed to do)—usability, scalability, performance, compatibility, reliability—can
be highly subjective; something that constitutes sufficient value to one person may be intolerable to
another.
Software developers can’t test everything, but they can use combinatorial test design to identify the
minimum number of tests needed to get the coverage they want. Combinatorial test design enables
users to get greater test coverage with fewer tests. Whether they are looking for speed or test depth,
they can use combinatorial test design methods to build structured variation into their test cases