Bakgrund

För att säkerställa att den kod vi producerar i våra projekt håller hög kvalité, använder vi oss utav ett gäng olika tjänster och rutiner. En av dessa är såklart automatiska tester av den kod vi skriver. En utvecklare som jobbar med en feature/bugg/whatever ska hela tiden hålla koll på att de tester vi har funkar (genom att köra phpunit lokalt).

Dock är det inte alltid som den lokala miljön är exakt som produktionsmiljön, eller att man någon gång råkar missa att köra testerna innan man deployar något. Därför använder vi också en extern tjänst som heter Codeship, som fixar detta åt oss.

Varje gång vi pushar kod till en branch (vilken som helst), kommer Codeship att skapa en virtuell server, installera hela systemet och köra alla våra unittester - automatiskt! Om våra tester misslyckas får vi en trevlig notifikation om detta (t.ex. via Slack).

För att detta ska fungera med ett Laravelprojekt (eller egentligen vilket PHP-projekt som helst) behövs det dock lite setup.

Denna guide förutsätter att vi använder en .sql-fil som grunddata varje gång testerna körs (för att på ett enkelt sätt t.ex. få in rätt roller etc i systemet), men detta är helt valbart och kan enkelt exkluderas (till att bygga upp databasen från början med Laravels migrations+seedning).

Konfigurera ditt Laravelprojekt:

Jag rekommenderar att du skapar en ny branch för detta, t.ex: git checkout -b feature/codeship.

Skapa .env-fil

Skapa nu en fil som heter .env.codeship i roten av ditt projekt som innehåller:

APP_ENV=testingAPP_DEBUG=falseAPP_KEY={en_riktig_app_key_här}APP_URL=http://example.loc/CACHE_DRIVER=fileSESSION_DRIVER=fileQUEUE_DRIVER=syncMAIL_PRETEND=trueMAIL_DRIVER=log

APP_KEY ska såklart sättas till en godkänd key (t.ex. genererad med Laravels php artisan key:generate)

Skapa .sql-fil med grunddata.

Exportera din testdatabas till en .sql fil så den ligger som storage/app/testing/testing_database.sql (den kan såklart heta vad som helst, men om du ändrar namnet glöm inte att ändra överallt där detta finns refererat i denna guide) i ditt projekt.

Glöm inte att lägga till denna fil till git, du måste antagligen "force push":a denna fil med git add -f storage/app/testing/testing_database.sql för att den ska komma med då mappen /storage som default är git ignored (genom en lokal .gitignore i storage-mappen) i Laravel.

OBS! Om du inte använder en grunddatabas som vi gör i detta exmepel att köra testerna mot, se till så att dina migrations och eventuella seedfiler är fullt fungerande.

Skapa konto & projekt hos Codeship

Gå till http://www.codeship.com/ och skapa ett gratis konto. Skapa sedan ett nytt projekt.

Konfigurera "Setup Commands"

Efter att du skapat ett projekt kommer du en sida där du kan konfigurera ditt projekt (Configure Your Tests). I dropdownen för Select your technology to prepopulate basic commands, välj I want to create my own custom commands (den bör vara förvald)

i fältet för Setup commands, fyll i:

# Sätt php-version genom phpenv. 5.3, 5.4, 5.5, 5.6, 7.0, 7.1 finns att välja mellanphpenv local 7.0# Ta bort xdebugrm -f /home/rof/.phpenv/versions/$(phpenv version-name)/etc/conf.d/xdebug.ini# Skapa och ta in testdatabas (valbart)mysql -e 'create database '"$DB_DATABASE"';'mysql $DB_DATABASE < storage/app/testing/testing_database.sql# Kopiera .envcp -f .env.codeship .env# Öka memory limit till 512 MBsed -i 's/memory_limit = .*/memory_limit = '512M'/' /home/rof/.phpenv/versions/$(phpenv version-name)/etc/php.ini# Kör Composer med Github tokencomposer config -g github-oauth.github.com $GITHUB_ACCESS_TOKENcomposer install --prefer-dist --no-interaction# Migreraphp artisan migrate --env="testing"# Seeda (valbart)#php artisan db:seed

Detta är de kommandon som ska "sätta upp ditt projekt innan testning". Det vi gör här är helt enkelt att vi:

  • Anger den PHP-version vi vill köra testerna mot
  • Tar bort xdebug (för att göra testerna snabbare)
  • Skapar en ny databas och fyller den med innehållet från vår .sql-fil
  • Kopierar vår .env.codeship till .env så att Laravel använder den
  • Installerar composer dependencies (vi anger att vi föredrar "prefer-dist" för att det ska gå snabbare, men därför måste vi ha angett en Github Access Token för att undvika rate limiting)
  • Migrerar databasen
  • Om man även vill seeda databasen så tar man bort kommentarer längst ned.

Ange "Test commands"

Under Test commands anger man sedan hur man vill testa sitt projekt, fyll där i:

phpunit

Klicka Save and go to dashboard för att spara ändringarna.

Ange miljövariabler

Då vi vill använda composers "prefer-dist" parameter när vi installerar projektets dependencies måste vi skapa en Github access token för att undvika Githubs rate limiting. Gå till https://github.com/settings/tokens/new och skapa en ny token, t.ex. med namnet Codeship composer.

Kopiera den skapade access_token (nedan kallad access_token) till datorns urklipp för att kunna klistra in den som en miljövariabel (se nedan).

Klicka på Project settings uppe till höger och i dropdownen väljer du Environment Variables) och fyll i dessa variabler:

  • DB_USERNAME => $MYSQL_USER
  • DB_PASSWORD => $MYSQL_PASSWORD
  • DB_DATABASE => test_databas
  • COMPOSER_HOME => ${HOME}/cache/composer
  • GITHUB_ACCESS_TOKEN => access_token

OBS! Databasnamnet kan du såklart byta ut till vad du vill, men det får INTE innehålla bindestreck (-) (däremot går understreck (_) bra).

Spara och kör!

Spara sedan projektet i Codeship, pusha en kodändring och se hur det automatiskt börjar köras tester! Du kommer även se om du använder Github på dina Pull Requests om koden du pushat klarar testerna eller inte automatiskt.