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

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

EDIT:

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

Ответы [ 9 ]

16 голосов
/ 25 августа 2009

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

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

10 голосов
/ 25 августа 2009

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

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

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

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

4 голосов
/ 25 августа 2009

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

2 голосов
/ 27 августа 2009

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

2 голосов
/ 25 августа 2009

Из 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", и вы найдете несколько руководств и сообщений в блоге, чтобы начать работу.

2 голосов
/ 25 августа 2009

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

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

Но да, IronPython.

0 голосов
/ 05 марта 2019

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

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

0 голосов
/ 04 ноября 2009

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

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

0 голосов
/ 01 октября 2009

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

...