我想模拟对象数据,而不是对象本身。换句话说,我想生成 n 个对象的集合并将其传递给生成随机数据字符串和数字的函数。有什么可以做的吗?将其视为对象数据的Lorem Ipsum。数字范围等的约束不是必需的,但会是一个奖励。
5 回答
当我读到你的问题时,我首先想到的是 QuickCheck,一个 Haskell 的测试工具。在 QuickCheck 中,您可以指定函数应具有的属性(不变量),并且可以指定输入的有效范围(以及更多功能),QuickCheck 将生成一堆随机输入数据并将其扔给您的函数并检查查看如果输出符合规范。查了一下,我发现它有一个 F# 端口,所以 QuickCheck 存在于 .net 世界中:
还有一个 MS Research 项目 Pex 可能与您的想法很接近:
http://research.microsoft.com/en-us/projects/Pex/
“...Pex 找到您方法的有趣输入输出值,您可以将其保存为具有高代码覆盖率的小型测试套件。Microsoft Pex 是用于测试 .NET Framework 应用程序的 Visual Studio 插件。”
我以前没有使用过它,但它看起来很适合生成运行函数的任何和所有分支的边缘案例数据。它实际上分析了一个函数,而不仅仅是向它扔真正随机的东西。
Ruby gem 似乎也有一个 .NET 端口,Faker
它在 Ruby 中被大量用于装配假数据对象。我没有使用它,但它可能值得研究:
我很惊讶还没有人提到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
}
您可以设置一个ObjectRandomizer
接受对象数组的类,使用反射检查对象的私有成员,然后使用反射为该成员设置随机值。仅当您不关心每个对象的随机数据是什么样子时,这才有效。
或者,您可以为每个数据对象构建一组类,为它们生成随机数据。如果您不想在实际程序集中包含随机生成方法,这可能会很好。例如,如果您有一个Person
类,那么您可以PersonRandomizer
在测试程序集中有一个类。在您的测试类(或Randomizer
类)中,您可以使用反射来查找 type PersonRandomizer
,如果存在,请调用PersonRandomizer.Randomize(Person p)
.
如果你接受 yahya 的建议,我建议IRandomizable
为支持随机化的对象创建一个接口,或者用Randomizable
你可以在运行时检测到的新属性标记它们。
对于我的测试,我只是向我创建的所有类添加一个方法,并将其称为随机化。每个类都知道该类对象的合法数据应该是什么样子。创建对象后,只需调用其 randomize 方法以使用随机模型数据填充它。您还可以添加专门的方法来基于约束生成随机数据字符串或数字,并且这些专门的方法可以在您的所有类中共享。