2010-05-12 74 views
4

我想模拟对象数据,而不是对象本身。换句话说,我想生成一个包含n个对象的集合,并将它传递给一个产生随机数据字符串和数字的函数。有什么要做的吗?将其视为对象数据的Lorem Ipsum。数字范围的限制等是没有必要的,但是会是一种奖励。模拟对象数据

+0

这看起来(几乎)一样的副本http://stackoverflow.com/questions/591892/tools-for-generating-mock-data。 – 2010-05-12 18:29:25

+0

@Jeremy这些是针对数据库的。我正在寻找与纯物体相关的solutiosn。 – 2010-05-12 18:50:00

+0

是的,但该线程中的某些答案在去数据库之前创建对象。我认为有足够的重叠,值得指出而没有标记。 – 2010-05-12 19:15:46

回答

5

当我读到你的问题时,我想到的第一件事就是QuickCheck,它是Haskell的测试工具。在QuickCheck中,您可以指定函数应该具有的属性(不变量),并且可以指定输入的有效范围(以及更多功能),QuickCheck将生成一堆随机输入数据并将其放入函数中,并检查是否太多如果输出符合规范。附近有一座小我发现收口有它的一个F#端口,以便快速检查在.NET世界的存在:

http://fscheck.codeplex.com/

还有一个MS研究项目的Pex,可能是靠近你在想什么:

http://research.microsoft.com/en-us/projects/Pex/

” ...的Pex找到你的方法,你可以保存为一个小的测试套件具有高的代码覆盖率有趣的投入产出值Pex的微软是一个Visual Studio插件进行测试。 .NET Framework应用程序“。

我以前没有使用过它,但它看起来好像用于生成边界案例数据,可以执行函数的任何和所有分支。它实际上分析了一个功能,而不是仅仅在其上投掷真正随机的东西。

1

对于我的测试,我只是为我创建的所有类添加一个方法,并将其称为随机化。每个班级都知道该班级对象的法律数据应该是什么样子。创建对象后,只需调用其randomize方法,以随机模拟数据填充它。您还可以添加专门的方法来根据约束生成随机数据字符串或数字,并且可以在所有类中共享这些专用方法。

+0

我想过在基类上做这件事,并使用反射来生成足够的数据,但我想要一些已经存在并且可以插入的东西。也许这是我应该创建的东西。 – 2010-05-12 18:50:56

2

您可以设置一个ObjectRandomizer类,该类需要一个对象数组,使用反射检查私有成员的对象,然后使用反射为该成员设置一个随机值。这只有在你不关心每个对象的随机数据是什么样子的情况下才有效。

或者,您可以为每个为其生成随机数据的数据对象构建一组类。如果您不想在实际程序集中包含随机生成方法,这可能会奏效。例如,如果您有一个Person类,则可以在测试程序集中包含一个PersonRandomizer类。在您的测试课程(或Randomizer课程)中,您可以使用反射来查找PersonRandomizer类型,如果存在,请致电PersonRandomizer.Randomize(Person p)

如果你遵循yahya的建议,我建议为支持随机化的对象创建一个接口IRandomizable,或者使用您可以在运行时检测到的新属性Randomizable来标记它们。

3

我很惊讶,没有人提到AutoFixture尚未:

[TestMethod] 
public void IntroductoryTest() 
{ 
    // Fixture setup 
    Fixture fixture = new Fixture(); 

    int expectedNumber = fixture.CreateAnonymous<int>(); 
    MyClass sut = fixture.CreateAnonymous<MyClass>(); 
    // Exercise system 
    int result = sut.Echo(expectedNumber); 
    // Verify outcome 
    Assert.AreEqual<int>(expectedNumber, result, "Echo"); 
    // Teardown 
}