[Mono-list] Some random notes about writing tests
Martin Baulig
martin@gnome.org
01 Mar 2002 23:59:09 +0100
Hi guys,
after doing the testing work for several days on Linux I start to get a feeling
about how to write good tests - and I also found examples for bad tests. So I
try to write a little style guide here.
1.) Constructors
When writing your testcase, please make sure to provide a constructor which
takes no arguments:
public class DateTimeTest : TestCase
{
public DateTimeTest() : base ("MonoTests.System.DateTimeTest") {}
public DateTimeTest (string name): base(name) {}
public static ITest Suite
{
get {
TestSuite suite = new TestSuite ();
return suite;
}
}
}
This is important since we derive from the DateTimeTest class in the automatically
generated TheTests.cs like this:
public class RunDateTimeTest : DateTimeTest
{
protected override void RunTest ()
{
// ....
}
}
2.) Don't compare two values with Assert(), always use AssertEquals() - this gives you
a better feeling what went wrong when the test fails.
Bad:
Assert ("A01", myTicks[0] == t1.Ticks);
Good:
AssertEquals ("A01", myTicks[0], t1.Ticks);
3.) Use unique labels for your Assert* () statements - the label is to tell you _which_
test failed, not _what_ failed.
Bad:
AssertEquals("array match", compare[0], i1[0]);
AssertEquals("array match", compare[1], i1[1]);
AssertEquals("array match", compare[2], i1[2]);
AssertEquals("array match", compare[3], i1[3]);
Good:
AssertEquals("#A01", compare[0], i1[0]);
AssertEquals("#A02", compare[1], i1[1]);
AssertEquals("#A03", compare[2], i1[2]);
AssertEquals("#A04", compare[3], i1[3]);
Remember, you get a test report which looks like this:
2) MonoTests.System.ArrayTest(MonoTests.System.RunArrayTest) "array match"
And now how do you find out which of the 4 AssertEquals failed.
Better is
2) MonoTests.System.ArrayTest(MonoTests.System.RunArrayTest) "#A03"
It's also much easier to write "ArrayTest/A03" failed in a bug report.
4.) Don't change the labels after they're in use.
If you already have
Assert ("#A01", something);
Assert ("#A02", something_else);
and want to insert something between them, choose a new number but don't rename the
existing ones - people might be using the labels in bug reports, Bugzilla or on
mailing lists and get confused if bug ArrayTest/A02 is suddently something else.
That's it for the moment. Comments, suggestions, feedback is very welcome :-)
Hmm, maybe we should put this document into CVS and edit it there.
--
Martin Baulig
martin@gnome.org