Wir machen die Welle, wir sind die Welle.

Jetzt ist es schon ein paar Monate her, als Google mit „Google Wave“ eine neue Art der Kollaboration für Teams vorstellte. Eigentlich ist das ganze auch nicht viel neues, nur eben wie bei GoogleMail – einfach(?), andersneu, google. Seit Anfang Oktober verschickt nun Google in Schritten Einladungen an Interessierte (Googleaccount-Inhaber), und obwohl ich mich bereits vor Wochen in die Voranmeldung eintrug, hatte ich bis gestern keinen Erfolg. Ob nun durch Google oder durch eine freundliche Einladung seitens eines Bekannten, wie auch immer: Die Einladung trudelte schließlich heute früh morgen endlich ein.

Ersteindruck

Zunächst sticht natürlich das neue Design hervor; was man auch bereits aus den Videos kennt, könnte das Interface durchaus Potenzial auch für die anderen Anwendungen haben.

Da leider nur ein Kontakt (nämlich mein mutmaßlicher Werber) ebenfalls einen Wave-Account hat (man erhält übrigens eine zusätzliche, meines Erachtens derzeit überflüssige Adresse: deingoogleaccount at googlewave.com), war das Ausprobieren relativ unspektakulär. Wenig los, langweilig. Viele Features sind sicherlich auch nicht freigeschaltet, so gibt es im Moment funktional quasi nur den Echtzeitchat mit üblichen Formatierungen, allerdings mit Video und Bild. Spiele sind derzeit noch nicht zu sehen. (Update, siehe unten)

Feldtest? 🙂

Erst als YuccaTree zu einem Test einlud, konnte man sich einen ernsthafteren Eindruck machen: Bei über 40 anwesenden und geschätzten 10 aktiven Personen immerhin etwas.

Zusammengefasst lässt sich sagen:

  • Echtzeitchat ist auf jeden Fall „nice“ und interessant – ob er auch produktiv interessant ist, muss man sehen. Es funktioniert genauso wie im Video: Man sieht (Label mit Namen), wer gerade wo schreibt.. man kann nicht nur Texte (Formatierungen fett, kursiv, Hintergrundfarbe, Vordergrundfarbe, …), sondern auch GoogleMaps, Bilder und (Youtube)-Videos verlinkenintegrieren (werden in der Wave angezeigt und sind dort abspielbar).
  • Auf dem Safari4 (OSX 10.6) und einem technisch gesehen nicht ganz 3 Jahre alten MacbookPro (Intel, C2D) lief die Anwendung sehr schnell. Andere Nutzer mit Firefox bestätigten das, andere Nutzer wiederum klagten über eine langsame Anwendung (bemerkbar am verzögerten Tippen).
  • Synchronisationsprobleme: In der großen Wave hatte ich persönlich kaum Probleme; eine eigene Testwave musste ich jedoch ganze fünf Mal bearbeiten, um einen simplen Plaintext reinzuschieben.
  • Interface-Probleme: Vor allem Popups scheinen nicht fertig zu sein, manchmal fehlt Abbrechen/Schließen (Escape hilft aber immer, Pluspunkt hinsichtlich MCI)
  • Inhalte wie Videos landen bei mir nicht im Editor = kann ich nicht posten. Andere haben es aber erfolgreich geschafft.

Spontane Verbesserungensvorschläge

  • Besseren Feedback über den Lade- und Synchronisationszustand geben. Beim Laden hat man teilweise den Eindruck, als würde gar nichts passieren (nirgendswo ein Spinner zu sehen) – das geht besser.
  • Sehr wohl gibt es einen besonderen Status links oben (übrigens schon nettes Detail, diese Welle ist auch noch animiert).. aber dieser Zustand ist nur nach einem Speichern einer Wave für kurze (oder auch nicht) Zeit sichtbar.

Nachtrag (08.10.09, 14:25)

Doch, es gibt sie: Wave Extensions.

Code-Coverage, Eclipse, jUnit

eclemma-1

Joa, es ist wieder Zeit für einen Artikel in der Java/DA-Reihe.

Als erstes und sehr einfach zu testendes Kriterium gilt beim Testen die Code Coverage. Eigentlich sehr simpel, denn es quantifiziert nur die Code-Coverage, also von wie vielen Zeilen Code (Instructions) tatsächlich wie viele (bzw. welche) auch ausgeführt werden. Da man dies natürlich gerne automatisiert machen möchte, sind Tests wie mit jUnit ideal. Aber, auch normale Anwendungen sind mitzutracen und den Codecoverage ist zu ermitteln.

eclemma-2

Für Eclipse gibt es dazu ein prima Plugin namens EclEmma. Und auch schnell über die Update-URL im Manager installiert. EclEmma dient dabei als eine Art Wrapper für verschiedene Launchtypen – also beispielsweise als normale Applikation oder einen jUnit-Test bzw eine ganze Suite (Plugins). Das Ergebnis wird nach Beendigung des Programms/Tests innerhalb von Eclipse in einer Baumstruktur dargestellt; sehr schön ist auch die grafische Hervorhebung direkt im Sourcecode. Alternativ kann man sich das Ergebnis auch als HTML exportieren lassen.

TestSuites in Eclipse mit jUnit 4 (Nachtrag)

Das Problem: Wenn man in einem Projekt eine Reihe von Testcases gemacht hat, dann sind diese meist (natürlich) auf verschiedene Packages verteilt. Außerdem gibt es ja reine Komponententests als auch Usecasetests (soweit möglich), oder das Testen zweier oder mehrere Komponenten im Verbund. Schlussendlich also eine große Anzahl von „TestCase“-Klassen, die jeweils mehrere Tests haben. Ideal wäre also, wenn man diese ganzen Testcases zusammenpacken könnte.. und dann auch ausführen könnte.

jUnit bietet (in Eclipse) dafür die Option TestSuite an. Eine TestSuite ist ja auch genau das, was wir brauchen. Leider zeigt der Wizard keine unserer TestCases an.. warum? Nach einigem Recherchieren (viele Suchergebnisse zeigen indirekt noch auf jUNit 3.8) ist die Frage eigentlich simpel gelöst.. wenn man denn weiß, wie 😉

Als erstes müssen alle TestCase-Klassen (d.h. hier die Klasse MyTests, die @Test-Methoden enthält) eine neue Methode erhalten:

public static junit.framework.Test suite() {
return new JUnit4TestAdapter(MyTests.class);
}

Damit erkennt der Wizard für eine TestSuite nun auch jene Klassen.

Falls man es lieber manuell machen möchte (Beispiel): suite.addTest(MyTests.suite());f

Es ist übrigens kein Problem, TestSuites zu verschachteln – dafür einfach das Prozedere „wiederholen“ bzw. suite.addTest(MyOtherSuite.suite()) schreiben. Tipp: Es gibt die äußerst hilfreiche Methode suite.setName(string) – damit man sich in der jUnit-Baumansicht nicht verwirrt.

Nachtrag:

Wesentlich eleganter ist natürlich der Annotation-Weg. Die „SuperTestSuite“ braucht „nur“ so auszusehen:

@RunWith(Suite.class)
@SuiteClasses( { MySuite1.class, MySuite2.class, MySuite3.class })

public class AllTests {
}