If you really want to write tests that interact with a database - integration tests - then you will have to put your database in a known state before each test execution.
One way to do this would be to load custom dataset before each test, for example using DbUnit. Here, each test is responsible of his own data, there is no cleanup required and you can query the database after a failed test to understand the problem.
Another way would be to use a "live" database and to run tests inside a transaction and to rollback the changes at the end of the test. Spring and Unitils have support for this. This works well too but it's not always easy to diagnose a failed test when using this approach.
Note that the second approach doesn't really exclude the first one, you can use custom dataset inside a transaction. Also note that you can use a database containing "reference data" (i.e. read-only data like countries, etc) and only load "dynamic data" to speed up things when using the first approach.
Personally, I don't really see what's wrong with the former approach (except maybe that tests are a bit slower), tools like DbUnit make it quite easy. And as I said, I find tests using DbUnit easier to diagnose. But the later approach definitely works too.
In both case you should of course use a dedicated schema1.
1 Actually, using one schema per developer is definitely a best practice.