In Projekten, die z.B. memcached als Cachingserver für SQL-Anfragen und Seitenfragmente einsetzen, kann das Cachemanagement selbst eine erhebliche Fehlerquelle sein.
Da sich die Inhalte des Cachingservers nicht ohne weiteres zwischen zwei Testabschnitten löschen lassen, ist es wohl am sichersten, den Server in jedem Scenario neu zu starten. Hierzu spricht man am besten eine separate Instanz auf einem eigenen Port an, z.B. 11213 anstelle 11212.
Cucumber
Ich benutze hier cucmber und Selenium als Testplattform. Um den Caching-Dienst für den Testlauf zu starten, trage ich ein entsprechendes Statement als Before-do-Schritt ein und anschließend einen kill-Befehl als After-Do-Schritt:
1 2 3 4 5 6 7 |
Before do system("memcached -l 127.0.0.1 -p 11213 -d") end After do system("killall memcached 2>/dev/null") end |
Ein eventuell regulär laufender memcached sollte unter einem anderen Useraccount laufen als der cucumber-Task, um zu vermeiden, dass er vom kill kurzerhand mitgetilgt wird.
Rails-Konfiguration
Damit der Server letztlich auch benutzt wird, muss er in der config/environments/test.rb aktiviert sein:
config.cache_store = :mem_cache_store, "localhost:11213"
Auch das Caching sollte aktiv sein – sonst ist es nicht das echte Leben:
config.cache_classes = true config.action_controller.perform_caching = true config.action_view.cache_template_loading = true
ein Testlauf
Jetzt kann man den Testlauf starten und währenddessen die aktive Cachingserverinstanz prüfen:
~ > memstat --servers=127.0.0.1:11213
Listing 1 Server
Server: 127.0.0.1 (11213)
pid: 13500
uptime: 4830
time: 1239700285
...