Should your test code be subject to the same standards as your production code? I believe there should be different sets of standards. I am collecting interesting idioms that are normally shunned in good production code, but are acceptable and advantageous in test code.
An obvious example is the use of macros in tools like James Grenning’s CppUTest. The testing framework (an updated version of CppUnitLite) requires programmers to use macros to identify test functions:
TEST(HelloWorld, PrintOk)
{
printHelloWorld();
STRCMP_EQUAL("Hello World!n", buffer);
}
No self-respecting C++ programmer uses macros anymore to replace functions; per Scott Meyers and many others, it’s fraught with all sorts of problems. But in CppUTest, the use of macros greatly simplifies the work of a developer by eliminating their need to manually register the name of a new test with a suite.
Another example is the use of import static in Java. The general rule of
thumb, suggested by Sun themselves, is to not overuse import
static. Deleting the type information for statically scoped methods and
fields can obscure understanding of code. It’s considered appropriate
only when use of static elements is pervasive. For example, most
developers faced with coding any real math do an import static
on the
java.lang.Math functions.
However, I use static import frequently from my tests:
import static org.junit.Assert.*;
import org.junit.*;
import static util.StringUtil.*;
public class StringUtilCommaDelimitTest {
@Test public void degenerate() {
assertEquals("", commaDelimit(new String[] {}));
}
@Test public void oneEntry() {
assertEquals("a", commaDelimit(new String[] {"a"}));
}
...
}
Developers unquestioningly use import static
for JUnit 4 assertions,
as they are pervasive. But the additional use here is for the method
commaDelimit
, which is defined as static in the target class
StringUtil. More frequently, I’ll have the test refer to (statically
defined) constants on the target class. For a test reader, it becomes
obvious where that referenced constant would be defined.
What other coding standards are appropriate for tests only, and not for production code?