As Andrew says, normally the TestDataBuilder/TestObjectBuilder patterns are probably the cleanest way to do this, especially when dealing with integration tests. Anything else (csvs, databases etc...) introduce an extra level of indirection.
However, if you're in the .Net world I would strongly urge you to take a look at AutoFixture which automates these patterns (and a whole lot more), and in many cases can auto generate your test data for you. For example here's a snippet:
var fixture = new Fixture();
var expectedUsers = fixture.CreateMany<User>(3);
This generates 3 users with pseudorandom values automatically based on pre-defined or customizable algorithms.
Using AutoFixture, for the majority of tests, you no longer need to worry about the contents of the test data, you can just use the auto generated test data it provides you.
If your not in the .Net world, there may be similar frameworks available for test data generation.