Previously, I had created this cheat sheet entry for myself. I am now working for a company that uses the Microsoft Unit Testing framework, so I decided to create an updated sheet so I would have one place to look up both frameworks.
Comparable framework methods are aligned horizontally.
NUNIT
[SetupFixture]
public class NamespaceSetup
{
[SetUp]
BeforeAnyTestsInNamespace()
{...}
[TearDown]
AfterAnyTestsInNamespace()
{...}
}
[TestFixture]
public class ObjectUnitTests
{
[OneTimeSetup]
public void BeforeAnyTests()
{...}
[SetUp]
public void BeforeEachTest()
{...}
[Test]
[Category("group")]
public void AUnitTest()
{
// Arrange
...
// Act
…
// Assert
...
}
[Ignore]
public void NeverRunThis()
{...}
[Explicit]
public void UserMustRequest()
{...}
[TearDown]
public void AfterEachTest()
{...}
[OneTimeTearDown]
public void AfterAllTests()
{...}
}
MSTest V2
[TestClass]
public class ObjectUnitTests
{
[AssemblyInitialize]
BeforeAnyTestsInAssembly()
{...}
[ClassInitialize]
public void BeforeAnyTests(TestContext context)
{...}
[TestInitialize]
public void BeforeEachTest()
{...}
[TestMethod]
[TestCategory("group")]
public void AUnitTest()
{
// Arrange
…
// Act
…
// Assert
...
}
[Ignore("Not always run")]
public void NeverRunThis()
{...}
[TestCleanup]
public void AfterEachTest()
{...}
[ClassCleanup]
public void AfterAllTests()
{...}
[AssemblyCleanup]
RunAfterAllTestsInAssembly()
{...}
}
For data-driven unit testing:
[TestCase(d1,...,dN)]
[TestCase(d1,...,dN)]…
public void AUnitTest(T1 p1,...,TN pn)
{…}
[DataTestMethod]
[DataRow(d1,...,dN)]
[DataRow(d1,...,dN)]…
public void AUnitTest(T1 p1,...,TN pn)
{…}
[Test, TestCaseSource(nameof(SourceMethod1))]
public void ParamsAreVariousTypes(T1 p1,...,TN pn)
{…}
static object[] SourceMethod1 =
{
new object[] {d1,...,dN},
new object[] {d1,...,dN},
...
};
[Test, TestCaseSource(nameof(SourceMethod2))]
public void AllParamsSameType(T p1,...,T pn)
{…}
static object[] SourceMethod2 =
{
new T[] {d1,...,dN},
new T[] {d1,...,dN},
…
};
[Test, TestCaseSource(nameof(SourceMember))]
public void TestSingleParam(T p)
{…}
static T[] SourceMember =
new T[] {d1,...,dN};
[DataTestMethod]
[CustomDataSource]
public void ParmsAreVariousTypes(T1 p1,...,TN pn)
{…}
public class CustomDataSourceAttribute :
Attribute, ITestDataSource
{
public IEnumerable
GetData(MethodInfo mi)
{
yield return new object[]
{d1,…,dN};
yield return new object[]
{d1,…,dN};
…
}
public string GetDisplayName(
MethodInfo mi, object[] d)
{
return (d == null)
? null
: $"{mi.Name} - {formatting for d}";
}
}
And MS Test has even more cumbersome ways of setting up data-driven tests
[DataTestMethod]
[DynamicData(nameof(SourceMethod1), DynamicDataSourceType.Method)]
public void ParamsAreVariousTypes(T1 p1,...,TN pn)
{…}
static IEnumerable<object[]> SourceMethod1()
{
yield return new object[]
{d1,...,dN};
yield return new object[]
{d1,...,dN};
...
}
[DataTestMethod]
[DynamicData(nameof(SourceProperty), DynamicDataSourceType.Property)]
public void AUnitTest2(T1 p1,...,TN pn) {…}
public static IEnumerable<object[]> SourceProperty
{
get
{
yield return new object[]
{d1,...,dN};
yield return new object[]
{d1,...,dN};
...
}
}
As you can tell, my preference is for NUnit.
One thought on “NUnit and MSTest attributes”