2009-08-24 13 views
12

Potrzebuję zbudować interfejs skryptowy dla mojego programu C#, który testuje na poziomie systemowym osadzone oprogramowanie.Rozszerzanie aplikacji C# .NET - czy tworzysz niestandardowy język skryptowy, czy nie?

Moja aplikacja zawiera biblioteki do pełnej interakcji z urządzeniami. Istnieją oddzielne biblioteki do inicjowania działań, uzyskiwania wyników i śledzenia sukcesu/niepowodzenia. Moja aplikacja ma również GUI do zarządzania wieloma urządzeniami i przypisywania wielu skryptów do uruchomienia.

Dla testerów (nie programistów, ale technicznych), muszę dostarczyć interfejs skryptowy, który pozwoli im wymyślić różne scenariusze testowania i uruchamiania ich. Po prostu zadzwonią do moich API, a następnie zwrócą wynik do mojego programu (pass/fail i wiadomość).

To bardzo prosty przykład tego, co chcę:

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 

Gdzie funkcje raportowania, moc i częstotliwość są dostarczane przez moich C# bibliotek.

Czy coś takiego jak IronRuby czy IronPython będzie na to odpowiednie, czy powinienem po prostu zbudować własny, bardzo podstawowy język?

Czy kod Ruby/Pythona zaczyna się brudzić, próbując dołączyć kilka skompilowanych zestawów .NET? Chcę, aby była łatwa do nauczenia i kodowania dla programistów i programistów.

EDYTOWANIE:

Dzięki za wszystkie świetne odpowiedzi. Jako odpowiedź wybrałem IronPythona, ponieważ miał on najwięcej wsparcia, ale spędzę trochę czasu z każdym z IronPython, Boo i IronRuby, aby zobaczyć, co testerzy wolą pisać w skryptach.

Odpowiedz

16

Słyszałem bardzo dobre rzeczy o IronPython dla dokładnie tego typu scenariusz. Zaryzykowałbym ryzyko spędzenia kilku godzin na szybkim proof-of-concept, żeby zobaczyć, jak to wygląda.

Michael Foord szczęśliwie woskuje liryczne o sukcesie IronPythona w podobnych przypadkach (w szczególności dla niego, dla doświadczonych użytkowników arkuszy kalkulacyjnych), i his book obejmuje (IIRC) kilka wskazówek dotyczących hostowania go z .NET.

+0

to świetnie :) Czy są jakieś dobre przykłady/tutoriale dla tego rodzaju integracji? Chciałbym zobaczyć, jak wygląda końcowy kod Pythona do czegoś podobnego. – cgyDeveloper

+0

Jestem prawie pewny, że IronPython In Action obejmuje niektóre (chociaż są to martwe drzewa, które mogą być nieaktualne); możesz zajrzeć tutaj: http://blogs.msdn.com/srivatsn/archive/2008/09/16/hosting-ironpython-made-easier.aspx –

+0

Mam przykład, który pokazuje, jak używać Pythona do skryptowania C# (lub VB.NET) na moim blogu na http://www.gotnet.biz/Blog/post/Mixing-Static-and-Dynamic-dotNET-Languages-November-2008-Update.aspx –

2

Zgadzam się z Marcem G, choć warto wspomnieć, że ogólną koncepcją jest Langugage specyficzne dla danej domeny. Chociaż IronRuby/IronPython nie są ściśle określone w konkretnej domenie, są one w pełni funkcjonalne i pozwolą ci przystąpić do implementacji.

Visual Studio ma narzędzia DSL, a także gramatykę "M", którą można zaglądać.

Ale tak, IronPython.

+0

Każdego dnia uczę się nowego akronimu ...DSL jest teraz w moim słowniku (dwa razy). Dzięki, pomogłeś mojemu google przeszukiwać tonę właśnie z tym :) – cgyDeveloper

10

Być może zechcesz spojrzeć na Boo, inny zarządzany język, który działa na CLR, i który jest szczególnie dobrze dostosowany do budowania DSL i sprawia, że ​​twoje aplikacje są skryptowalne.

Linię kompilacji można bezpośrednio rozszerzyć z języka.

Czytanie Boo Manifesto jest dobrym punktem wyjścia, jeśli chcesz dowiedzieć się więcej na ten temat.

[Edit] Zapomniałam wspomnieć, że Ayende Rahien pisze kompletną książkę na temat: Building Domain Specific Languages in Boo

4

To może być warte rozważenia PowerShell dla tego rodzaju zadania. To może wywoływać .Net, tak jak każdy inny język DLR, i ma bardziej naturalny typ języka do dzielenia zadań w swojej koncepcji cmdlet (command-let). Musisz napisać polecenia cmdlet w skompilowanym języku na v1 - w v2, który jest rozwijany zaczynając od Win7 i pracując na starszych wersjach w ciągu najbliższych kilku miesięcy (v2 dla Vista/Win2k8 jest teraz w RC), możesz je zbudować bezpośrednio w PowerShell.

2

Z DSL, do którego się wybierasz, polecam użyć CUCUMBER z IronRuby.

z ogórkiem, testery napisać testy, które wyglądać tak:

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 

Jest to bardzo proste, aby ten język swoich potrzeb. Wystarczy google "Cucumber and IronRuby", a znajdziesz kilka przewodników i blogów, aby zacząć.

2

Używamy wbudowanego żelaza Pythona do formułowania cen w jednym z naszych projektów. Oto jak wygląda prawdziwa próbka.

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 

Jest naprawdę prosty w realizacji. Funkcja Max() jest na przykład jedną z niestandardowych metod C#, które importujemy do silnika IronPython i wygląda naturalnie w ustawieniach konfiguracyjnych.

+0

To wygląda naprawdę świetnie. W jaki sposób można było sprawić, aby funkcja MAX() wyglądała tak dobrze w scenariuszu? Mój problem polega teraz na tym, że nie chcę klas stylu .NET w każdym miejscu. Każdy przykład wygląda jak SomeClass.Max(), a ja po prostu chcę mieć podstawowe skrypty, takie jak Ty ... – cgyDeveloper

+0

Jeśli zobaczysz ten komentarz, być może mógłbyś udzielić odpowiedzi na moje nowe/powiązane pytanie na http://stackoverflow.com/questions/1348188/simplfying-dsl-written-for-ac-app-with-ironpython – cgyDeveloper

0

Można po prostu użyć C# się jako języka skryptowego, jak opisano tutaj CrowsProgramming - Runtime Scripting in .Net

+0

Zrobiłem to w przeszłości i naprawdę nie jest to, czego szukam. Nie ma sposobu, aby skrypt, który wygląda jak mój przykład przy użyciu C#, ponieważ musisz zadeklarować co najmniej jedną klasę i jedną funkcję składową przy użyciu składni w stylu C#. – cgyDeveloper

+0

@Kiquenet, to niefortunne. Nadal możesz się do niego dostać przez Wayback Machine: https://web.archive.org/web/20150303092513/http://www.crowsprogramming.com/archives/99 – Chris

0

IronRuby jest najmocniejszym do tworzenia języków domen specyficzne, ponieważ jest składnia jest znacznie bardziej elastyczny i wyrozumiały niż Pythona (użytkownicy będą skręcić biały znak i denerwować się metodami obowiązkowymi() do wywołania).

Można napisać skrypt próbki w IronRuby i to będzie wyglądać następująco:

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 

Oto próbka DSL nasze Testery są aktualnie używanego napisać zautomatyzowanych testów przed naszym UI

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 

Jednak w obecnej chwili IronPython jest znacznie bardziej dojrzały i ma znacznie lepszą wydajność niż IronRuby, więc możesz go użyć.

Chciałbym gorąco polecam zarówno z IronPython lub IronRuby na tworzenie swój własny język ... Musisz zapisać niewyobrażalną ilość wysiłku (i błędów)

+0

Dzięki za odpowiedź. Osobiście chciałem iść z IronRuby (dla składni bez użycia nawiasu), ale dojrzałość IronPythona wygrała w końcu. Oba są naprawdę świetnymi opcjami, ale podczas mojej początkowej fazy testów napotkałem więcej problemów z IronRuby. – cgyDeveloper

Powiązane problemy