Update: I have also written a post about NUnit's Data Driven TestCaseAttribute.

Do you like copying and pasting code? Neither do I.
A good set of unit tests often end up reusing the same code with varied inputs. Rather than copy and paste that test code over and over, we can use the pattern of data driven unit tests to help streamline our test fixtures. This is the practice of having a single test definition be invoked and count as multiple tests at run time. This also enables us to do other dynamic things, such as configuring our unit tests from external sources. :)
I frequently use MSTest, but it's data driven tests inconveniently require you to define a DataSource. (Updated) Come to find out NUnit does offer data driven unit tests with their TestCaseSource attribute. Meanwhile xUnit offers several lightweight and simple options for defining data driven tests, which it refers to as theories.
Let's take a look at some of xUnit's Theory data sources:
InlineData Example
public class StringTests1
{
[Theory,
InlineData("goodnight moon", "moon", true),
InlineData("hello world", "hi", false)]
public void Contains(string input, string sub, bool expected)
{
var actual = input.Contains(sub);
Assert.Equal(expected, actual);
}
}
PropertyData Example
public class StringTests2
{
[Theory, PropertyData("SplitCountData")]
public void SplitCount(string input, int expectedCount)
{
var actualCount = input.Split(' ').Count();
Assert.Equal(expectedCount, actualCount);
}
public static IEnumerable<object[]> SplitCountData
{
get
{
// Or this could read from a file. :)
return new[]
{
new object[] { "xUnit", 1 },
new object[] { "is fun", 2 },
new object[] { "to test with", 3 }
};
}
}
}
ClassData Example
public class StringTests3
{
[Theory, ClassData(typeof(IndexOfData))]
public void IndexOf(string input, char letter, int expected)
{
var actual = input.IndexOf(letter);
Assert.Equal(expected, actual);
}
}
public class IndexOfData : IEnumerable<object[]>
{
private readonly List<object[]> _data = new List<object[]>
{
new object[] { "hello world", 'w', 6 },
new object[] { "goodnight moon", 'w', -1 }
};
public IEnumerator<object[]> GetEnumerator()
{ return _data.GetEnumerator(); }
IEnumerator IEnumerable.GetEnumerator()
{ return GetEnumerator(); }
}
Happy testing!
Tom
Update! NUnit does offer data driven unit tests. Thanks to Mr. Weller for pointing this out.
ReplyDeleteI just implemented the "Or this could read from a file" part, feel free to copy/paste. In the file below, search the "TestServers" method and check the class comment for the JSON format sample:
ReplyDeletehttps://github.com/nicolas-raoul/CmisSync/blob/master/SparkleShare/TestLibrary/CmisSyncTests.cs
Maybe CSV would have been more appropriate than JSON?
I have used the PropertyData with Theory attributes and it passes my tests but then says method "cannot have parameters". Have you seen this?
ReplyDeleteMore elegant approach will be to `yield return new object[]`.
ReplyDeleteI think this is the reason the property to have its return type IEnumerable rather than just array.
I read that Post and got it fine and informative. Please share more like that... ovulation test
ReplyDeleteThis is such a great resource that you are providing and you give it away for free. I love seeing blog that understand the value of providing a quality resource for free. Tableau Data Blending
ReplyDeleteThis is a wonderful article, Given so much info in it, Thanks for sharing. CodeGnan offers courses in new technologies and makes sure students understand the flow of work from each and every perspective in a Real-Time environment react training. ,
ReplyDeleteI clearly understand your blog. Nice blog.
ReplyDeletedifferent types of testing
current angular version
programming language used in google
how to get ccna certification
data scientist interview questions and answers
Thanks for sharing a valuable blog. keep sharing.
ReplyDeletelatest technology to learn
web designing courses for beginners
future scope of hadoop technology
aws devops interview questions and answers
aws interview questions and answers for devops
Really great and it is very helpful to gain knowledge about this topic. Thank you!
ReplyDeleteAdvanced Excel Training in Chennai
Azure Training in Chennai
Power BI Training in Chennai
Excel Training in Chennai