我们的单元测试之一是使用随机数据填充业务对象内的属性。使用泛型获取随机数据
这些性质不同的固有类型,因此我们想使用泛型的力量来回报你沿东西线传递类型的数据:
public static T GetData<T>()
,你会如何去接近这个?低级别的界面会起作用吗? (IConvertible)
我们的单元测试之一是使用随机数据填充业务对象内的属性。使用泛型获取随机数据
这些性质不同的固有类型,因此我们想使用泛型的力量来回报你沿东西线传递类型的数据:
public static T GetData<T>()
,你会如何去接近这个?低级别的界面会起作用吗? (IConvertible)
这取决于你想要什么随机数据,因为方式或算法要使用完全不同,这取决于类型。
例如:
// Random int
Random r = new Random();
return r.Next();
// Random Guid
return Guid.NewGuid();
...
所以这显然使得使用泛型的用户端一个不错的semplification的,但它没有任何价值给你写的类的方式。你可以使用一个开关条款或字典(如乔恩斯基特建议):
switch(typeof(T))
{
case System.Int32:
Random r = new Random();
return (T)r.Next();
case System.Guid:
return (T)Guid.NewGuid();
...
然后当你想到你会使用这个类:
RandomGenerator.GetData<Guid>();
...
您可以保留“易于使用”的GetData接口,但内部有一个字典< Type,object>其中每个值都是相关类型的Func < T>。随后的GetData将有一个实现,如:
public static T GetData<T>()
{
object factory;
if (!factories.TryGet(typeof(T), out factory))
{
throw new ArgumentException("No factory for type " + typeof(T).Name);
}
Func<T> factoryFunc = (Func<T>) factory;
return factoryFunc();
}
,那么你会设立工厂字典静态初始化,一个代表每种类型你想创建随机数据。在某些情况下,您可以使用简单的lambda表达式(例如整数),并且在某些情况下,委托可以指向执行更多工作的方法(例如,用于字符串)。顺便说一句,您可能希望将我的StaticRandom类用于线程安全的RNG。
一般来说,我会避免写随机单元测试,因为这不是单元测试的目的。在编写单元测试时,您确实需要手动生成数据以确保覆盖您的类/程序中的所有路径,并且通常在测试中对这些数据进行硬编码,以便重新运行测试。
所以我想你真的写烟测试,看看你的软件如何表现大数据集。在这里,我认为你应该像其他人已经建议的那样,为每个业务对象类型实现一个特定的生成器 - 以确保数据与您期望的生产数据相当相似(例如,如果ID是顺序的,那么顺序生成它们,不随机)。
我会用AutoPoco来产生测试所需的数据。
有趣的方法。得到了我的投票。 – OregonGhost 2008-10-07 10:14:22
谢谢,我会放弃并回传我的结果。 – 2008-10-07 10:17:19