Вопрос

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

Это было полезно?

Решение

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

http://fscheck.codeplex.com/

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

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

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

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

Другие советы

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

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

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

[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, чтобы заполнить его случайным издевателем данных. Вы также можете добавить специализированные методы для создания случайных строк данных или номеров на основе ограничений, и эти специализированные методы могут быть переданы всем вашим классам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top