In my early programming days at TOPdesk, communication with the Testing department was deceptively easy: throw the feature over the wall, and some time later receive a notification that it was okay (or not). Luckily we learned that the easy way is not always the best way, and we introduced scrum and agile techniques.
This shortened the lines of communication and the contact between programmers and testers became a lot more intensive. We started discussing the story details and the biggest risks together. With everything written down, while the programmers were writing the code, the testers could already start writing test specifications. Next to writing unit and component tests, the programmer could already do some manual testing themselves based on these specifications, before leaving it to the tester to take a second critical look.
Not long after, we introduced automated GUI tests, on top of our unit and component tests. This did not only increase our test coverage, but also our confidence in that all features were tested well. As the automation frameworks took over the repetitive work of clicking through the GUI, the testers were able to do a smarter job, thinking about what should be tested exactly.