Black box testing takes an external perspective of the test object to
derive test cases. These tests can be functional or non-functional, though
usually functional. The test designer selects valid and invalid input and
determines the correct output. There is no knowledge of the test object's
internal structure.
This method of test design is applicable to all levels of software testing:
unit, integration, functional testing, system and acceptance. The higher the
level, and hence the bigger and more complex the box, the more one is forced to
use black box testing to simplify. While this method can uncover unimplemented
parts of the specification, one cannot be sure that all existent paths are
tested.