A lot of it depends on how you write your tests.
Of late I’ve been an increasing fan of Spring Boot. One of the things i can do here — and it’s not only Spring Boot, I’ve done similar in nodejs too — is to start the app up as part of the integration tests, run the tests against this in memory version, then shut it down.
Doing this in conjunction with an “embedded” database (or one started purely for the duration of the tests) puts test data firmly in your control.
I then like to do all of these tests using cucumber, which ends up emphasising a larger number of small tests. Each test covers one scenario of one feature, which helps make them more resilient and faster to debug.