Ruby/JRuby på Android…
Återbesökte ett gammalt dilemma i kväll och kom nu närmare målet än jag någonsin har gjort förut!
Bakgrunden är att jag är nyfiken på om det går att köra BDD (Behaviour Driven Development) med Cucumber/RSpec mot Android java implementationer utan extrem overhead i syfte till att automatisera integration och systemtest från Jenkins eller lokalt bygge.
Jag har länge tittat på Robotium samt ett eget API för att agera “mellanhand” mellan testverktyget och det installerade APK’n på target plattformen men hittar hela tiden enorma begränsningar som sätter käppar i hjulen… Robotium har länge lovat att de skall implementera ett interface mot Cucumber men inget verkar hända och i dag är det bara en utökad instrumentation…
Av en slump ramlade jag på Ruboto projektet i kväll och inom mycket kort tid hade jag byggt och installerat min första APK med JRuby! Eureka!!!
Det går inte snabbt att starta applikationen men när den väl snurrar så verkar det inte vara några större förluster på overhead mer än de vanliga förlusterna man får med Ruby och dess varianter.
En simpel aktivitet kan se ut så här:
require 'ruboto/activity' require 'ruboto/widget' require 'ruboto/util/toast' ruboto_import_widgets :Button, :LinearLayout, :TextView $activity.start_ruboto_activity "$sample_activity" do setTitle 'This is the Title' def on_create(bundle) self.content_view = linear_layout(:orientation => :vertical) do @text_view = text_view :text => 'Can we run JRuby on Android?', :id => 42 button :text => 'Press me', :width => :wrap_content, :id => 43, : on_click_listener => @handle_click end end @handle_click = proc do |view| @text_view.text = 'Yes we can!!' toast 'This is all ruby and the next step is RSpec/cucumber-jvm' end end
Det finns till och med en inbyggd generator för ett exempelprojekt, som ovan kodsnutt är baserad på, och det kan inte bli enklare att komma igång.
ruboto gen app --package org.ruboto.example.quick_start --target android-7 cd quick_start rake adb install -r bin/QuickStart-debug.apk
Nu har du både genererat ditt exempel, byggt och installerat dn APK på telefonen eller emulatorn.
Vill du bara göra en ändring i din ruby kod så behöver du inte bygga om hela skiten utan man bara uppdaterar skripten och startar om applikationen.
rake update_scripts:restart
Ruboto kräver ant, Ruby, Rake, jdk och Android SDK för att kunna köra. Svårare än så är det inte!
Java källkoden och JRuby JAR packas in i din APK och sen kan du köra dina Ruby (*.rb) skript mot de Android API’er som du nu får tillgång till!
Så nu skall jag försöka skriva step definitions med cucumber-jvm och se om jag kan skriva hjälpklasser för lite olika Android klasser och se om jag kan driva hela rasket som vanligt med Given, When, Then paradigmen (Gherkin) och luta mig tillbaka och le!
Det är med andra ord en hel del jobb kvar men nu ser jag i alla fall målet! (och det är oftast då man kliver snett och bryter foten men det blir en annan historia :P)
Jag har jobbat med mjukvaruutveckling nu i över 20 år och något jag brinner för är test, testbarhet och testmetodik. Något som fortfarande är ett enormt problem är den bristfälliga synen på testbarhet hos den extrema majoriteten av dagens utvecklare och de ser helt enkelt inte den större bilden. När jag startar ett nytt projekt så SKALL testbarhet ALLTID tas i beaktning och innan de vet hur en funktion eller en klass skall kunna testas genom automatik så får de helt enkelt inte börja skriva kod. Prototypa får de mer än gärna göra men prototyper slänger man när man är klar om man jobbar enligt process och metodik. 😉
Jag skall förhoppningsvis börja med att skriva en Ruby hjälpklass för Canvas klassen i Android ICS och se om jag kan köra integrationstester med hjälp av Cucumber eller RSpec i syfte till att köra performance tester på olika plattformar och konfigurationer.
Spännande!
Recent Comments