As mentioned in other comments the first step involved would be to analyze the product and the requirement, once you understand what the product is expected to do and the scope of testing, the process usually evolves as follows:
Where we navigate and use the product to understand more about the 'system under test'. Here we learn about the product and also identifies possible test scenarios that could be applicable to the test context ("As testing is context dependent,all possible scenarios won't be applicable to all products")
A test approach were tester tries to break the system using random actions without much knowledge about the product. Monkey testing can be dumb, smart or brilliant, were each of this defines the product and domain knowledge level of the tester.
A focused approach to break the system using the product design and requirements that were learned from the above mentioned approaches.
API Functional and non-functional testing (Integration testing):
This is the systematic approach were you develop testcases for functional testing of the APIs. The test cases are usually made for manual and then automated, or could be automated straight away as in TDD approach.
GUI testing (System testing)
A systematic approach to test the system in order to ensure that the system works as a whole after integrating all systems together. UI automation, manual test cases all come under this.
Testing approaches to ensure system robustness through Security, Stress, and Load testing
Note: Non-functional testing can be incorporated in any test levels. Not necessarily after system test
We use smoke testing and sanity testing mostly for making sure the build we get for testing is qualified enough for further rigorous testing. It is not done for an application that we don't have any idea of.
A test approach which tests only the critical functionality of the system to make sure these critical functionalities are stable and does not break.
it usually carried out as an entry criteria validation ( a criterion that defines whether further testing should be done). Here all the common functions like page navigation, login, etc are tested to ensure that the product works fine and can be used for further rigorous testing
Testing done to verify that fix for one feature does not break another. So you will run tests to cover all the features and make sure they are working fine after adding or fixing something
Testing a defect fix to verify that the reported defect/issue is really fixed