Caching-Fehler während eines Testlaufs diagnostizieren 0

Posted by fwoeck
on Tuesday, April 14

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
         ...