Software testing can be seen as a mean of ensuring software quality. There are many ways to test a system. There are low-level and high-level tests, which we can classify in white-box testing and black-box testing, respectively.
White-box testing is executed directly on the code and they are often meant for the system programmer, a example of this type of test is the unit tests. However, black-box testing is executed considering a functional manner, where the tester doesn't have direct contact with the system code. The system, in this case, is considered a input-output box. Often, this kind of tests is performed for a specific testing team: they use the specification to make the test case guide.
The more common kind of Black-box tests are functional and acceptance tests, which is similar to functional testing, but defined by the client. There's also gray-box tests, it’s like white-box and black-box at the same time. As examples of gray-box tests, we have regression and integration tests.
References:
WILLIAMS, M., SUCCI, G. e MARCHESI, L. Traditional and Agile Software Engineering. Ch 8 - Black Box Testing. Ed. Addison-Wesley, 2003