Understand design specifications - Identify IO ports of the design and see what they mean and how they have to be modeled. See what bus protocols are in use, how many clocks, reset, and other pins are available. Read design documentation and note down all major features of the design, categorize into buckets. The more you understand the design the better you'll know how to construct your testbench. Example questions you should ask are how many agents you need, how do you want to scoreboard, what is critical to check, etc.
Next, identify some base level tests that will exercise your design. Try to probe how you can apply stimulus and what testbench components you may need to do so. How you can use scoreboards to check functionality.
Develop some basic testbench components to get started, write some basic tests. Remember to follow guidelines to aid reusability and structure your code as much as possible. This usually does take some time as new requirements are understood and it basically evolves over a period of time.
Run few tests, and then write checkers for the tests. Keep developing tests and reusing code to test all functionalities of the design.
After you think you have done all you need, you can run and dump coverage and analyze to see if you need more test stimulus.
Keep doing these steps, and most importantly think on all the different scenarios that may affect your design.