Данные фиктивного объекта - PullRequest
4 голосов
/ 12 мая 2010

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

Ответы [ 5 ]

5 голосов
/ 13 мая 2010

Первое, о чем я подумал, когда прочитал ваш вопрос, был 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."

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

4 голосов
/ 07 июня 2011

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

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

3 голосов
/ 07 июля 2012

Я удивлен, что никто не упомянул Автофиксирование пока:

[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
}
2 голосов
/ 12 мая 2010

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

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

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

1 голос
/ 12 мая 2010

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

...