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?
February 2004 March 2004 May 2004 September 2004 October 2004 January 2005 February 2005 September 2005 October 2005 November 2005 December 2005 January 2006 February 2006 March 2006 June 2006 August 2006 January 2007 February 2007 March 2007 April 2007 September 2007 October 2007 November 2007 December 2007 January 2008 February 2008 March 2008 April 2008 May 2008 June 2008 July 2008 August 2008 September 2008 October 2008 November 2008 December 2008 January 2009