Share via


A small unit test primer

Some recent conversations I've had lead me to believe that not everyone is on the same page when it comes to unit tests, so I thought I'd go back to basics.

  • Follow the three As principle: Arrange, Act, and Assert. Anyone should be able to glance at a unit test and immediately see what it's trying to demonstrate. I believe having the only blank lines in a unit test present between the three sections makes for easy reading.
  • Unit tests should only test one thing: ninety-nine point nine percent of the time, the 'act' portion of a test will be a single line.
  • Unit tests should only prove one thing: having more than a few Assert statements is an indication that the test is too broad.

For clarification, here are two versions of the same test. It's easy to see which is written correctly.

 [Test]
public void testPop()
{ 
  Stack s = new Stack();
  s.Push(new object());
  s.Pop();
  Assert.AreEqual(0, s.Count);
}
 [Test]
public void StackIsEmptyAfterPushingOneElementAndThenPopping()
{
  Stack s = new Stack();
  s.Push(new object());
   s.Pop();
   Assert.AreEqual(0, s.Count);
}