perlmeditation
markjugg
testing
<strong>The problem</strong>: automating tested of a data-driven application requires creating test data to run the test, and removing the test data again when the test is finished.
<p>
<strong>The goal</strong>: Make the data clean up process automatic. The data should be cleaned up without an explicit call to a clean up function, and it should work even if the test script dies half-way through.
<p>
<strong>The solution</strong>: As part of creating the test data, keep track of the IDs of the data created in a package-scoped array. Use an END {} block to call the cleanup function, using the the package-scoped array to know what to clean up. The END block gets called when the script is exiting, even if it is "die"'ing.
<p>
<strong>Some example pseudo-code</strong>:
<p>
<code>
our @IDS_TO_DELETE;
sub create_test_widget {
my $widget = Widget->new;
push @IDS_TO_DELETE, $widget->id;
return $widget;
}
sub delete_test_widgets {
for my $id (@IDS_TO_DELETE) {
Widget->delete($id);
}
}
END { delete_test_widgets(); }
</code>
<p>
There you have it. Now just by creating some test data, it will automatically be removed when test is finished. I suggest putting a pair of functions like this in a private testing module and then importing the test data creation function.
<p>
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-20513">
<P>
[markjugg|Mark Stosberg]
</div></div>