2009-08-24 15 views
12

Necesito construir una interfaz de scripting para mi programa C# que hace pruebas de nivel del sistema del firmware incorporado.Extensión de la aplicación C# .NET: ¿crear un lenguaje de scripting personalizado o no?

Mi aplicación contiene bibliotecas para interactuar completamente con los dispositivos. Existen bibliotecas separadas para iniciar acciones, obtener resultados y realizar un seguimiento de éxito/falla. Mi aplicación también tiene una GUI para administrar múltiples dispositivos y asignar muchos scripts para ejecutar.

Para los evaluadores (no programadores, pero técnicos), necesito proporcionar una interfaz de scripting que les permita crear diferentes escenarios para probarlos y ejecutarlos. Simplemente llamarán a mis API y luego devolverán un resultado a mi programa (aprobado/reprobado y mensaje).

Un ejemplo muy básico de lo que quiero:

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 

Cuando las funciones de información, potencia y frecuencia son proporcionados por mis bibliotecas de C#.

¿Serán algo así como IronRuby o IronPython para esto, o debería simplemente construir mi propio lenguaje básico?

¿El código de Ruby/Python se vuelve complicado al tratar de incluir un conjunto de ensamblados compilados .NET? Quiero que sea fácil de aprender y codificar para no programadores y programadores por igual.

EDIT:

Gracias por todas las grandes respuestas. Elegí IronPython como la respuesta ya que tenía más soporte, pero pasaré un poco de tiempo con cada uno de IronPython, Boo e IronRuby para ver lo que los probadores preferirían escribir en los scripts.

Respuesta

16

He oído cosas muy buenas sobre IronPython para exactamente este tipo de escenario. Ciertamente me arriesgaría a pasar unas horas con una prueba de concepto rápida, para ver cómo funciona.

Michael Foord se sentirá feliz con el éxito de IronPython en casos similares (más específicamente para él, para usuarios de hoja de cálculo) y his book covers (IIRC) algunos consejos sobre cómo alojarlo desde .NET.

+0

Eso es grande :) ¿Hay buenos ejemplos/tutoriales para este tipo de integración? Me encantaría ver cómo es el código final de Python para algo como esto. – cgyDeveloper

+0

Estoy bastante seguro de que IronPython In Action cubre algunos (aunque ser árboles muertos puede estar desactualizado); usted podría mirar aquí: http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx –

+0

Tengo un ejemplo que muestra cómo usar Python para scripting C# (o VB.NET) en mi blog en http://www.gotnet.biz/Blog/post/Mixing-Static-and-Dynamic-dotNET-Languages-November-2008-Update.aspx –

2

Estoy de acuerdo con Marc G, aunque vale la pena mencionar que el concepto general es un Langugage específico del dominio. Si bien IronRuby/IronPython no son estrictamente específicos de un dominio, tienen todas las funciones y te permitirán continuar con tu implementación.

Visual Studio tiene las herramientas DSL, y está el material 'M' Grammar que puedes mirar.

Pero sí, IronPython.

+0

Aprendo un nuevo acrónimo todos los días ...DSL ahora está en mi vocabulario (dos veces). Gracias, has ayudado a mi google a buscar toneladas con eso :) – cgyDeveloper

10

Es posible que desee mirar Boo, otro lenguaje administrado que se ejecuta en el CLR, y que es particularmente adecuado para construir DSL y hacer que sus aplicaciones sean programables.

La compilación es directamente extensible desde el lenguaje en sí.

Leer el Boo Manifesto es un buen punto de partida si desea obtener más información al respecto.

[Editar ] me olvidó mencionar que Ayende Rahien está escribiendo un libro completo sobre el tema: Building Domain Specific Languages in Boo

4

Podría valer la pena considerar PowerShell para este tipo de tarea. Puede invocar .Net como cualquiera de los lenguajes de DLR, y tiene un tipo de lenguaje más natural fragmentado para tareas en su concepto de cmdlet (comando-let). Debe escribir los cmdlets en un lenguaje compilado en v1, en v2 que se está iniciando con Win7 y trabajando para versiones anteriores en los próximos meses (v2 para Vista/Win2k8 ahora está en RC), puede compilarlos en PowerShell directamente.

2

Desde la DSL que estás buscando, te recomiendo usar CUCUMBER con IronRuby.

con Pepino, probadores de escribir pruebas que parecen algo así:

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 

Es muy fácil de hacer este lenguaje se ajuste a sus necesidades. Simplemente busque en Google "Cucumber and IronRuby" y encontrará varias guías y publicaciones en blogs para que pueda comenzar.

2

Estamos utilizando Iron Python incorporado para la fórmula de fijación de precios en uno de nuestros proyectos. Así es como una muestra real de cómo se ve.

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 

Es realmente fácil de implementar. La función Max(), por ejemplo, es solo uno de los métodos personalizados de C# que importamos al motor IronPython y parece natural de usar en una configuración de configuración.

+0

Esto se ve muy bien. ¿Cómo fue posible que la función MAX() pareciera tan nativa para el script? Mi problema ahora es que no quiero clases de estilo .NET por todos lados. Cada ejemplo se ve como SomeClass.Max() y solo quiero scripts básicos como los que tiene ... – cgyDeveloper

+0

Si ve este comentario, quizás pueda contribuir con una respuesta a mi pregunta nueva/relacionada en http://stackoverflow.com/questions/1348188/simplfying-dsl-written-for-ac-app-with-ironpython – cgyDeveloper

0

Se podía utilizar en sí C# como lenguaje de script como se describe aquí CrowsProgramming - Runtime Scripting in .Net

+0

He hecho esto en el pasado, y realmente no es lo que estoy buscando. No hay forma de tener una secuencia de comandos que se parece a mi ejemplo con C#, ya que necesita declarar al menos una clase y una función miembro utilizando la sintaxis de estilo C#. – cgyDeveloper

+0

@Kiquenet, eso es desafortunado. Todavía puede obtenerlo a través de Wayback Machine: https://web.archive.org/web/20150303092513/http://www.crowsprogramming.com/archives/99 – Chris

0

IronRuby es el más potente para la creación de lenguajes específicos de dominio, porque es la sintaxis es mucho más flexible y tolerante que pitón del (los usuarios van atornillar el espacio en blanco y molestarse por los métodos obligatorios() para llamar).

Se puede escribir la secuencia de comandos de ejemplo en IronRuby y que se vería así:

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 

He aquí una muestra de un DSL nuestros probadores están utilizando actualmente para escribir pruebas automáticas en contra de nuestra interfaz de usuario

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 

Sin embargo, tal como están las cosas ahora, IronPython es mucho más maduro y tiene un rendimiento mucho mejor que IronRuby, por lo que es posible que prefiera usarlo.

Me fuertemente recomendaría ir ya sea con IronPython o IronRuby sobre la creación de su propio idioma a medida ... se ahorrará una cantidad inimaginable de esfuerzo (y errores)

+0

Gracias por la respuesta. Yo personalmente quería ir con IronRuby (para la sintaxis de corchete libre), pero la madurez de IronPython ganó al final. Ambas son excelentes opciones, pero acabo de tener más problemas con IronRuby durante mi fase de prueba inicial. – cgyDeveloper

Cuestiones relacionadas