Подтвердить что ты не робот

Расширение приложения С#.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, чтобы посмотреть, что тестеры предпочитают писать сценарии.

4b9b3361

Ответ 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, и выглядит естественным для использования в настройках конфигурации.

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