Software testing means to determine whether the software meets the requirements.
Requirements in natural language, however, are not suitable as the basis of a test. ("Well, the thing must not crash" or "If I enter 100, a particular result must be calculated").
Moreover, it is not possible to precisely describe complex applications.
To test software, it is important to split the large complexity of an application into small testable fragments (= functions / procedures). These fragments should then perform exactly ONE task. You then describe:
- which fragment ( Module, Class, Function, Sub ) do I test - which input value( preconditions ) do I need - which output value ( postconditions ) do I expect
It may be necessary to revise existing sourcecode and split it into smaller testable parts.