Данные фиктивного объекта

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

5 ответов

Решение

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

http://fscheck.codeplex.com/

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

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

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

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

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

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

Я удивлен, что никто еще не упомянул 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 класс), вы можете использовать отражение, чтобы найти тип PersonRandomizerи, если он существует, позвоните PersonRandomizer.Randomize(Person p),

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

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

Другие вопросы по тегам