Assertion is used to validate some state that your code assume that is true. 
In other words if the assertion fails your app world had collapse (or maybe just a bug).
This is in opposite to an error that you can handle (i.e. wrong user input).
For example, lets say that you asked the user for it's phone number. You should not assert if the phone number format is wrong, instead you should check it and respond accordingly (error code or display error message).
On the other side, lets say that you are storing the phone number in a database. When your app loads you connect to the db and from there on you are writing and reading from it, assuming the connection is live.
If you are writing a method that suppose to store the phone number in the db you should not write code to check the connection of the database, instead you may add assert to check that the connection is live.
That way in development mode you will have a nice readable stack trace if you ever (for some reason) run into a situation where the db was not available at the time of the assert.
Role of thumb: you should assert for things that you relay that are correct and should have no good reason not to be