Today we are releasing v3.0.4 of Gallio and MbUnit. This release incorporates many new features as well improvements for robustness.
New asserts, assertion diffs, 0rdered tests, Rollback, Repeat, ThreadedRepeat, R# 4.1, VSTS, CSUnit, TeamCity, Gallio.Ambience, clickable report links (IE/Firefox integration), and more...
Try it out! Please be aware that there are now separate x86 and x64 installers.
Download here: http://www.gallio.org/Downloads.aspx
Documentation here: http://www.gallio.org/Docs.aspx
We have consolidated and significantly improved the set of built-in MbUnit assertions. Refer to the migration guide at the end of this post for more information. Vadim Kreynin was a huge help with this effort.
All new assertions are implemented with a common pattern designed to make assertion failures easier to understand. Notice how the parameters of the assertion are clearly labeled. Also, the fact that the values are quoted tells you that the objects involved are actually strings.
Yes... and you can click on the stack trace in the report to go to source.
And putting to rest that age-old question "are these two values the same or do they just look that way"?
Assertions with Diffs
When comparing two values for equality, we now display detailed character by character differences between their formatted representations. These differences appear as colored and styled regions in the test report.
In the future, we will be providing a new Visual Studio integrated test runner that will be able to manifest differences as styled output in the test console as well.
Assertions Over Collections
MbUnit assertions can be composed to form more complex assertions out of simpler ones. The Assert.Over syntax provides some useful compositions for performing assertions over collections.
For C# 3.0 / .Net 3.5 users, MbUnit now offers some new syntax for expressing assertions using lambda expressions using AssertEx.That. If the expression evaluates to false, MbUnit will try to explain why by printing the values of referenced variables and intermediate sub-expressions that were computed during the assertion.
Suppose we have the following test:
When we run this test, it will fail because the last two values of the sequence should have been '13' and '21'. The assertion failure pretty clearly spells this out for us by telling us all about the variables involved.
Sometimes a test performs multiple related assertions that are logically part of a single verification. In these scenarios, we would like to be able to continue running the test even if one of the assertions fails. When the test is finished, we can the report all of the failures together.
There are two ways to do this in MbUnit.
Tag the method with [MultipleAsserts]:
Or use the Assert.Multiple function and pass in a delegate:
In either case, MbUnit will produce a failure message like this:
Stack Trace Filtering
We now filter out framework code from stack traces. You may have noticed that the assertion failure examples shown above were particularly uncluttered...
Tired of writing tests for exceptions, equality operators, and comparers? Yann Trévin has made it easier!
Believe it or not, this is a complete test fixture for a custom exception type.
And here's what it takes to test the Equals, GetHashCode, operator==, and operator!= methods of our Range class. We just need to provide a few examples of ranges that are in different equivalence classes.
And this is a test for CompareTo, and all of the standard comparison operators.
We plan to write more of these soon...
Dependent / Ordered Tests
When writing integration tests, it is sometimes useful to chain several tests together that capture a logical sequence of operations.
MbUnit can capture this chaining either with dependencies:
Or with explicit ordering:
Graham Hay has been hard at work on Icarus.
ReSharper Test Runner
We now fully support ReSharper v4.1. (Actually, we have for quite some time now, this is just the first official release with support for it.)
Clickable Stack Traces
One popular request has been to provide clickable stack traces in ReSharper. We are somewhat limited in our ability to do this well (due to ReSharper API limitations) but we tried our best!
It is now possible to view Condensed and Full test reports in ReSharper. The test report may provide more details under certain situations. For example, it will include those assertion diff highlights (which we are unable to display in the ReSharper test result panel itself).
Visual Studio Team System Test Runner
Yann Trévin also put a lot of work into the Visual Studio Team System test runner.
You can run tests using the Test View.
View results in the Test Results view.
And if you double click on the test result, you can view the test report for more information.
- You will need Visual Studio 2008 SP1 for this feature.
- The tests must be located in a project that has the appropriate ProjectTypeGuids specified.
Francois Retief rewrote our old installer using WiX. It is so much better now!
- Works on Vista.
- Supports 640bit architectures.
- We now provide separate x86 and x64 versions.
- More configuration options.
Francois Retief also implemented an adapter for CSUnit. So now you can use Gallio to run your CSUnit tests.
Please let us know what you think.
To use it, set the RunnerExtensions argument of the Gallio test runner you are using to "TeamCityExtension,Gallio.TeamCityIntegration".
If you are using the Gallio MSBuild task:
... other arguments... />
If you are using the Gallio NAnt task:
... other arguments... />
If you are using the Gallio Echo task:
Gallio.Echo /e:TeamCityExtension,Gallio.TeamCityIntegration ... other arguments...
Note: We plan to automatically detect TeamCity in future releases.
This release includes an initial preview of Gallio.Ambience. Ambience manages what we are tentatively calling the Ambient object store.
The Ambient object store is a shared lightweight repository for intermediate test data. It is like a persistent whiteboard that is used to pass information from one test to another or to store it for subsequent analysis. In effect, you can use it to create stateful tests.
A stateful test is one which may load or store data generated by previous test runs and use it for some purpose. This practice is strongly discouraged in unit testing best practice because it introduces a dependency on previous runs. However, it can be useful for integration testing of stateful systems that cannot easily be torn down and built up again.
Testers will commonly resort to flat files for storing test data between runs. This system works well on a local machine but it is problematic for distributed testing clusters unless the files are stored on a network drive (where they risk corruption).
Instead of using flat files, Gallio Ambience is client/server based. The server in this case is a Db4o Object Database instance. Clients may connect to it remotely to store and retrieve data. LINQ query syntax is supported.
First we write a test that stores some data in the Ambient object store for later.
Then we write another test which consumes the data in the Ambient object store.
In this way we can test stateful processes using one or more tests that communicate via the Ambient object store.
- If you are able to refactor your system to avoid the need for stateful tests then we recommend doing so. Stateful tests are inherently more brittle than properly isolated unit tests. That said, we think the can be useful for solving certain otherwise messy problems.
- This feature is new and experimental. We welcome your feedback!
We have published the Gallio and MbUnit v3 API documentation on the website here.
The Gallio Book is very much a work in progress but we have a fairly complete outline and some content produced so far. It is also published up on the website here.
External Tools Compatibility
We've updated integration with a variety of external tools.
- CCNet v1.0.4
- CSUnit v2.0.5
- NUnit v2.4.8 (now supports NUnit add-ins correctly)
- Pex v0.7
- ReSharper v3.1, v4.0, v4.1
- TeamCity v3.1, v4.0 EAP
- xUnit.Net v1.0.3
- Improved backwards compatibility with older versions.
- More careful handling of the runtime environment to avoid certain exotic assembly version conflict issues in TestDriven.Net, ReSharper and Visual Studio.
- Performance improvements in upcoming versions of TestDriven.Net.
- Lots of bug fixes.
A few features did not quite make it into v3.0.4 but will appear in upcoming releases:
- New plug-in model (will significantly improve startup performance).
- TeamCity auto-detection.
- NCover 2 support. It's already in there but there remain some unresolved issues to address.
- A new Visual Studio integrated test runner.
- Hosting Gallio inside exotic test environments such as ASP.Net and AutoCAD.
- Launching x86 testing processes on x64.
Gallio almost runs on Mono. We have made cross-platform support a priority for Gallio and MbUnit but there is still some work remaining. The build server now regularly runs tests using Mono.
We are seeking volunteers to help make full Mono support a reality in upcoming releases.
If you are migrating code from MbUnit v2 or from previous versions of MbUnit v3, the following tables will help you.
What To Do If XYZ Is Not In This List
If one or more of your favorite methods or attributes from MbUnit v2 is not in this list here's what to do:
- Consult the tables for a replacement.
- Old assertions are available in the MbUnit.Compatibility.dll. They have been renamed with the prefix Old* to clearly distinguish them.
- If you still cannot find what you need, all is not lost. Remember that Gallio can run tests from MbUnit v2 and v3 at the same time. Several old versioning issues have been resolved so this process should be smoother too.
- We are planning to replace / upgrade some (but not all) of the deprecated methods and attributes. If there are any in particular you think we should tackle first, please open an issue in our issue tracker.
- Please feel free to make other suggestions for improvement.
Assertion Migration Guide
This table describes changes to assertions:
|MbUnit v3 (NEW)||MbUnit v2 (OLD)|
|Assert.AreApproximatelyEqual (v3.0.5)||Assert.AreEqual (with delta)|
|Assert.AreNotApproximatelyEqual (v3.0.5)||Assert.AreNotEqual (with delta)|
Attribute Migration Guide
This table describes changes to attributes:
|MbUnit v3 (NEW)||MbUnit v2 (OLD)|
|[ApartmentState]||Apartment property of [TestFixture]|
|[CombinatorialJoin] (optional)||CombinationType = Cartesion property of [CombinatorialTest]|
|[Description]||Description property of [TestFixture] and [Test]|
|[Factory]||[Factory] (note: very different semantics)|
|[PairwiseJoin]||CombinationType = AllPairs property of [CombinatorialTest]|
|[Timeout]||TimeOut property of [TestFixture]|
|Order property of [Test] or [TestFixture]||[TestSequence]|
|Similar to [Factory]||[UsingFactories]|
|Similar to [Column]||[UsingLiterals]|
Edit: Fixed Vadim's name :-)