Guard - projektjeink testőre

Nem olyan régen ismerkedtem meg a guard nevű gemmel, ami egy nagyon hasznos kis szerszám annak, aki Rails fejlesztésre adja a fejét, de plug-injei révén például PHP fejlesztők is profitálhatnak a tudásából.

Ez a kis cucc arra képes, hogy figyelje a projekt fájljait változások után kutatva, és amikor változik valami, pl. elmentünk egy fájlt, akkor végre tud hajtani bizonyos műveleteket.

Vegyünk két nagyon alap kis példát:

Van egy PHP projektünk, melyben PHPunit teszteket szeretnénk futtatni. Minden egyes osztályunkhoz tartozik, egy hasonló nevű teszt osztály, csak Test van a végén. Tehát a User -t a UserTest, a Car-t a CarTest osztály teszteli. Ekkor:

Guard konfiguráció PHPUnit-hoz Több infó
1
2
3
4
5
6
7
guard 'phpunit', :tests_path => 'Tests', :cli => '--colors' do
  # Figyeljük az összes teszt osztály változását
  watch(%r{^.+Test\.php$})

  # Figyeljük az osztályok változását, és futtatjuk a megfelelő teszteket
  watch(%r{^Classes/(.+)\.php}) { |m| "Tests/#{m[1]}Test.php" }
end

Nem kell aggódni, ha a második esetnél az adott teszt osztály nem létezik, akkor egyszerűen nem történik semmi.

A Guard-hoz rengeteg féle plug-in létezik már, de legrosszabb esetben lehetséges shell parancsokat is futtatni fájlváltozáskor.

Amire érdemes odafigyelni, az a függőségek. A Guard-nak egyrészt szüksége van a platformunknak megfelelő fájlváltozás-érzékelő plug-inre, illetve mivel képes minden platformon a platformnak megfelelően értesítést is küldeni, így ezeket a plug-injeit is megfelelően konfigurálni kell.

Néhány dolog, amire figyelni kell:

  • Mac OS X 10.8-nél korábbi verziólnál szükséges a Growl telepítése (10.8-hoz van plug-in a beépített értesítési rendszer használatára)
  • Windows alatt a win32console gem nélkül nincsenek színek

Emiatt én mindig Gemfile segítségével telepítem. Egy alap Gemfile álljon itt ehhez:

Gemfile Guard használatához
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
group :development do
  # Guard
  gem 'guard', '~> 1.4.0'
  if RUBY_PLATFORM =~ /darwin/i
    if %x{sw_vers -productVersion}.strip =~ /^10\.8/
      gem 'terminal-notifier-guard'
    else
      gem 'ruby_gntp'
    end
    gem 'rb-fsevent', '~> 0.9.1', :require => false
  elsif RUBY_PLATFORM =~ /linux/i
    gem 'rb-inotify', :require => false
  elsif RUBY_PLATFORM =~ /(mswin|mingw)/i
    gem 'win32console', :require => false
    gem 'wdm', :require => false
  end

  # Guard plug-ins
  gem 'guard-phpunit'
end

A függőségek telepítése a bundle install míg a Guard futtatása a bundle exec guard start paranccsal zajlik.

A Guard fájlt használatba vétel előtt inicializálni is kell, ezt a bundle exec guard init paranccsal tehetjük meg. Ha menet közben telepítünk olyan plug-int, mely futtatásra alkalmas (tehát nem értesítő plug-in), akkor azt a bundle exec guard init PLUGIN_NAME paranccsal tehetjük meg, a plug-in neve pedig mindig a guard- után álló rész (pl. shell). Egyébként a legtöbb plug-in README fájlja nagyon részletes útmutatót tartalmaz a plug-in használatáról.

Comments