Pregunta

Me gustaría burlarse de datos de objetos, no los objetos mismos. En otras palabras, me gustaría para generar un conjunto de n objetos y pasarlo a una función que genera cadenas de datos y números al azar. ¿Hay algo que hacer esto? Piense en ello como un Lorem Ipsum de datos de objetos. Restricciones alrededor de rangos numéricos, etc., no son necesarias, pero sería una ventaja.

¿Fue útil?

Solución

Lo primero que pensé cuando leí tu pregunta era QuickCheck, una herramienta de prueba de Haskell. En QuickCheck se especifican las propiedades (invariantes) que su función debe tener, y puede especificar rangos válidos para las entradas (además de un montón más características), y QuickCheck va a generar un montón de datos de entrada al azar y tirarlo a su función y comprobar también ver si la salida coincide con la especificación. Husmear un poco descubrí que hay un F # puerto de tan QuickCheck existe en el mundo .NET:

http://fscheck.codeplex.com/

También hay un proyecto de Investigación MS Pex que podrían estar cerca de lo que usted está pensando en:

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

"... Pex encuentra los valores de entrada-salida interesantes de sus métodos, que se pueden guardar como un banco de pruebas pequeño con alta cobertura de código. Microsoft Pex es un Visual Studio complemento para probar aplicaciones .NET Framework."

No he usado antes, pero parecía que es bueno para los datos del caso del borde de generación de ejercicios que cualquiera y todas las ramas de una función. En realidad, analiza una función en lugar de simplemente tirar cosas verdaderamente aleatoria en ella.

Otros consejos

Hay también parece ser un puerto NET de la gema Faker Ruby, que se pone un montón de usar por manipular objetos de datos falsos en Ruby. Yo no lo he usado, pero puede ser vale la pena analizar:

https://github.com/slashdotdash/faker-cs

Me sorprende que nadie ha mencionado AutoFixture aún:

[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
}

Se podría configurar una clase ObjectRandomizer que tiene una matriz de objetos, utiliza la reflexión para examinar el objeto para miembros privados y, a continuación, utilizar la reflexión para establecer un valor aleatorio para ese miembro. Esto sólo funciona si no le importa lo que las miradas de datos aleatorios, como por objeto.

Como alternativa, se podría construir un conjunto de clases para cada objeto de datos que genera datos aleatorios para ellos. Esto puede funcionar bien si no desea incluir los métodos aleatorios de generación dentro de los montajes reales. Por ejemplo, si usted tenía una clase Person, usted podría tener una clase PersonRandomizer en un aparato de pruebas. En su clase de prueba (o en una clase Randomizer), usted podría entonces utilizar la reflexión para encontrar un PersonRandomizer tipo, y si existe, la llamada PersonRandomizer.Randomize(Person p).

Si vas con la sugerencia de Yahya, sugiero crear una interfaz para IRandomizable objetos que la aleatorización apoyo o marcándolos con una nueva Randomizable atributo que se puede detectar en tiempo de ejecución.

En mis pruebas Acabo de añadir un método a todas las clases que creo que hace esto y lo llaman randomize. Cada clase sabe lo que los datos legales de un objeto de esa clase debe ser similar. Después de crear el objeto simplemente llamar a su método randomize poblarlo con simulacro de seguridad de los datos al azar. También puede añadir métodos especializados para generar cadenas de datos aleatorios o números basados ??en restricciones y estos métodos especializados se pueden compartir entre todas sus clases.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top