Расширение приложения С#.NET - создание пользовательского языка сценариев или нет?
Мне нужно создать интерфейс скриптов для моей программы на С#, которая проверит системное тестирование встроенной прошивки.
Мое приложение содержит библиотеки для полного взаимодействия с устройствами. Существуют отдельные библиотеки для инициирования действий, получения результатов и отслеживания успеха/сбоя. Мое приложение также имеет графический интерфейс для управления несколькими устройствами и назначение множества сценариев для запуска.
Для тестировщиков (не программистов, но технических) мне нужно предоставить интерфейс сценариев, который позволит им придумать разные сценарии для тестирования и запуска их. Они просто собираются вызывать мои 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
Где функции отчетности, мощности и частоты предоставляются моими библиотеками С#.
Будет ли что-то вроде IronRuby или IronPython быть хорошим для этого, или я должен просто создать свой собственный очень простой язык?
Является ли код Ruby/Python запутанным при попытке включить кучу .NET-сборников? Я хочу, чтобы это было легко учиться и кодировать как для программистов, так и для программистов.
EDIT:
Спасибо за все замечательные ответы. Я выбрал IronPython в качестве ответа, поскольку он получил большую поддержку, но я потрачу немного времени на каждый из IronPython, Boo и IronRuby, чтобы посмотреть, что тестеры предпочитают писать сценарии.
Ответы
Ответ 1
Я слышал очень хорошие вещи о IronPython для такого типа сценария. Я бы, конечно, рискнул потратить несколько часов на краткое доказательство концепции, чтобы посмотреть, как она работает.
Майкл Фоор с радостью воскликнет о успехе IronPython в подобных случаях (в частности, для него, для опытных пользователей в электронной таблице) и
Ответ 2
Вы можете посмотреть Boo, другой управляемый язык, который работает на CLR, и который особенно хорошо подходит для сборки DSL и сделать ваши приложения доступными для сценариев.
Конвейер компиляции напрямую расширяется из самого языка.
Чтение Boo Manifesto является хорошей отправной точкой, если вы хотите узнать больше об этом.
[ Изменить] Я забыл упомянуть, что Айенде Рахиен пишет полную книгу по теме:
Создание доменных языков в Boo
Ответ 3
Возможно, стоит рассмотреть PowerShell для такого рода задач. Это может вызвать в .Net так же, как и любой из DLR-языков, и имеет более естественный язык, который разбивается на задачи в его командлетной (командной) концепции. Вы должны написать командлеты на скомпилированном языке в версии v1 - in v2, которая запускается с Win7 и работает в более ранних версиях в течение следующих нескольких месяцев (v2 для Vista/Win2k8 теперь находится на RC), вы можете создавать те в PowerShell напрямую.
Ответ 4
Я согласен с Marc G, хотя стоит упомянуть, что общая концепция - это Domain Specific Langugage. Хотя IronRuby/IronPython не являются строго специфичными для домена, они полнофункциональны, и это оставит вас в курсе вашей реализации.
В Visual Studio есть инструменты DSL, а также материалы грамматики "M", которые вы можете изучить.
Но да, IronPython.
Ответ 5
Из 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 "Огурцы и IronRuby", и вы найдете несколько руководств и сообщений в блогах, чтобы начать работу.
Ответ 6
Мы используем встроенный 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() является всего лишь одним из настраиваемых методов С#, которые мы импортируем в движок IronPython, и выглядит естественным для использования в настройках конфигурации.
Ответ 7
Вы можете просто использовать С# как язык сценариев, как описано здесь CrowsProgramming - сценарий выполнения в .Net
Ответ 8
IronRuby является самым мощным для создания доменных языков, потому что его синтаксис гораздо более гибкий и прощающий, чем python (ваши пользователи собираются вставлять пробелы и раздражаться с помощью методов обязательных() вызовов).
Вы можете написать свой образец script в 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 на создание собственного пользовательского языка... Вы сэкономите невообразимое количество усилий (и ошибок)