In general, strive to make UI tests more horizontal(end to end , not deep) and lower level tests more vertical(in depth).

In my automation journey,  I learned few hard lessons in UI tests as below:

 - Have fewer UI tests, as straightforward and simple.
- Don't cover same verifications in multiple tests 
- Let every test pass and fail for *one and only one reason* , focused tests.
- Don't  try to rebuild complex application logic in tests  otherwise they are prone to same bugs as application itself.
- Strive to be broad , not deep.
-  Review them regularly  and don't hesitate to throw the ones which don't add value anymore. ([Sunk Cost Theory][1] )


  [1]: https://en.m.wikipedia.org/wiki/Sunk_cost