[Insight-developers] ITK v4: Best practice for adding test data?
Brad King
brad.king at kitware.com
Wed Jun 8 11:50:04 EDT 2011
On 06/08/2011 10:21 AM, Cory Quammen wrote:
> What is the current best practice for contributing tests with new
> input and baseline images?
>
> Here is what I have in mind for contributing a patch with new test data:
>
> 1). Submit patch to gerrit for first round of feedback. Expect test
> failures on the robot builds for the new tests.
> 2). If gerrit reviews are positive, add test data to the ITK data git
> repository and push.
> 3). Request another round of builds on gerrit using "Request build: all"
> 4). Request another round of reviews. Merge if approved.
> 5). If not approved, back my changes out of the ITK data repository.
>
> Is there a better procedure?
That's what folks have been doing. Kitware will probably demo the new
ExternalData automagic data upload approach at the upcoming meeting.
The approach has very little intrusion on the standard development
workflow. Here is a high-level summary:
- Copy the new image into the local source tree directory
- Reference the image from the itk_add_test call with a
simple DATA{...} wrapper around the path to the file.
- Run CMake, build, and test.
- git add, git commit, git gerrit-push
Note that other than the DATA{} syntax this workflow is no different
from just adding the data file to the source tree with no submodule.
Here is how to try it now. First make sure your development
environment is up to date:
(0) Checkout master and pull the latest upstream version.
Run the developer setup scripts to make sure you have the
latest version of the "git gerrit-push" alias.
Now follow the standard ITK development steps from here:
http://www.itk.org/Wiki/ITK/Git/Develop#Create_a_Topic
During the "edit files" step, do this:
(1) Copy the new baseline image to a "Baseline" directory inside
the module's "test" directory in your source tree, say
"test/Baseline/MyTest.png".
(2) Write the itk_add_test call in the test/CMakeLists.txt file next
to this Baseline directory. Reference the image in the test command
line with a relative path wrapped in DATA{...}:
itk_add_test(NAME MyTest COMMAND ...
--compare DATA{Baseline/MyTest.png} ...)
(3) Run cmake-gui on the build tree and use the "Add Entry" button
to set "ExternalData_LINK_CONTENT" to a STRING with value "MD5".
Configure and generate (then build and run the test). During
configuration you should see a message like
Linked .../test/Baseline/MyTest.png.md5 to ExternalData MD5/...
This means that CMake computed the hash of the data object,
moved the original file out of the way, and left a "content link"
in its place.
Returning to the standard instructions linked, above:
(4) Use "git add" to stage test/Baseline/MyTest.png.md5 and your
changes locally for commit. Then "git commit" them. You should
see another message from the pre-commit hook like
Content link .../test/Baseline/MyTest.png.md5 -> .ExternalData/MD5/...
This means that the pre-commit hook noticed what CMake did in the
previous step, moved the real data file to another local place
under the hood, and added a copy of it to a disjoint/hidden
place in the local Git repository.
(5) Use "git gerrit-push" to send the topic to Gerrit for review as
usual. You can try "git gerrit-push --dry-run" the first time to
see what would happen. You should see output like this:
* ...:refs/data/commits/... [new branch]
* HEAD:refs/for/master/my-topic [new branch]
Pushed refs/data and removed local copy:
MD5/...
This means that the script pushed your topic for review as usual.
It also uploaded the data object behind the scenes to a disjoint
and hidden place in Gerrit (after which a robot will move it to
a more permanent location that ITK knows to check at build time).
Finally some cleanup from this demonstration:
(6) Run cmake-gui on the build tree again and use the "Remove Entry"
button to take out the value added above since it is still
experimental and will be enabled by a different mechanism
later.
-Brad
More information about the Insight-developers
mailing list