Pergunta

Eu gostaria de zombar dos dados do objeto, não dos próprios objetos. Em outras palavras, gostaria de gerar uma coleção de N objetos e passá -lo para uma função que gera strings e números de dados aleatórios. Há algo para fazer isso? Pense nisso como um Lorem ipsum para dados de objeto. Restrições em torno de faixas numéricas etc. não são necessárias, mas seriam um bônus.

Foi útil?

Solução

A primeira coisa que pensei quando li sua pergunta foi QuickCech, uma ferramenta de teste para Haskell. No QuickCheck, você especifica propriedades (invariantes) que sua função deve ter, e você pode especificar intervalos válidos para entradas (além de um monte de mais recursos), e o QuickCheck gerará um monte de dados de entrada aleatória e o lançará em sua função e verifique também Se a saída corresponder à especificação. Disando um pouco que descobri que existe uma porta F#, então existe uma verificação rápida no mundo .NET:

http://fscheck.codeplex.com/

Há também um projeto de pesquisa de MS Pex que pode estar próximo do que você está pensando:

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

"... O PEX encontra valores interessantes de entrada e saída de seus métodos, que você pode salvar como uma pequena suíte de teste com alta cobertura de código. Microsoft PEX é um suplemento do Visual Studio para testar aplicativos da estrutura .NET".

Eu não usei antes, mas parecia bom para gerar dados de casos de borda que exercem toda e qualquer ramificação de uma função. Na verdade, ele analisa uma função em vez de apenas jogar coisas verdadeiramente aleatórias.

Outras dicas

Também parece haver uma porta .NET do rubi Faker Gem, que recebe muito uso para montar objetos de dados falsos no Ruby. Eu não usei, mas pode valer a pena investigar:

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

Estou surpreso que ninguém tenha mencionado Autofixture ainda:

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

Você pode configurar um ObjectRandomizer Classe que pega uma variedade de objetos, usa a reflexão para examinar o objeto para membros privados e, em seguida, use a reflexão para definir um valor aleatório para esse membro. Isso funciona apenas se você não se importa com a aparência dos dados aleatórios por objeto.

Como alternativa, você pode criar um conjunto de classes para cada objeto de dados que gera dados aleatórios para eles. Isso pode funcionar bem se você não quiser incluir os métodos de geração aleatória dentro dos conjuntos reais. Por exemplo, se você tivesse um Person aula, você poderia ter um PersonRandomizer classe em uma montagem de teste. Na sua aula de teste (ou em um Randomizer classe), você pode usar a reflexão para encontrar um tipo PersonRandomizer, e se houver, ligue PersonRandomizer.Randomize(Person p).

Se você for com a sugestão de Yahya, sugiro criar uma interface IRandomizable Para objetos que suportam randomização ou marcando -os com um novo atributo Randomizable que você pode detectar em tempo de execução.

Para meus testes, basta adicionar um método a todas as classes que eu criar que faz isso e chamam de randomizar. Cada classe sabe como deve ser os dados legais para um objeto dessa classe. Depois de criar o objeto, basta chamar seu método randomize para preenchê -lo com dados aleatórios de simulação. Você também pode adicionar métodos especializados para gerar strings ou números de dados aleatórios com base em restrições e esses métodos especializados podem ser compartilhados em todas as suas classes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top