Какая стратегия построения тестовых данных

#java #unit-testing

#java #модульное тестирование

Вопрос:

Я новичок в мире разработки, и мне интересно, какая лучшая стратегия для создания согласованных сложных тестовых данных (я имею в виду, что мои POJO сложны для заполнения) для модульного тестирования?

Я слышал о «Построителе тестовых данных», но в Сети об этом слишком мало говорится.

Ответ №1:

Мне часто нужно выполнить точно такую же задачу. Нечеткое тестирование является подходящим подходом, хотя мы должны быть осторожны, чтобы различать необработанные фаззеры и интеллектуальные фаззеры. Интеллектуальный фаззер отличается от обычного инструмента fuzz (такого как zzuf) тем, что он создает данные, предназначенные для вашего приложения. Очевидно, что в этом случае вам нужен умный фаззер.

Чтобы написать интеллектуальный фаззер, вам нужно извлечь те правила, которые представляют «согласованный», и использовать их в качестве логики. Вероятно, лучше всего привести пример. Model Приведенный ниже класс имеет некоторую логику против этого.

 class Model {

    // Should always be between 0 and 10
    int a;

    // Children
    List<Model> children;

    // Only true at the root
    boolean isRoot;
}
  

Мы можем написать для этого конструктор тестовых данных, просто кодифицировав эти правила.

 class ModelGenerator {
   private Random random;

   // A seed is a good idea; you want your tests to be reproducible
   public ModelGenerator(int seed) {
       random = new Random(seed);
   }

   public Model arbitrary () {
       return generateSingleItem(true);
   }

   private Model generateSingleItem(boolean isRoot) {
       Model model = new Model();
       model.isRoot = isRoot;
       model.a = random.nextInt(10);

       int childrenCount = random.nextInt(100);
       model.children = new ArrayList<Model>(childrenCount);
       for (int i=0;i<childrenCount;  i) {
            model.children.add(generateSingleItem(false));
       }

       return model;
   }
}
  

Теперь вы можете использовать генератор для создания случайных (но предсказуемых благодаря начальным данным) моделей для тестирования утверждений.

Этот подход очень тесно связан с QuickCheck. Доступна версия Java, которая предоставляет общий интерфейс (и многое другое!), подобный подходу, описанному выше.

Комментарии:

1. Спасибо за ваш ответ, но перед тестированием надежности моего приложения мне нужно предоставить жизнеспособные данные для модульных тестов.

2. Наверное, я очень плохо объяснился, извините! В приведенном выше примере ModelGenerator создает данные для ваших модульных тестов.

3. Хорошо, если я вас правильно понял, ваш подход выглядит так, как описано на этом веб-сайте: ссылка ?

4. Похоже, да, но не совсем то же самое. Я думаю, что шаблон ObjectMother (которого я раньше не видел, так что спасибо за ссылку!) просто фокусируется на генерации одного набора объектов, тогда как генераторный подход, который я защищаю, генерирует случайные (но удовлетворяющие некоторым ограничениям) объекты.

5. Хорошо, большое спасибо за ваше время, если вас интересует шаблон «Object Mother», возможно, вас больше заинтересует шаблон «Test Data Builder», описанный здесь по ссылке , взгляните и на этот тоже . Если вы несколько раз, пожалуйста, дайте мне свой отзыв.