2009-08-24 15 views
12

È necessario creare un'interfaccia di scripting per il mio programma C# che esegua il test a livello di sistema del firmware incorporato.Estensione dell'applicazione C# .NET - creare un linguaggio di scripting personalizzato o no?

La mia applicazione contiene librerie per interagire pienamente con i dispositivi. Esistono librerie separate per avviare azioni, ottenere output e tracciare successi/insuccessi. La mia applicazione ha anche una GUI per la gestione di più dispositivi e l'assegnazione di molti script da eseguire.

Per i tester (non programmatori, ma tecnici), è necessario fornire un'interfaccia di scripting che consenta loro di creare scenari diversi per testarli ed eseguirli. Chiameranno le mie API e restituiranno un risultato al mio programma (pass/fail e messaggio).

Un esempio molto semplice di ciò che voglio:

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 

Se le funzioni di reporting, potenza e frequenza sono forniti dai miei C# librerie.

Sarà qualcosa di simile a IronRuby o IronPython essere buono per questo, o dovrei semplicemente creare il mio linguaggio di base?

Il codice Ruby/Python si confonde quando si tenta di includere un gruppo di assembly compilati .NET? Voglio che sia facile da imparare e codificare per programmatori e programmatori.

EDIT:

Grazie per tutte le grandi risposte. Ho scelto IronPython come risposta dal momento che aveva il maggior supporto, ma passerò un po 'di tempo con IronPython, Boo e IronRuby per vedere in che cosa i tester preferirebbero scrivere script.

risposta

16

Ho sentito cose molto buone su IronPython per esattamente questo tipo di scenario. Certamente rischierei di dedicare qualche ora a una rapida dimostrazione del concetto, per vedere come va a finire.

Michael Foord sarà felicemente lirico sul successo di IronPython in casi simili (in particolare per lui, per utenti esperti di fogli elettronici), e his book covers (IIRC) alcuni suggerimenti su come ospitarlo da .NET.

+0

Che bello :) Ci sono dei buoni esempi/tutorial per questo tipo di integrazione? Mi piacerebbe vedere come appare il codice Python finale per qualcosa di simile. – cgyDeveloper

+0

Sono abbastanza sicuro che IronPython In Action ne copre alcuni (anche se essere alberi morti potrebbe non essere aggiornato); potresti guardare qui: http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx –

+0

Ho un esempio che mostra come usare Python per lo scripting C# (o VB.NET) sul mio blog all'indirizzo http://www.gotnet.biz/Blog/post/Mixing-Static-and-Dynamic-dotNET-Languages-November-2008-Update.aspx –

2

Sono d'accordo con Marc G, anche se vale la pena ricordare che il concetto generale è un Langugage specifico del dominio. IronRuby/IronPython non sono strettamente specifici del dominio, ma sono full-optional e ti lascerebbero andare avanti con la tua implementazione.

Visual Studio dispone degli strumenti DSL e contiene la grammatica "M" che è possibile esaminare.

Ma sì, IronPython.

+0

Imparo un nuovo acronimo ogni giorno ...DSL è ora nel mio vocabolario (due volte). Grazie, hai aiutato le mie ricerche su Google a tonnellate solo con questo :) – cgyDeveloper

10

Si consiglia di esaminare Boo, un altro linguaggio gestito che viene eseguito su CLR e che è particolarmente adatto per creare DSL e rendere le applicazioni programmabili.

La pipeline di compilazione è direttamente estensibile dalla lingua stessa.

Leggere lo Boo Manifesto è un buon punto di partenza se si desidera saperne di più.

[Edit] Ho dimenticato di dire che Ayende Rahien sta scrivendo un libro completo sul tema: Building Domain Specific Languages in Boo

4

Potrebbe essere opportuno prendere in considerazione PowerShell per questo tipo di compito. Ciò può richiamare in .Net proprio come qualsiasi linguaggio DLR, e ha un chunking di tipo di linguaggio più naturale per le attività nel suo concetto di cmdlet (comando-let). Devi scrivere i cmdlet in un linguaggio compilato alla v1 - nella v2 che è in fase di sviluppo partendo da Win7 e lavorando alle vecchie versioni nei prossimi mesi (v2 per Vista/Win2k8 è ora su RC), puoi costruirle in PowerShell direttamente.

2

Dalla DSL che stai cercando, ti consiglio di usare CUCUMBER con IronRuby.

con cetrioli, i tester scrivere test che sembrano una cosa del genere:

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 

E 'molto facile fare questo linguaggio si adatta alle tue esigenze. Basta google "Cucumber and IronRuby" e troverai diverse guide e post sul blog per iniziare.

2

Stiamo utilizzando Iron Python incorporato per la formula dei prezzi in uno dei nostri progetti. Questo è un esempio reale di come appare.

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 

È davvero semplice da implementare. La funzione Max(), ad esempio, è solo uno dei metodi C# personalizzati che importiamo nel motore IronPython e sembra naturale da utilizzare nelle impostazioni di configurazione.

+0

Questo sembra davvero fantastico. Come sei riuscito a rendere la funzione MAX() così nativa allo script? Il mio problema ora è che non voglio le classi di stile .NET ovunque. Ogni esempio sembra SomeClass.Max() e voglio solo uno script di base come quello che hai ... – cgyDeveloper

+0

Se ti capita di vedere questo commento, forse potresti dare una risposta alla mia nuova domanda/correlata su http://stackoverflow.com/questions/1348188/simplfying-dsl-written-for-ac-app-with-ironpython – cgyDeveloper

0

Si potrebbe utilizzare C# per sé come linguaggio di scripting come descritto qui CrowsProgramming - Runtime Scripting in .Net

+0

Ho fatto questo in passato, e non è davvero quello che sto cercando. Non c'è modo di avere uno script che assomiglia al mio esempio usando C# poiché è necessario dichiarare almeno una funzione di classe e un membro usando la sintassi in stile C#. – cgyDeveloper

+0

@ Kiquenet, questo è un peccato. Puoi comunque accedervi tramite Wayback Machine: https://web.archive.org/web/20150303092513/http://www.crowsprogramming.com/archives/99 – Chris

0

IronRuby è il più potente per la creazione di linguaggi specifici del dominio, perché è la sintassi è molto più flessibile e indulgente di pitone di (gli utenti sono in corso avvitare gli spazi bianchi e infastidirsi con i metodi obbligatori() per chiamare).

Si potrebbe scrivere lo script di esempio in IronRuby e sarebbe simile a questa:

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 

Ecco un esempio di un DSL nostri tester stanno attualmente utilizzando scrivere dei test automatizzati contro la nostra interfaccia utente

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 

Tuttavia, come stanno le cose adesso IronPython è molto più maturo e ha prestazioni molto migliori di IronRuby, quindi potresti preferire di usarlo.

avrei vivamente di andare sia con IronPython o IronRuby sopra creare il proprio linguaggio personalizzato ... si risparmia una quantità inimmaginabile di sforzo (e gli insetti)

+0

Grazie per la risposta. Personalmente volevo andare con IronRuby (per la sintassi gratuita della parentesi), ma alla fine la maturità di IronPython ha vinto. Entrambe sono davvero grandi opzioni, ma ho appena avuto più problemi con IronRuby durante la mia fase di test iniziale. – cgyDeveloper

Problemi correlati