TotT: EXPECT vs. ASSERT
Because the Google C++ Testing Framework was opensourced last week, there will be episodes focusing on it published here in the future. Watch for them. I've reshuffled the schedule to get one out this week.




Google C++ Testing Framework supports two families of assertions with the same interface:
- ASSERT: Fails fast, aborting the current function.
- EXPECT: Continues after the failure.
As Moka the code monkey has shown Uni the testing robot, EXPECT is often more appropriate because it: reveals more failures in a single run, and allows more to be fixed in a single edit/compile/run-tests cycle. Example:
TEST(WordStemmerTest, StemsPluralSuffixes) {
EXPECT_STREQ("jump", stemmer->Stem("jumps"));
EXPECT_STREQ("pixi", stemmer->Stem("pixies"));
EXPECT_STREQ("prioriti", stemmer->Stem("priorities"));
// etc ...
}
Use ASSERT when it doesn't make sense to continue. Example:
TEST(FileGeneratorTest, CreatesFileContainingSequenceOfChars) {
ASSERT_TRUE(fp = fopen(path, "r"))
<< "Failed to open " << path;
ASSERT_EQ(10, fread(buffer, 1, 10, fp))
<< "File " << path << " is too small";
buffer[10] = '\0';
EXPECT_STREQ("123456789", buffer)
<< "File " << path << " is corrupted";
}
I would argue that there is no need for EXPECT (or at least, this is not a good demonstration of the need). If your method does not work for *any* test it should fail, and that defect should be fixed and tested before you fix another, otherwise you might be chasing your tail trying to figure out which change to the code might have introduced another defect. One fix at a time. It insures boolean accuracy when fixing defects, and supports agile development.
ReplyDeleteI agree, you should only *fix* one bug at a time. BUT Knowing which tests pass and which ones fail can give you a hint what the underlying bug is. It definitely helps to have more hints than fewer hints. It is best to use EXPECT over ASSERT if the tests are orthogonal, and use ASSERT over EXPECT if they are dependent.
DeleteI have a fundamental, probably naive, question: in "ASSERT: Fails fast, aborting the current function", what exactly is "the current function"?
ReplyDeletePerhaps you could give an explicit example.
For instance in your ASSERT sample, what is the function aborted in the assert:
ASSERT_TRUE(fp = fopen(path, "r"))
<< "Failed to open " << path;
Is it really the Test "FileGeneratorTest" that is aborted and not some "function"?
Peter Schwenn
The current TEST(...) function.
Delete