When a unit test requires a few setup steps, we can just include those steps in the test case before our assertion. For example, we may want to create some entries in a database or configure a service before we execute a test.
When the setup is more complex, it can clutter the test case, making the intent of the test harder to understand while increasing the effort required to maintain the test code. Even if the setup steps are short, if they are repeated in many places, duplication of code can lead to similar problems.
It is common for a setup to require cleanup or teardown steps to ensure tests don't interfere with each other. For example, if we added a few records to a database in a setup phase, we want to remove those records so that subsequent tests start off with a clean environment. Again, we can simply include the teardown steps in the test case after our assertion. This poses even larger problems than setup, because in addition to the issues of clutter and lower maintainability...