No Binaries in the Codebase
Binary data shouldn't be a part of the codebase. This is pretty well-known practice. But how to proceed when we do need binaries in our codebase, for instance as test data?
The solution is straight-forward: Pack binary resources into an artifact separated from the codebase in a repository.
A good practice is to use a special classifier for all the artifacts of this kind, for instance testdata
.
After uploading the resources artifact into a repository (manually or via an API), we can use it as a dependency in our codebase (Maven):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
< plugin > < groupId >org.apache.maven.plugins</ groupId > < artifactId >maven-dependency-plugin</ artifactId > < executions > < execution > < id >unpack-test-resources</ id > < phase >process-test-resources</ phase > < goals > < goal >unpack</ goal > </ goals > < configuration > < outputDirectory >${project.build.directory}/test-classes</ outputDirectory > < artifactItems > < artifactItem > < groupId >com.ttulka.samples.testdata</ groupId > < artifactId >sample-test-resources</ artifactId > < version >1.0.0</ version > < classifier >testdata</ classifier > < type >zip</ type > </ artifactItem > </ artifactItems > </ configuration > </ execution > </ executions > </ plugin > |
The Maven plugin will download and unpack the resources into the test classpath before the test are actually executed.
Binaries are then available in the codebase (Java):
1 |
this .getClass().getResource( "/resource1.dat" ); |
Another good practice is to create a domain-based resources structure inside the artifacts. Just put the resources into a sub-folder:
domainA.zip ┕ domainA/ ┕ resource1.dat ┕ resource2.dat
This organization enables composition of resources in the integration testing.
The example code could be found in my GitHub.
Happy resourcing!