DSL для генерации данных тестирования

Существует несколько способов генерировать данные для тестов (не только модульные тесты), например, Объектный Родительский элемент, разработчики, и т.д. Другой полезный подход к данным теста записи как простой текст:

product: Main; prices: 145, 255; Expire: 10-Apr-2011; qty: 2; includes: Sub
product: Sub; prices: 145, 255; Expire: 10-Apr-2011; qty: 2

и затем проанализируйте его в объекты C#. Это просто в использовании в модульных тестах (потому что глубоко внутренние наборы могут быть записаны в одной строке), это еще более удобно для использования в подобной FitNesse системе (потому что этот DSL естественно вписывается в Wiki), и так далее.

Таким образом, я использую это и синтаксический анализатор записи, но это утомительно для записи каждый раз. Я не крупный эксперт в синтаксических анализаторах DSL/language, но я думаю, что они могут помочь здесь. Каков был бы правильный для использования? Я только слышал о:

  • DSL (я имею в виду, любой DSL),
  • Шиканье (то, что я думаю, может сделать DSL),
  • ANTLR

но я даже не знаю, какой выбрать и где запустить.

Так вопрос: действительно ли разумно использовать некоторый DSL для генерации данных тестирования? Что Вы предложили бы сделать так? Есть ли какие-либо существующие случаи?

Обновление: кажется, что я не был достаточно ясен. Это не о необработанной строке для возражения convertion. Взгляд на первую строку и связывает его с

var main = Product.New("Main")
   .AddPrice(Price.New(145).WithType(PriceType.Main).AndQty(2))
   .AddPrice(Price.New(255).WithType(PriceType.Maintenance).AndQty(2))
   .Expiration(new DateTime(10, 04, 2011));
var sub =  Product
   .New("Sub").Parent(main)
   .AddPrice(...));
main.AddSubProduct(sub);
products.Add(main);
products.Add(sub);

И обратите внимание, что я сначала создаю побочный продукт и затем добавляю его к основному, даже при том, что это перечислено в обратном порядке. Цены обрабатываются специальным способом. Я хочу указать название Побочного продукта и получить ссылку на него - созданный. Я хочу перечислить все свойства продукта - ПЛОСКИЙ и NON-REPEATATIVE - на одной строке. Я хочу использовать значения по умолчанию для свойств. И так далее.

Обновление: я не убежден избежать DSL, потому что все альтернативные примеры являются слишком подробными и не удобными для пользователя. И никто не сказал ничего полезного о DSL.

5
задан queen3 14 April 2010 в 10:25
поделиться

3 ответа

Я бы начал с того, что посмотрел, достаточно ли богат мой выбранный язык для создания DSL. C# должен справиться с вашим случаем довольно легко:

Product[] products = new Product[] {
    new TestProduct{product="Main", prices=new[]{145, 255}, Expire="10-Apr-2011", qty=2, includes="Sub"},
    new TestProduct{product="Sub", prices=new[]{145, 255}, Expire="10-Apr-2011", qty=2}
};

Не совсем так красиво, но достаточно терпимо, чтобы оправдать дополнительные усилия по созданию собственного DSL.

Также обратите внимание, что Expire инициализируется строкой, но очевидно, что это дата. Это вполне разумно для идиомы DSL, поскольку сеттер TestProduct.Expire может выполнить перевод.

1
ответ дан 15 December 2019 в 06:21
поделиться

Для создания внешнего DSL я бы порекомендовал Eclipse TMF Xtext, который действительно хорош (основан на ANTLR, но проще), но построен на Eclipse и Java, однако вы можете сгенерировать любой код. Когда дело доходит до создания данных тестирования, меня вдохновляет способ, которым ребята из Ruby on Rails это делают, то есть фикстуры YAML, как упоминалось в другом ответе, но я также увидел подход с использованием фабрик, который может помочь вам избавиться от некоторой двуличности и негибкости. Взгляните на этот Railscasts 158: Factory not Fixtures , он может дать вам некоторые идеи для проектирования DSL.

0
ответ дан 15 December 2019 в 06:21
поделиться

Для данных DSL YAML является отличным кандидатом. Вот образец из Википедии:

---
receipt:     Oz-Ware Purchase Invoice
date:        2007-08-06
customer:
    given:   Dorothy
    family:  Gale

items:
    - part_no:   A4786
      descrip:   Water Bucket (Filled)
      price:     1.47
      quantity:  4

    - part_no:   E1628
      descrip:   High Heeled "Ruby" Slippers
      price:     100.27
      quantity:  1

bill-to:  &id001
    street: |
            123 Tornado Alley
            Suite 16
    city:   East Westville
    state:  KS

ship-to:  *id001

specialDelivery:  >
    Follow the Yellow Brick
    Road to the Emerald City.
    Pay no attention to the
    man behind the curtain.

Я использовал YAML в нескольких проектах и ​​доволен им.

Однако, если мы говорим о модульных -тестах, обычно проще и удобнее создавать необходимые объекты «вручную» с конструкторами и назначением свойств на месте. Это связано с тем, что модульные тесты по своей природе сильно ориентированы на некоторый код (модуль), и не должно быть сложно создать инфраструктуру данных, которая будет только , достаточной для теста. Можно работать с полузаполненными объектами в модульных тестах, не беспокойтесь о построении данных, не связанных с этим конкретным тестом.

Для функциональных тестов YAML отлично подходит.

2
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: