JRuby - warto?

Post Drogusa w Dyskusjach przypomniał mi, że Cucumber+Webrat nie wystarczą mi do testowania moich aplikacji, które mają się bardzo opierać na AJAX.

Zastanawia mnie, jak powinienem sobie skonfigurować środowisko do pracy.
Załóżmy, że w firmie jest niewielu developerów (2-3) pracujących zdalnie. Z założenia każdy z nich ma dostać tak samo działająca skrzynkę (PC). Rozważam dwie opcje:

  1. Na każdym komputerze zainstalowany Ruby i JRuby+Culerity. Każdy programista odpala testy integracyjne przed pushem do wspólnego, centralnego repozytorium.
  2. Na każdym komputerze zwykły Ruby. Postawić 2 serwery. Jeden z JRuby+Culerity i z repozytorium testowym. Po każdym pushu do tego repo startują testy culerity (pytanie: jak wyprowadzić wyniki?). Szef projektu co jakiś czas robi pulla z repo testowego (o ile testy wszysktie ok) do repozytorium głównego, z którego można przeprowadzić deploya na serwery produkcyjne. IMHO wadą tego rozwiązania jest to, że programista nie może odpalić testów przed pushem ze swojego komputera.

Opcja 1 jest chwilowo dla mnie niedostępna. Pod Fedorą nie ma lekko, musiałbym z dostarczonych przez developerów targz instalować (jakis plugin w cucumberze wymaga jruby 1.3.0, a ww fedorze 11 mam jruby 1.1.6). Dość już napieszałem w systemie, by instalować 3cią wersję Rubiego :wink:

Ja bym wybrał obie opcje :wink:

Żeby każdy mógł sobie odpalić testy u siebie i żeby było coninuous integration. W przypadku uruchamiania testów u siebie warto pamiętać, że cucumber pozwala na tagowanie, więc można aktualnie katowane scenariusze oznaczyć np. tagiem @focus, albo @current i odpalać tylko te scenariusze. A cały test suite raczej po commitach.

Nigdy nie instalowałem JRubiego z jakichś paczek. jruby “instaluje” się banalnie łatwo. Ściągasz paczkę, rozpakowujesz do jakiegoś katalogu (np. /opt/jruby) i dodajesz do PATH ścieżkę, np: export PATH=$PATH:/opt/jruby/bin (i to najlepiej wrzucić do .bashrc czy innego profile czy do jakiegokolwiek innego pliku, który się ładuje przy starcie).

I to właściwie cała filozofia, można też wtedy korzystać z jruby -S, żeby odpalić niektóre polecenia dla jruby, np:

jruby -S gem install ...

Dlatego olej paczki i ściągnij jrubiego :slight_smile:

(tak, wiem, że jeszcze niedawno pastwiłem się nad windowsem właśnie za konieczność ręcznego ściągania czegokolwiek, ale to naprawdę jest jeden z niewielu wyjątków :wink: )

Hm, może głupie pytanie, ale srodowisko developerskie (jak sobie script/server robie) też na jruby? czy tylko w celu używania culerity?
Da się jakoś “uwspólnić” gemy obu interpreterów?

Krótko: Jest sens posiadania ruby i jruby i utrzymywania tych samych zestawów gemów?

Edit:
Co by przybliżyć tresć wątku do tematu (przypadkiem taki ogólny tytuł podałem):
http://blog.razorjack.net/2009/06/01/ruby-1-8-ruby-1-9-jruby-1-3-rc2-porownanie-wydajnosci/

Na blogusiu opisałem jak testuję z culerity: http://drogomir.com/blog/2009/6/16/cucumber-and-celerity-testing-unobtrusive-javascript, może to Ci trochę rozjaśni.

Jeżeli nie masz zamiaru robić deploymentu na jruby, to tylko dla celerity (gem do testowania to celerity, culerity to proxy pomiędzy celerity i wersjami rubiego innymi niż jruby).

[quote]Da się jakoś “uwspólnić” gemy obu interpreterów?

Krótko: Jest sens posiadania ruby i jruby i utrzymywania tych samych zestawów gemów?[/quote]
Nie da się uwspólnić i nie ma takiej potrzeby. Ja mam jruby z zainstalowanym tylko celerity (+ zależności celerity)

Muszę tu od razu napisać, że culerity jest bardzo fajnym narzędziem, ale ma jedną dużą wadę - nie można używać metod z blokami, bo nie jest zaimplementowane przesyłanie bloków z procesu w ruby do procesu jruby. Wynika to głównie z tego, że bloki muszą posiadać kontekst, więc nawet jakby wykorzystać ruby2ruby, to i tak nie ma jak przesłać kontekstu. Pracowałem nad rozwiązaniem tego problemu i mam prawie gotowe rozwiązanie, ale nie miałem czasu tego dokończyć i stestować. Jak skończę to wrzucę to do swojego forka culerity i dam znać. :slight_smile:

dzięki :wink:

O. Wiele wyjasnia :wink:

Hm, ma to coś wspólnego z tym, że w helperze miałem coś w stylu:

concat("<table>", proc.binding)

i się sypało pod jruby?

Nie, tu chodzi tylko i wyłącznie o metody celerity. Jakby nie dało się używać bloków w railsach przy używaniu celerity, to i tak by nic nie działało :wink:

Chodzi o sytuację np taką:

# chcemy w celerity kliknąć na linka i potwierdzić confirmation dialog, który wyskoczy po kliknięciu browser.confirm(true) do browser.link(:text, "Cośtam).click end
culerity prześle do celerity odpalonego w jruby tylko:

browser.confirm(true)

co wywali error, że confirm, próbuje wykonać yield bez bloku.