Макет данных объекта

Я хотел бы смоделировать данные объекта, а не сами объекты. Другими словами, я хотел бы создать набор из n объектов и передать его в функцию, которая генерирует случайные строки данных и числа. Есть ли чем это сделать? Думайте об этом как о Lorem Ipsum для данных объекта. Ограничения вокруг числовых диапазонов и т. д. не являются необходимыми, но были бы бонусом.


person Keith Adler    schedule 12.05.2010    source источник
comment
Это выглядит (почти) как дубликат stackoverflow.com/ вопросы/591892/.   -  person Jeremy Roberts    schedule 12.05.2010
comment
@Jeremy Это для баз данных. Я ищу решения, связанные с чистыми объектами.   -  person Keith Adler    schedule 12.05.2010
comment
Верно, но некоторые ответы в этом потоке создают объекты перед переходом в БД. Я подумал, что совпадений достаточно, и на них стоит указать, не отмечая.   -  person Jeremy Roberts    schedule 12.05.2010


Ответы (5)


Первое, о чем я подумал, когда прочитал ваш вопрос, был QuickCheck, инструмент тестирования для Haskell. В QuickCheck вы указываете свойства (инварианты), которые должна иметь ваша функция, и вы можете указать допустимые диапазоны для входных данных (плюс множество других функций), и QuickCheck сгенерирует кучу случайных входных данных и передаст их вашей функции, а также проверит см. если результат соответствует спецификации. Немного покопавшись, я обнаружил, что есть порт F#, поэтому QuickCheck существует в мире .net:

http://fscheck.codeplex.com/

Существует также исследовательский проект MS Pex, который может быть близок к тому, о чем вы думаете:

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

«…Pex находит интересные значения ввода-вывода ваших методов, которые вы можете сохранить в виде небольшого набора тестов с большим охватом кода. Microsoft Pex — это надстройка Visual Studio для тестирования приложений .NET Framework».

Я не использовал его раньше, но похоже, что он хорош для создания данных пограничного случая, которые выполняют все без исключения ветви функции. Он фактически анализирует функцию, а не просто бросает в нее действительно случайные вещи.

person Travis Brooks    schedule 13.05.2010

Похоже, что существует также .NET-порт драгоценного камня Ruby Faker, который часто используется для создания поддельных объектов данных в Ruby. Я не использовал его, но, возможно, стоит изучить:

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

person CodingWithSpike    schedule 07.06.2011

Я удивлен, что никто еще не упомянул 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
}
person Ivan Alagenchev    schedule 06.07.2012

Вы можете настроить класс ObjectRandomizer, который принимает массив объектов, использует отражение для проверки объекта на наличие закрытых членов, а затем использует отражение для установки случайного значения для этого члена. Это работает, только если вам все равно, как выглядят случайные данные для каждого объекта.

В качестве альтернативы вы можете создать набор классов для каждого объекта данных, который генерирует для них случайные данные. Это может работать хорошо, если вы не хотите включать методы случайной генерации в фактические сборки. Например, если у вас есть класс Person, вы можете иметь класс PersonRandomizer в тестовой сборке. В вашем тестовом классе (или в классе Randomizer) вы можете использовать отражение, чтобы найти тип PersonRandomizer, и, если он существует, вызвать PersonRandomizer.Randomize(Person p).

Если вы согласны с предложением yahya, я предлагаю создать интерфейс IRandomizable для объектов, поддерживающих рандомизацию, ИЛИ пометить их новым атрибутом Randomizable, который вы сможете обнаружить во время выполнения.

person Paul Williams    schedule 12.05.2010

Для тестирования я просто добавляю метод ко всем создаваемым классам, который делает это, и называю его randomize. Каждый класс знает, как должны выглядеть юридические данные для объекта этого класса. После создания объекта просто вызовите его метод randomize, чтобы заполнить его случайными макетными данными. Вы также можете добавить специализированные методы для генерации случайных строк данных или чисел на основе ограничений, и эти специализированные методы могут быть общими для всех ваших классов.

person yahya    schedule 12.05.2010
comment
Я думал о том, чтобы сделать это в базовом классе и использовать отражение для создания адекватных данных, но я хотел бы что-то, что уже существует и может быть подключено. Может быть, это то, что я должен создать. - person Keith Adler; 12.05.2010