The document discusses techniques for writing effective unit tests, including:
1. Writing tests that validate externally visible behavior rather than implementation details.
2. Providing clear failure messages that indicate expected and actual values.
3. Organizing tests into classes that describe scenarios and intentions.
4. Using context and theory classes to group related tests and parameters.
5. Prioritizing developer experience and ensuring tests are easy to change.
33. class PasswordValidation
{
[TestCase("FqPd19", "Less than 8 chars")]
[TestCase("FqPd1234", "Numeric sequence")]
[TestCase("password", "Easy to guess")]
void Invalid(string pw, string reason) { }
[TestCase("FqPd0581Q")]
void Valid(string pw) { }
}
34. public class TweetControllerTests
{
[Test]
void Returns_tweets_stored_in_database()
{
var stubDatabase = new StubDatabase();
stubDatabase.Add("OMG I love those meerkats! <3");
stubDatabase.Add("Sergei is my faveourite");
var controller = new TweetController(stubDatabase);
var tweets = controller.GetTweets();
Assert.That(tweets.Count, Is.EqualTo(2));
Assert.That(tweets[0], Is.EqualTo(
"OMG I love those meerkats! <3"));
Assert.That(tweets[1], Is.EqualTo(
"Sergei is my faveourite"));
}
}
35. public class TweetControllerTests
{
private StubDatabase stubDatabase;
[SetUp]
public void SetUp()
{
stubDatabase = new StubDatabase();
stubDatabase.Add("OMG I love those meerkats! <3");
stubDatabase.Add("Sergei is my favourite");
}
[Test]
public void Returns_tweets_stored_in_database()
{
...
}
}
36. public class TweetControllerTests : Context
{
[Test]
public void Returns_tweets_stored_in_database()
{
var controller = new TweetController(stubDatabase);
var tweets = controller.GetTweets();
Assert.That(tweets.Count, Is.EqualTo(2));
Assert.That(tweets[0], Is.EqualTo(
"OMG I love those meerkats! <3"));
Assert.That(tweets[1], Is.EqualTo(
"Sergei is my favourite"));
}
}
37. public class RetrievingTweets : Context
{
public RetrievingTweets()
{
Given_tweets_in_the_DB(new[]
{
"I love those meerkats! <3",
"Sergei is my favourite"
});
When_calling_the_controller();
}
[Test]
public void The_stored_tweets_are_returned()
{
Assert.That(retrievedTweets.Count, Is.EqualTo(2));
Assert.That(retrievedTweets[0], Is.EqualTo(
"I love those meerkats! <3"));
Assert.That(retrievedTweets[1], Is.EqualTo(
"Sergei is my favourite"));
}
}
38. TDD by default
Test just enough
Dev experience matters
Change should be easy
Communicate well