Poster taggade med ‘scala’

Efter att du har läst Martins artikel om Scala och SBT så kanske du känner dig lite sugen att börja koda i Scala, men inte riktigt vet var du skall börja. Jonas Bonér var hos Cygni och talade för ett tag sedan och nämnde då att det kan vara en bra början att skriva sina testfall i Scala för att komma igång och lära sig språket. Scala erbjuder dessutom väldigt trevliga testramverk, som kan underlätta din vardag. Jag kommer förutsätta att du idag har ett mavenprojekt med javakod och eventuella befintliga tester i java.

Första steget är att lyfta in Scalas API, JUnit 4 (om du inte redan kör det) och ett testramverk. Jag tänkte använda ScalaTest. För att göra det så lägger vi till följande beroende i pom.xml

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>2.9.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8.1</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.scalatest</groupId>
    <artifactId>scalatest_2.9.1</artifactId>
    <version>1.6.1</version>
    <scope>test</scope>
</dependency>

Sedan behöver vi säga till Maven att också kompilera och köra testfall som ligger i biblioteket src/test/scala, så då lägger vi till tre plugins.

maven-scala-plugin ansvarar för att kompilera scalakoden till bytekod.

<plugin>
    <groupId>org.scala-tools</groupId>
    <artifactId>maven-scala-plugin</artifactId>
    <version>2.15.0</version>
    <executions>
        <execution>
            <goals>
                <goal>testCompile</goal>
            </goals>
            <configuration>
                <args>
                    <arg>-make:transitivenocp</arg>
                    <arg>-dependencyfile</arg>
                    <arg>${project.build.directory}/.scala_dependencies</arg>
                </args>
            </configuration>
        </execution>
    </executions>
</plugin>

maven-surefire-plugin är den som kör testerna – om du redan har tester i projektet så har du redan lagt till den här pluginen och behöver då bara utöka den att också inkludera filer som heter **/*Spec.*.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.6</version>
    <configuration>
        <useFile>false</useFile>
        <disableXmlReport>true</disableXmlReport>
        <includes>
            <include>**/*Spec.*</include>
            <!-- För att hantera existerande tester -->
            <include>**/*Test.*</include>
        </includes>
    </configuration>
</plugin>

build-helper-maven-plugin lägger till källkodsmappar till kompilering, eftersom Maven från början bara hanterar en källkodsmapp för implementationskod (src/main/java som standard) och en för test (src/test/java som standard).

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>generate-test-sources</id>
            <phase>generate-test-sources</phase>
            <goals>
                <goal>add-test-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>src/test/scala</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

Ok, nu behöver vi bara skapa mappen src/test/scala och sedan kan du börja koda!

Om du vill kan du stanna här. Nu kan du skriva testklasser i Scala, annotera metoderna med JUnits @Test och köra på som vanligt. Det du vinner är att du får tillgång till Scalas syntax och konstruktioner och att du kan lära dig i en bekant miljö.

Det andra alternativet är att du också börjar titta på vad Scalas testramverk kan erbjuda. I grunden är det inte så stor skillnad, men rent syntatiskt och kanske också tankemässigt så är det lite annorlunda. ScalaTest har stöd för BDD – Behaviour Driven Development. Tanken är att varje test är en beskrivning av en funktion/ett beteende som en roll skall uppfylla. Rollen tar sedan formen av en eller möjligtvis flera klasser. Tack vare att Scalas syntax går att det skriva ganska koncisa specifikationer, nästan som rena texttester för att beskriva beteendet som förväntas.

Vi börjar med att skriva en första specifikation, som vår applikation skall uppfylla.

@RunWith(classOf[JUnitRunner])
class MyApplicationSpec extends FlatSpec with MustMatchers {

  "My application" must "convert a string to hex values" in {
  }

}

Det här är ett komplett test, även om det inte gör något just nu – kroppen på specifikationen är tom. Om jag vill kan jag lämna det tomt och fylla på senare, eller så gör jag det lite tydligare att jag inte är klar med testet. Då skriver vi om det såhär

@RunWith(classOf[JUnitRunner])
class MyApplicationSpec extends FlatSpec with MustMatchers {

  "My application" must "convert a string to hex values" in (pending)

}

Väldigt tydligt och förklarande, eller hur? Ponera att jag skapar en klass som kan konvertera en sträng till hexadecimala värden (wow!). Då kan testkoden se ut som följande

@RunWith(classOf[JUnitRunner])
class MyApplicationSpec extends FlatSpec with MustMatchers {

  "My application" must "convert a string to hex values" in {
    val app = new MyApplication()
    app.convert("The donkey makes a left turn. I observe.") must equal ("54686520646f6e6b6579206d616b65732061206c656674207475726e2e2049206f6273657276652e")
  }

}

Klassen MyApplication är fortfarande skriven i Java, men jag testar den från Scala. Nyckelordet ”must” kommer från en trait i ScalaTest som heter MustMatchers. Det går också att använda ShouldMatchers, enda skillnaden är terminologin – must eller should, vilket du tycker om bäst.

Genom att fylla på med test av det här slaget så får du en ganska tydligt dokumentation vad du faktiskt förväntar dig av dina roller/klasser. Då slipper du en massa kommentarer i koden och/eller testmetoder som döpts ”testShouldConvertStringToHexValue” eller liknande. Enkelt och snyggt!

Vill du använda mockobjekt i din scalakod så kan du antingen köra på någon av de vanliga javabiblioteken (JMock, EasyMock, Mockito), eller så kan du prova Borachio som är skrivet i Scala.

Apache Camel är ett javabaserat integrationsramverk som innehåller en mängd komponenter. När man konfigurerar kan man använda Spring xml, annoteringar och en Java DSL. Allt är väl beskrivet på Camels hemsida. Eftersom Scala är utvecklat för att enkelt kunna integrera med Java och Javas ramverk är det inte konstigt att är väldigt enkelt att integrera Scala-komponenter i Camel. Det finns även en Scala DSL som kan användas för att konfigurera Camel-routar med. Jag har skrivit ett litet Scala-Camel projekt, WeirdTranslator för att visa på hur Scala i Camel kan fungera. WeirdTranslator är  en variant på viskleken, man tar en mening och översätter den mellan ett antal språk och avslutar med att översätta till ursprungsspråket. I detta fallet finns det två vägar att få in och ut text antingen via GTalk, XMPP, och direkt med en TCP socket.

Läs mer >>

Välkommen till Cygni.se!

  • Cygnis ambition är att vara Stockholms bästa arbetsgivare för en skicklig systemutvecklare eller arkitekt. För oss handlar det bland annat om att erbjuda en miljö som möjliggör för alla medarbetare att ständigt utvecklas i rätt riktning. Här kan du läsa om hur det är att jobba på Cygni.
    • Jobbannonser, här finns lediga positioner hos Stockholms bästa konsultarbetsgivare.
    • Möt några av våra konsulter.
  • Ett konsultbolag kan antingen nischa sig inom en viss bransch eller inom ett visst teknikområde. Cygni har valt det senare; oavsett bransch kan vi delta i utvecklingen av avancerade och verksamhetskritiska system. På Cygnis kundlista återfinns företag och organisationer inom ett flertal branscher såsom retail, media, finans, spel och telekom. De flesta av Cygnis kunder är ledande i sin bransch men vi jobbar även med mindre företag och organisationer.
  • Om oss – Historia, fakta, kontaktuppgifter och pressbilder
  • Under sektionen aktuellt hittar du de senaste nyheterna.

    • Pressmeddelanden – här hittar du senaste nytt om Cygni.
    • Stacktrace är vår gemensamma teknikblogg där vi skriver allt från korta tips till längre artiklar. Genom att följa Stacktrace kommer du att få en god bild av vad Cygni kan och gör.
    • Cygnibloggen kan du läsa om vad som hänt på Cygnis konsultmöten, senaste nytt från Cygnis kontor och reflektioner från ledningen.

På konsultmötet i torsdags fick vi se två spännande kodkator av Nathalie och Robert med fokus på dynamiska språk (samt lite Scala) – mycket intressant tycker jag! Robert forcerade igenom applikationen Sellable mha Ruby on Rails och Nathalie demade Python. Här har ni Roberts fina presentation om dynamiska språk.

Arbetet med den nya sajten cygni.se pågår för fullt och på måndag ska vi träffa vår grafiker som även designade allastudier.se som Cygni utvecklade tillsammans med Metro. Det ska bli mycket spännande att se vad han har för tankar och idéer.

Ibland kan det vara skönt att inte uppfinna hjulet en gång till, att låta någon annan göra jobbet och ägna sin tid åt viktigare saker. Ibland kan det vara skönt att gå till plugins.jquery.com och inse att det du vill göra i jQuery redan är gjort och det, handen på hjärtat, många gånger bättre än vad du själv hade lyckats med. Att använda ett jQuery-plugin kan spara dig mycket tid och arbete då alla jQuery-funktioner du skulle behöva leta upp och använda redan är samlade och ihop-pusslade.

Utifrån ett webbprojekt signerat Cygni, listar jag i den här artikeln fem jQuery-plugins som vi valt att använda oss av.  Jag ger en introduktion till pluginet, beskriver lite kort hur det fungerar och ger sedan exempel på var och hur det används i det projekt vi här kan kalla SiteDoe.

Läs mer >>

Cygni är ett IT-konsultbolag med drygt 40 anställda som grundades 2006. Vi erbjuder expertis inom agil systemutveckling på moderna plattformar. Den genomsnittlige Cygnikonsulten är 35 år, civilingenjör i datateknik och har 12 års professionell erfarenhet av systemutveckling. Men den främsta styrkan sitter varken i erfarenhet eller utbildning. Den sitter i engagemanget att ständigt vilja utvecklas och bli en bättre konsult.

Med en stadig förankring i vår systemutvecklingsexpertis kan Cygni utföra konsultuppdrag i alla branscher i behov av avancerat systemstöd. Cygnis kunder finns idag främst inom finans, media, retail, telekom och spel.

Det som utmärker Cygni är vår selektiva rekryteringsprocess. Vi sätter aldrig kvantitativa tillväxtmål eftersom de skulle kunna komma i konflikt med våra kvalitetsmål. Sedan starten 2006 har Stockholms främsta konsulter inom agil systemutveckling handplockats, bland annat genom branschens tuffaste tekniktester. Det har gett oss en stark företagsgemenskap, obefintlig personalomsättning, nöjda kunder och ett mycket välfungerande internt kompetensutbyte.

Cygnis kontor är centralt beläget på Sturegatan 34 i Stockholm med utsikt över Humlegården. De flesta uppdrag som Cygni utför är på plats hos våra kunder i Stockholmsområdet men kontoret fungerar som en naturlig samlingsplats för konsultmöten, afterwork och andra aktiviteter.

Karta till Cygnis kontor
Cygni
Sturegatan 34
114 36 Stockholm 

Tel: 08 459 93 30
E-post: info@cygni.se

Cygni sponsrar BRIS i deras arbete att stödja utsatta barn. Under 2012 är Cygni ett av BRIS guldföretag.

BRIS

Följ oss via LinkedIn, Twitter eller Facebook

Cygni på LinkedIn

Twitter

När man börjar utveckla i Scala dröjer det inte länge innan man behöver ett byggverktyg. Maven kommer med fullt javastöd  men för att kompilera Scala behövs maven-scala-pluginen. Det  gör att man börjar undra om det finns ett byggverktyg med fullt inbyggt stöd för Scala och det gör det, Simple Build Tool, eller SBT. På code.google.com finns SBT att ladda ner och bra engelsk dokumentation för installation och handhavande.

SBT liknar Maven väldigt mycket; samma konvention för hur filerna ska organiseras, de flesta av Mavens kommandon har direkta motsvarigheter i SBT. Så istället för mvn compile skriver man sbt compile.

SBT kan använda Mavens repositories, till och med Mavens pom.xml för beroendehantering. Det gör att det är väldigt enkelt att testa SBT i ett befintligt Maven-projekt.

Så vilka fördelar har SBT framför Maven, förutom att kompilera både scala- och javakod utan plugin-konfiguration?
Läs mer >>