Well technically speaking an assert normally gets compiled out of release builds so you wouldn't see them operate in code running in production. That said, you may still put them in to your application code as a kind of inline unit test so that they still do operate whilst your code is running in development/testing.
Normally unit tests run bits of application code and then check that certain things are true using asserts. That said there is still sometimes a reason to use an assert within the application code because, most importantly, a unit test can fail from an assert in the unit test code or an assert in the application code being tested.
Consider that you write a unit test that runs a contrived sequence of operations on your application that you suspect could theoretically cause bad things to happen. You might not have an easy way, from the scope unit test, to probe into your application classes to check if something is going wrong and there might be an easier alternative in adding the assert into the application code directly.
Sometimes I write unit tests without an assert in the unit test itself, simply to attempt (and hopefully fail) to invoke one that I put in the application.
And a final note - asserts are not the same as exceptions. Exceptions are used for still expected (rare) behaviour and this can still be tested for as unit tests can be written to expect exceptions. Assertions are used for impossible unexpected behaviour and hence associated with the core concept of unit testing.