In my opinion, a good functional test can be represented like this:
Therefore, a test case takes an system under test in some well-defined state, performs some actions, which transfer a system into another state, and then verifies that the final state is correct.
Thus, in a test case we need to specify the following:
- Initial state
- Actions to perform
- Expected final state