I've worked in companies both with and without friction between developers and testers. Friction is, more often than not, a result of developers doing a poor job and not checking their work before sending it to QA.
This can be mitigated by the dev team as follows:
- Always make changes in a new branch so that poor quality code doesn't snowball.
- Always have your code peer reviewed before submitting it to QA. (It is up to the team leader to ensure everyone regularly contributes to peer code reviews.)
- Always include unit, functional, and/or integration tests with your code. (They should be peer reviewed with the rest of your code.)
- Use a continuous integration system (e.g. Bamboo, Jenkins, Travis, etc.) to ensure broken branches cannot be merged.
- Don't merge your branch into the mainline branch (typically
develop) until after it has passed QA, so that your change can be tested in isolation.
- Regularly version your mainline branch and, before doing so, have all changes associated with the upcoming version regression tested, in case any of those changes have an impact on each other.
It also helps to have a dev team with strong leadership and no incompetent devs.