Расширение приложения C# .NET - создавать собственный язык сценариев или нет?

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

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

Для тестировщиков (не программистов, но технических) мне нужно предоставить интерфейс сценариев, который позволит им предлагать различные сценарии для тестирования и запускать их. Они просто будут вызывать мои API и затем возвращать результат моей программе (pass/fail и message).

Очень простой пример того, что я хочу:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
IF GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
ELSE
  REPORT_FAIL "Failed to tune to " + frequency
ENDIF
TURN_POWER_OFF

Где функции отчетности, питания и частоты предоставляются моими библиотеками C#.

Будет ли что-то вроде IronRuby или IronPython хорошо для этого или я просто создам свой очень простой язык?

Не нарушается ли код Ruby/Python при попытке включить несколько сборок.NET? Я хочу, чтобы это было легко изучать и кодировать как для непрограммистов, так и для программистов.

РЕДАКТИРОВАТЬ:

Спасибо за все отличные ответы. Я выбрал IronPython в качестве ответа, так как он имел наибольшую поддержку, но я проведу немного времени с каждым из IronPython, Boo и IronRuby, чтобы увидеть, что тестировщики предпочтут писать сценарии.

8 ответов

Решение

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

Майкл Фурд с радостью расскажет о успехе IronPython в подобных случаях (особенно для него, для опытных пользователей электронных таблиц), а также в своих книгах (IIRC) несколько указаний о его размещении в.NET.

Возможно, вы захотите взглянуть на Boo, еще один управляемый язык, который работает на CLR и который особенно хорошо подходит для создания DSL и создания приложений с возможностью написания сценариев.

Конвейер компиляции напрямую расширяется из самого языка.

Чтение Бу Манифеста является хорошей отправной точкой, если вы хотите узнать о нем больше.

[Edit] Я забыл упомянуть, что Ayende Rahien пишет полную книгу на тему: Создание доменных языков в Boo

Возможно, стоит рассмотреть PowerShell для такого рода задач. Это может вызывать.Net так же, как и любой другой язык DLR, и имеет более естественный тип разбиения на языки для задач в своей концепции cmdlet (command-let). Вы должны написать командлеты на скомпилированном языке в версии v1 - в версии v2, которая развертывается начиная с Win7 и работает в более старых выпусках в течение следующих нескольких месяцев (версия v2 для Vista/Win2k8 в RC сейчас), вы можете создать эти в PowerShell напрямую.

Мы используем встроенный Iron Python для расчета цены в одном из наших проектов. Вот как выглядит настоящий образец того, как это выглядит.

E_DOCUMENT_CHECK = DCPAV * ADS_NUM
E_SPECIFIC_TAX = STV
E_RESOURCE_DEV = RDV
E_LP_ISSUANCE = LPIV
E_ANNUAL_FEES = APFCV * SA * SIDES_NUM
E_SERVICE_FEES= MAX(
MINSFV,
E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES)
TOTAL= E_DOCUMENT_CHECK+E_SPECIFIC_TAX+E_RESOURCE_DEV+E_LP_ISSUANCE+E_ANNUAL_FEES+E_SERVICE_FEES

Это действительно просто реализовать. Например, функция Max() является лишь одним из пользовательских методов C#, которые мы импортируем в механизм IronPython, и это выглядит естественным для использования в настройках конфигурации.

Я согласен с Марком Дж., Хотя стоит упомянуть, что общая концепция - это предметно-ориентированный язык. Хотя IronRuby/IronPython не являются строго специфичными для домена, они являются полнофункциональными, и это позволит вам продолжить реализацию.

Visual Studio имеет инструменты DSL, и есть грамматика "M", которую вы можете посмотреть.

Но да, IronPython.

Из DSL, который вы собираетесь использовать, я бы порекомендовал использовать CUCUMBER с IronRuby.

С Cucumber тестеры пишут тесты, которые выглядят примерно так:

Scenario: See all vendors
Given I am logged in as a user in the administrator role
And There are 3 vendors
When I go to the manage vendors page
Then I should see the first 3 vendor names

Очень легко сделать этот язык подходящим для ваших нужд. Просто Google "Cucumber and IronRuby", и вы найдете несколько руководств и сообщений в блоге, чтобы начать.

Вы можете просто использовать сам C# в качестве языка сценариев, как описано здесь CrowsProgramming - сценарии выполнения в.Net

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

Вы можете написать свой пример скрипта на IronRuby, и он будет выглядеть так:

TURN_POWER_ON
TUNE_FREQUENCY frequency
WAIT 5
if GET_FREQUENCY == frequency
  REPORT_PASS "Successfully tuned to " + frequency
else
  REPORT_FAIL "Failed to tune to " + frequency
end
TURN_POWER_OFF

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

window = find_window_on_desktop "OurApplication"
logon_button = window.find "Logon"
logon_button.click

list = window.find "ItemList"
list.should have(0).rows

add_button = window.find "Add new item"
add_button.click
list.should have(1).rows

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

Я настоятельно рекомендую использовать IronPython или IronRuby вместо создания собственного языка... Вы сэкономите немыслимое количество усилий (и ошибок).

Ирония также может быть хорошим кандидатом здесь. Вот пример, который создает анимацию для данного изображения на лету.

Set camera size: 400 by 300 pixels.
Set camera position: 100, 100.
Move 200 pixels right.
Move 100 pixels up.
Move 250 pixels left.
Move 50 pixels down.

Учебник по созданию такого DSL находится здесь: написание вашего первого домена конкретного языка

Это старое учебное пособие, но автор все еще хранит здесь свою библиотеку: Github Irony

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