I've been working with MSTest a lot recently, adding support for the VS 2008 and 2010 flavours of MSTest to TestDriven.Net 3.0. There are some quirks and differences between the VS 2008 and VS 2010 versions that I've had to deal with.
1) This thing you mention about ExpectedException isn't actually a bug, it's more a badly named parameter. They've renamed it from 'message' to 'noExceptionMessage' in VS 2010. It's a message that will be displayed if no exception is thrown. For example:
[TestMethod, ExpectedException(typeof(ArgumentNullException),
"CreateDomain shouldn't accept accept a null friendly name")]
public void CreateDomain_Null_ThrowsArgumentNullException()
{
AppDomain.CreateDomain(null);
}
2) The VS 2010 version of MSTest now supports test fixtures that inherit from an abstract base class (that contains tests).
3) You can force MSTest for VS 2010 to execute in a 64-bit process using a setting under 'Local.testsettings > Hosts'.
If you use MSTest much, you should find the MSTest support in TestDriven.Net 3.0 Beta 2 is fast and pretty comprehensive. It now even supports data driven tests. :)
I love NUnit, but unless I missed something there is not test runner fully integrated in VS. Even the Resharper runner still does not support all of the new attributes.
Hi Roy,
I may have misunderstood you mean by abstract test fixture, but if I understand correctly, I have used them with MSTest.
MSTest does not allow you to decorate the abstract fixture with the TestClassAttribute, but if you have methods decorated with the TestMethodAttribute, those tests will be inherited by the derived fixture. So for example, if you had 5 tests in the abstract fixture, when you run the tests in your derived fixture, it will execute those 5 abstract test methods additionally.
Does NUnit handle this scenario differently?
Roy,
For many developers MsTest has one attractive feature that outweight its weakenesses: it's runner is built-in into Visual Studio. Recently I read in Ben Hall's book about testing ASP.NET applications that VS 2010 test runner can be used to execute NUnit test. If this is true, this can make a lot of people start switching to NUnit or at least make beginners choose NUnit. But was not able to find anything about this. Do you know if there are such changes in VS 2010 test runner so it can now be configured to run tests with NUnit syntax (I guess TestCases will still be a problem)?
Just like Ryan I use abstract base classes in MSTest. I'm interested what you exactly mean.
Here's an example of what I use with MSTest:
public abstract class IntegrationTestBase
{
private TransactionScope scope;
[TestInitialize]
public void TestInitialize()
{
scope = new TransactionScope();
}
[TestCleanup]
public void TestCleanup()
{
scope.Dispose();
}
}
[TestClass]
public class IntegrationTest : IntegrationTestBase
{
[TestMethod]
public void TestThatRunsInTransactionScope()
{
// This test runs in the context of the TransactionScope!
}
}
Cheers
I pointed out on stackoverflow that a bunch of your information is out of date as of 2010. Jamie has already pointed some of that out above
Regarding the abstract classes for test fixtures:
There's a slightly different behavior in MSTest depending on where it's run (at least in the 2008 products and our machine). If they're run locally abstract base classes containing tests work as expected. However, those tests break when beeing run in TFS 2008 Team Builds.
HTH,
Bjoern
It's not just NUnit vs MsTest. I've been using MbUnit (a.k.a. Gallio) for several years now and I never looked back. Most of the features (both NUnit's and MsTest's) you mentioned were present in MbUnit for some time now. And much, much more.
I prefer the more natural and fluent assert syntax in NUnit, like:
Assert.That(x, Is.EqualTo(1));
instead of:
Assert.AreEqual(1, x);
NUnit also has a lot wider assert API, which I think makes the tests much more readable when you come back to them 6 months later.