<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" ><channel><title>Christoph Bünte&nbsp;&raquo; Software Entwicklung Berlin</title> <atom:link href="http://www.christophbuente.de/tag/testing/feed/" rel="self" type="application/rss+xml" /><link>http://www.christophbuente.de</link> <description>Software Entwicklung</description> <lastBuildDate>Tue, 03 Aug 2010 15:37:30 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.0.1</generator> <item><title>Remarkable &#8211; Rails Anwendungen automatisch testen</title><link>http://www.christophbuente.de/2009-05-16-remarkable-rails-anwendungen-automatisch-testen/</link> <comments>http://www.christophbuente.de/2009-05-16-remarkable-rails-anwendungen-automatisch-testen/#comments</comments> <pubDate>Sat, 16 May 2009 10:14:17 +0000</pubDate> <dc:creator>Christoph Bünte</dc:creator> <category><![CDATA[Testing]]></category> <category><![CDATA[cucumber]]></category> <category><![CDATA[functional test]]></category> <category><![CDATA[integration test]]></category> <category><![CDATA[model validation]]></category> <category><![CDATA[rails]]></category> <category><![CDATA[remarkable]]></category> <category><![CDATA[rspec]]></category> <category><![CDATA[Ruby on Rails]]></category> <category><![CDATA[testspec]]></category> <category><![CDATA[unit test]]></category> <category><![CDATA[validation test]]></category><guid isPermaLink="false">http://www.christophbuente.de/?p=251</guid> <description><![CDATA[Seit über einem Jahr entwickle ich Webanwendungen mit Ruby on Rails. Und seit dieser Zeit schreibe ich Tests für meine Anwendungen. Angefangen von Test::Unit über test/spec bis zu RSpec. Doch selten gingen mir Tests leicht von der Hand. Ständig stelle ich mir die Frage: Wie viel teste ich? Habe ich genug getestet? Teste ich schon [...]]]></description> <content:encoded><![CDATA[<p><br /> Seit über einem Jahr entwickle ich Webanwendungen mit Ruby on Rails. Und seit dieser Zeit schreibe ich Tests für meine Anwendungen. Angefangen von <a href="http://api.rubyonrails.org/classes/Test/Unit/Assertions.html">Test::Unit</a> über <a href="http://test-spec.rubyforge.org/test-spec/">test/spec</a> bis zu <a href="http://rspec.info/">RSpec</a>. Doch selten gingen mir Tests leicht von der Hand. Ständig stelle ich mir die Frage: Wie viel teste ich? Habe ich genug getestet? Teste ich schon Rails Code?</p><p>Die verschiedenen Test Frameworks haben ihre Vor- und Nachteile. Test::Unit ist relativ einfach und schnell. test/spec und RSpec hingegen deutlich lesbarer, jedoch auch langsamer. Sie eigenen sich deshalb besser, um die Tests als Dokumentation zu verwenden. Test::Unit und test/spec verwenden für Viewtests den Umweg über die Controller, was sie im Vergleich zu RSpec deutlich langsamer macht. In Rspec testet man jede Schicht des <acronym title="Model View Controller">MVC</acronym> Musters separat. Das Verhalten der jeweils anderen Schichten wird mit Mocks und Stubs simuliert. Integration Tests mit Cucumber testen dann das Zusammenspiel aller Schichten.</p><p><a href="http://github.com/carlosbrando">Carlos Dandos</a> und <a href="http://github.com/josevalim">José Valims</a> <a href="http://github.com/carlosbrando/remarkable/tree/master">Remarkable</a> ist das mit Abstand großartigste Plugin für <a href="http://rubyonrails.org/">Ruby on Rails</a>, was mir seit langem über den Weg gelaufen ist, denn es reduziert Tests auf das nötigste! Man schreibt in unglaublich expressiver Form, was das erwartete Verhalten ist. Das auf RSpec basierende Remarkable testet mit einer Vielzahl von Custom Matchers die Erwartung ab.</p><p><span id="more-251"></span></p><p>Ein Beispiel für ein Model Validation Test in Test::Unit</p><pre escaped="true" lang="ruby" line="1">class UserTest &lt; Test::Unit
  def test_user_not_valid_if_name_is_blank
    user = User.create
    assert user.invalid?
    assert_equal :blank, :user.errors[:name]
  end
end</pre><p>Ein Beispiel für ein Model Validation Test in test/spec</p><pre escaped="true" lang="ruby">context 'User validations' do
  specify 'user should not be valid if name is blank' do
    user = User.create
    user.should.not.be.valid
    user.errors[:name].should == :name
  end
end</pre><p>Ein Beispiel für ein Model Validation Test in RSpec</p><pre escaped="true" lang="ruby">describe User do
  it 'should not be valid if name is blank' do
    user = User.create
    user.should_not_be_valid
    user.errors[:name].should == :blank
  end
end</pre><p>Und jetzt der gleiche Test mit Remarkable:</p><pre escaped="true" lang="ruby">describe User do
  it { should validate_presence_of(:name) } # RSpec syntax
  should_validate_presence_of :name # Remarkable macro syntax
end</pre><p>Ok, was musst du tun, um Remarkable verwenden zu können? Falls noch nicht geschen, solltest du das Gem Verzeichnis von <a href="http://gems.github.com">Github</a> als Quelle für weitere Gems lokal registrieren:</p><pre lang="bash">sudo gem sources -a http://gems.github.com</pre><p>Danach müssen die benötigten Gems installiert werden:</p><pre lang="bash">sudo gem install rspec -v 1.2.6
sudo gem install rspec-rails -v 1.2.6
sudo gem install remarkable_rails</pre><p>Für alle, die noch eine Rails Version &lt; 2.2 verwenden müssen zusätzlich den <a href="http://github.com/svenfuchs/i18n/tree/master">I18n Backport von Sven Fuchs</a> installieren:</p><pre lang="bash">sudo gem install svenfuchs-i18n</pre><p>Abschließend müssen im Rootverzeichnis des entsprechenden Rails Projektes noch einige helper scripte generiert werden:</p><pre lang="bash">ruby script/generate rspec</pre><p>Welche Matcher bringt Remarkable mit?</p><ul><li>Matcher für <em>alle</em> Validierungen mit <em>allen</em> Optionen</li><li>Matcher für <em>alle</em> Assoziationen mit <em>fast allen</em> Optionen</li><li>Named Scopes und Massenzuweisungsmatchern</li><li>Datenbank Matcher für Indexes usw.</li></ul><p>Ein typischer Unit Test mit Remarkable könnte so aussehen:</p><pre escaped="true" lang="ruby">require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')

describe User, 'validations' do
  should_validate_presence_of   :username, :email, :password
  should_validate_length_of     :username, :minimum =&gt; 6
  should_validate_acceptance_of :agreement
end

describe User, 'associations' do
  should_have_many :images
  should_have_many :posts
  should_have_one  :profile
end

describe User, 'database' do
  should_have_column :activated, :type =&gt; :boolean
  should_have_index  :username
end

describe User, 'named scopes' do
  should_have_scope :with_image, :joins =&gt; :images
  should_have_scope :activated,  :conditions =&gt; { :activated =&gt; true }
end</pre><p>Und von nun an möchte ich nicht mehr hören, dass testen zu schwer sei. Alles Ausreden!</p><p>In diesem Sinne, Test frei.</p><div id="crp_related"><h3>Ähnliche Beiträge:</h3><ul><li><a href="http://www.christophbuente.de/2007-11-24-advancing-rails-ein-workshop-mit-david-a-black/" rel="bookmark" class="crp_title">Advancing Rails &#8211; Ein Workshop mit David A. Black</a></li><li><a href="http://www.christophbuente.de/2007-11-25-ruby-on-rails-auf-mac-os-x-5-minuten-kurzanleitung/" rel="bookmark" class="crp_title">Ruby on Rails auf Mac OS X &#8211; 5 Minuten Kurzanleitung</a></li><li><a href="http://www.christophbuente.de/2007-11-17-canoo-webtest-web-anwendungen-automatisch-testen/" rel="bookmark" class="crp_title">canoo webtest &#8211; Web-Anwendungen automatisch testen</a></li><li><a href="http://www.christophbuente.de/2007-10-05-frei-nehmen-um-zu-lernen/" rel="bookmark" class="crp_title">Rails tutorial &#8211;  Eine Woche lang Agile Webentwicklung</a></li><li><a href="http://www.christophbuente.de/2007-06-19-performance-tests/" rel="bookmark" class="crp_title">Performance Tests</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://www.christophbuente.de/2009-05-16-remarkable-rails-anwendungen-automatisch-testen/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Stripes Framework &#8211; Tests für ActionBeans im Wizard Modus</title><link>http://www.christophbuente.de/2008-01-24-stripes-framework-tests-fur-actionbeans-im-wizard-modus/</link> <comments>http://www.christophbuente.de/2008-01-24-stripes-framework-tests-fur-actionbeans-im-wizard-modus/#comments</comments> <pubDate>Thu, 24 Jan 2008 22:44:17 +0000</pubDate> <dc:creator>Christoph Bünte</dc:creator> <category><![CDATA[Java JEE]]></category> <category><![CDATA[Web Entwicklung]]></category> <category><![CDATA[actionBean]]></category> <category><![CDATA[anleitung]]></category> <category><![CDATA[howto]]></category> <category><![CDATA[Java]]></category> <category><![CDATA[JEE]]></category> <category><![CDATA[junit]]></category> <category><![CDATA[mock]]></category> <category><![CDATA[MockRoundTrip]]></category> <category><![CDATA[MockServletContext]]></category> <category><![CDATA[stripes]]></category> <category><![CDATA[stripes framework]]></category> <category><![CDATA[Testing]]></category> <category><![CDATA[tests]]></category> <category><![CDATA[Tutorial]]></category> <category><![CDATA[unit tests]]></category> <category><![CDATA[wizard mode]]></category> <category><![CDATA[wizard modus]]></category> <category><![CDATA[__fp]]></category><guid isPermaLink="false">http://www.christophbuente.de/2008-01-24-stripes-framework-tests-fur-actionbeans-im-wizard-modus/</guid> <description><![CDATA[Bei meinem aktuellen Kunden wurde das Stripes Framework verwendet, um eine Java basierte Webanwendung zu erstellen. Für mehrseitige Formulare bietet Stripes ActionBeans mit einen Wizard Modus an. Dieser zeichnet sich dadurch aus, dass alle bereits ausgefüllten Formularfelder als versteckte Felder in alle folgenden Formulare eingefügt werden. Dieser Modus erspart bei mehrseitigen Formularen viel Arbeit, aber [...]]]></description> <content:encoded><![CDATA[<p>Bei meinem aktuellen Kunden wurde das <a href="http://www.stripesframework.org/">Stripes Framework</a> verwendet, um eine Java basierte Webanwendung zu erstellen. Für mehrseitige Formulare bietet Stripes ActionBeans mit einen <a href="http://www.stripesframework.org/display/stripes/Wizard+Forms">Wizard Modus</a> an. Dieser zeichnet sich dadurch aus, dass alle bereits ausgefüllten Formularfelder als versteckte Felder in alle folgenden Formulare eingefügt werden. Dieser Modus erspart bei mehrseitigen Formularen viel Arbeit, aber wie lässt sich dieser Wizard Modus am besten Testen? In diesem Artikel wird beschrieben, wie man mit Hilfe dem Stripes eigenen MockServletContexts sinnvolle Unit tests schreiben kann.</p><p><span id="more-31"></span></p><p>Die Dokumentation für <a href="http://www.stripesframework.org/display/stripes/Unit+Testing#UnitTesting-Approach2%3AMockContainerUsage">Stripes Unit tests</a> beschreibt sehr ausführlich, wie man mit Hilfe des MockServletContext eine Testinfrastruktur aufbaut, die es ermöglicht die ActionBeans ausserhalb des <acronym title="Java Enterprise Edition" lang="en">JEE</acronym>-Containers zu testen. Dies funktioniert für klassische ActionBeans ganz wunderbar. Doch beim schreiben von Tests für ActionBeans im Wizard Mode fiel auf, dass die Simulation eines Submits nicht funktionierte. Im Wizard Modus erzeugt das <a href="http://stripes.sourceforge.net/docs/current/javadoc/net/sourceforge/stripes/tag/FormTag.html">Stripes FormTag</a> ein zusätzliches verstecktes Formularfeld mit dem Namen &#8220;__fp&#8221;, welches alle Feldnamen des aktuellen Formulars in verschlüsselter Form enthält. Ohne dieses Feld verweigert der Stripes Dispatcher die Arbeit! Nimmt man nun einen beliebigen Wert und legt ihn in diesem Feld ab, so erzeugt das ebenfalls einen Fehler:<small>(Der Rechtschreibfehler ist tatsächlich aus dem Framework.)</small></p><p><code>Stripes attmpted and failed to decrypt the non-null value in the 'fields present' field.</code></p><p>Auch ist es nicht sinnvoll, einen beliebigen Text mit Hilfe des <code>CryptoUtil</code> zu verschlüsseln. Der Submit kann dann zwar erfolgreich simuliert werden, jedoch werden sämtliche Validierungsregel ignoriert. Mit folgenden Zeilen Code, kann ein korrekter Wert für das &#8220;__fp&#8221; Feld erzeugt werden:</p><pre lang="java">// Alle Feldnamen des aktuellen Formulars in eine Liste aufnehmen
   List fields = new ArrayList();
   fields.add("username");
   fields.add("password");
// Alle Feldnamen mit Trennzeichen zusammenfassen
   String hiddenFieldValue = HtmlUtil.combineValues(fields);
// servlet engine configurieren
   MockServletContext ctx = TestFixture.getServletContext();
   MockRoundtrip trip = new MockRoundtrip(this.ctx, YourCustomActionBean.class);
   HttpServletRequest request = (HttpServletRequest) trip.getRequest();
   hiddenFieldValue = CryptoUtil.encrypt(hiddenFieldValue, request);
   trip.setParameter(StripesConstants.URL_KEY_FIELDS_PRESENT, hiddenFieldValue);</pre><p>Für das Testen der Feldvalidierung ist es wichtig, dass die Feldnamen mit dem Wert des <code>&lt;input name="" /&gt;</code> Name Attributes in dem jeweiligen Formular übereinstimmen. Denn es werden tatsächlich nur die Felder validiert, die aus dem decodiertem Inhalt des &#8220;__fp&#8221; Feldes ausgelesen werden können.</p><p>Angenommen der oben abgebildete Code wird in der <code>setup()</code> Methode eines Unit Tests ausgeführt und speichert das <code>MockRoundtrip</code> Object in einem privaten Member, könnte ein Beispieltest könnte dann so aussehen:</p><pre lang="java">@Test
public void testLogin() throws Exception {
	trip.setParameter("username", "christophbuente");
	trip.setParameter("password", "secret");
	trip.execute("login");
	YourCustomActionBean bean = trip.getActionBean(YourCustomActionBean.class);
	Assert.assertTrue("Destination", "/account", trip.getDestination());
}</pre><p>Ich hoffe, dass diese Informationen ausreichen, um sinnvolle Unit Tests für ActionBeans im Wizard Modus zu schreiben. Bei Fragen helfe ich gerne weiter. Und wie immer sind Kommentare sehr willkommen.</p><div id="crp_related"><h3>Ähnliche Beiträge:</h3><ul><li><a href="http://www.christophbuente.de/2007-10-23-bots-aussperren-mit-captcha/" rel="bookmark" class="crp_title">captcha tutorial &#8211; Bots aussperren</a></li><li><a href="http://www.christophbuente.de/2007-11-17-canoo-webtest-web-anwendungen-automatisch-testen/" rel="bookmark" class="crp_title">canoo webtest &#8211; Web-Anwendungen automatisch testen</a></li><li><a href="http://www.christophbuente.de/2009-05-16-remarkable-rails-anwendungen-automatisch-testen/" rel="bookmark" class="crp_title">Remarkable &#8211; Rails Anwendungen automatisch testen</a></li><li><a href="http://www.christophbuente.de/2007-11-24-advancing-rails-ein-workshop-mit-david-a-black/" rel="bookmark" class="crp_title">Advancing Rails &#8211; Ein Workshop mit David A. Black</a></li><li><a href="http://www.christophbuente.de/2007-08-05-objekte-und-beziehungen/" rel="bookmark" class="crp_title">Objekte und Beziehungen</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://www.christophbuente.de/2008-01-24-stripes-framework-tests-fur-actionbeans-im-wizard-modus/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Advancing Rails &#8211; Ein Workshop mit David A. Black</title><link>http://www.christophbuente.de/2007-11-24-advancing-rails-ein-workshop-mit-david-a-black/</link> <comments>http://www.christophbuente.de/2007-11-24-advancing-rails-ein-workshop-mit-david-a-black/#comments</comments> <pubDate>Sat, 24 Nov 2007 07:49:40 +0000</pubDate> <dc:creator>Christoph Bünte</dc:creator> <category><![CDATA[Ruby on Rails]]></category> <category><![CDATA[Software Entwicklung]]></category> <category><![CDATA[david black]]></category> <category><![CDATA[railsschulung]]></category> <category><![CDATA[selenium]]></category> <category><![CDATA[Testing]]></category> <category><![CDATA[Web Entwicklung]]></category><guid isPermaLink="false">http://www.christophbuente.de/2007-11-24-advancing-rails-ein-workshop-mit-david-a-black/</guid> <description><![CDATA[&#8220;Wer rastet, der rostet.&#8221; &#8211; So geht es auch Software-Entwicklern. Wer sich nicht ständig nach neuem umschaut und den imaginären Werkzeugkasten mit neuen Tools füllt, wird irgendwann selbst zum alten Eisen gehören. Deswegen habe ich schon vor einiger Zeit angefangen, Ruby on Rails in meine Repertoire aufzunehmen. Diese Woche habe ich in einem 4 Tage [...]]]></description> <content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/berlinchrizzle/2056227725/" title="IMG_5150-2 by chrizzle my nizzle, on Flickr"><img src="http://farm3.static.flickr.com/2350/2056227725_6a2bff9597_o.jpg" style="padding-right: 10px; height: 180px; float: left" alt="IMG_5150-2" /></a></p><p><i>&#8220;Wer rastet, der rostet.&#8221;</i> &#8211; So geht es auch Software-Entwicklern. Wer sich nicht ständig nach neuem umschaut und den imaginären Werkzeugkasten mit neuen Tools füllt, wird irgendwann selbst zum alten Eisen gehören. Deswegen habe ich schon vor einiger Zeit angefangen, Ruby on Rails in meine Repertoire aufzunehmen. Diese Woche habe ich in einem <a href="http://dablog.rubypal.com/2007/10/19/advancing-with-rails-training-in-berlin-nov-19-22">4 Tage Workshop</a> mein Wissen über Ruby und Rails weiter ausbauen können.</p><p><span id="more-21"></span></p><p>[ad#vert-banner]</p><p><a href="http://dablog.rubypal.com/">David A. Black</a>, Autor des Buches <a href="http://rubypal.org/ruby_for_rails">&#8220;Ruby for Rails&#8221;</a> ist für diesen Workshop aus New Jersey, USA angereist. Neben einem ganzen Tag für ActiveRecord und REST, wurden auch Themen wie &#8220;routing, testing, caching, deploy, plugins, rjs und javascript behandelt. Das Ganze war gespickt mit hunderten von ad hoc Beispielen, die David in seiner ganz eigenen Art in die Konsole oder den irb hackt.</p><p>Derartig tiefgreifende Kenntnis über eine bestimmte Thematik ist mir bisher noch nicht begegnet. Klar, arbeit man hier und da mit Leuten zusammen, die deutlich fitter sind als man selbst. Doch David &#8220;lebt&#8221; Ruby seit Jahren.</p><p>Um hier nicht nur meine Freude für Ruby und Rails zum Ausdruck zu bringen, sondern vielleicht auch ein nützliches Detail zu liefern, möchte ich das <a href="http://www.openqa.org/selenium/">Test Framework Selenium</a> erwähnen. Damit ist es möglich über die hoffentlich bereits geschriebenen Unit-, Functional- und Integrationtests hinaus, die Anwendung in einem echten Browser zu testen. Damit kann der Kunde sehr schnell sehen, was geht und was nicht. Und was noch viel wichtiger ist: wie es aussieht in verschiedenen Browsern aussieht.</p><p>Die Installation ist schnell und einfach. Im Hauptverzeichnis des Rails Projektes installiert wird das Plugin mit Hilfe des folgenden Kommandozeilen Befehls installiert:</p><pre lang="bash"> ruby script/plugin install selenium</pre><p>Anschließend generiert man eine Testdatei im Ordner <code>test/selenium</code> mit folgendem Befehl:</p><pre lang="bash"> ruby script/generate selenium login.rse</pre><p>Der generierte Testfall muss nun noch editiert werden, um die Applikation sinnvoll zu testen. Dabei können sämtliche Benutzerinteraktionen in lesbarer Form geskriptet werden. Die <a href="http://release.openqa.org/selenium-core/0.8.0/reference.html">Kommandoreferenz</a> findet man hier. Sollte die Anwendung bisher noch nicht im Testmodus verwendet worden sein, ist es nötig, die Testdatenbank auf den neuesten Stand zu bringen:</p><pre lang="bash"> rake db:migrate RAILS_ENV=test</pre><p>Damit die Tests auch durchführbar sind, muss der Server im Testmodus gestartet werden:</p><pre lang="bash"> ruby script/server -e test</pre><p>Ruft man jetzt die Rails Anwendung in einem beliebigen Browser auf (http://localhost:3000/selenium) sieht man das Admininterface von Selenium. Hier lässt sich einstellen, welche Tests laufen sollen. Darüber hinaus lassen sich noch die Geschwindigkeit und Highlighting variieren. Ein Klick auf den &#8220;Play-Button&#8221; im oberen rechten Fenster lässt die Show beginnen. Eine <a href="http://www.openqa.org/selenium-core/usage.html">ausführliche Anleitung</a> zur Benutzung des Interface findet man ebenfalls auf der selenium Webseite. Nach belieben können weitere Tests generiert werden und erscheinen dann automatisch im linken Fenster neben dem bereits erstellen login test.</p><p>Abschließend möchte ich <a href="http://www.railsschulung.de/" title="railsschulungen in Berlin">Benjamin und Mathias</a> danken, dass sie David nach Berlin gebracht haben. Es war spitze!</p><div id="crp_related"><h3>Ähnliche Beiträge:</h3><ul><li><a href="http://www.christophbuente.de/2007-11-27-kostenloses-ruby-on-rails-buch-nur-noch-4-tage/" rel="bookmark" class="crp_title">Kostenloses Ruby on Rails Buch &#8211;  Nur noch 4 Tage</a></li><li><a href="http://www.christophbuente.de/2009-05-16-remarkable-rails-anwendungen-automatisch-testen/" rel="bookmark" class="crp_title">Remarkable &#8211; Rails Anwendungen automatisch testen</a></li><li><a href="http://www.christophbuente.de/2007-11-25-ruby-on-rails-auf-mac-os-x-5-minuten-kurzanleitung/" rel="bookmark" class="crp_title">Ruby on Rails auf Mac OS X &#8211; 5 Minuten Kurzanleitung</a></li><li><a href="http://www.christophbuente.de/2007-12-31-2008/" rel="bookmark" class="crp_title">2008</a></li><li><a href="http://www.christophbuente.de/2007-10-05-frei-nehmen-um-zu-lernen/" rel="bookmark" class="crp_title">Rails tutorial &#8211;  Eine Woche lang Agile Webentwicklung</a></li></ul></div>]]></content:encoded> <wfw:commentRss>http://www.christophbuente.de/2007-11-24-advancing-rails-ein-workshop-mit-david-a-black/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using memcached
Page Caching using memcached
Database Caching 3/25 queries in 0.030 seconds using memcached
Object Caching 700/763 objects using memcached

Served from: www.christophbuente.de @ 2010-09-08 10:16:20 -->