The extensibility of the
Gallio platform is simply amazing. You can virtually extend any part of the system. It goes from a
simple plugin that provides new handy functionalities to a
full-blown adapter for your fancy testing framework. Today, I would like to explain how easy it is to extend the
MbUnit framework with a custom data source attribute.
MbUnit has many useful built-in data source attributes which might be used to create powerful
data-driven tests. The most popular attributes are certainly
[Row]
and
[Column]
.
Now let's imagine you get bored with writing that kind of tests:
[Test]
public void Mytest(
[Column(true, false)] bool flag1,
[Column(true, false)] bool flag2,
[Column(true, false)] bool flag3)
{
// ...
}
Imagine how beautiful would be the world if you could write the following instead:
[Test]
public void Mytest(
[BooleanData] bool flag1,
[BooleanData] bool flag2,
[BooleanData] bool flag3)
{
// ...
}
Unfortunately, this data source attribute does not exist in MbUnit.
So let's make it happen!
Creating a custom data source is very easy. Basically you simply need to derive from
MbUnit.Framework.DataAttribute
, and to override the virtual method
PopulateDataSource
.
[AttributeUsage(PatternAttributeTargets.DataContext, AllowMultiple = false, Inherited = true)]
public class BooleanDataAttribute : DataAttribute
{
protected override void PopulateDataSource(IPatternScope scope, DataSource dataSource, ICodeElementInfo codeElement)
{
dataSource.AddDataSet(new ValueSequenceDataSet(new object[] { true, false }, GetMetadata(), false));
}
}
That's all. Compile and run your test happily!
You might find more inspiration by examining the actual implementation of existing built-in attributes such as
[EnumData]
or
[RandomStrings]
which is slightly more complicated as it relies on the underlying
Gallio data generation framework.
Next time, I will explain how to properly test you custom data source attribute by using the
Gallio SDK.