Hier, die Übersetzung des Artikels (teilweise etwas unbeholfen übersetzt aber hoffentlich dennoch verständlich):
Regression Testing
Manchmal verursachen neue Patches, die Bugs beheben und neue Funktionen bereitstellen, neue Probleme. Das nennt man eine Regression. Aber da das Problem normalerweise bis zum nächsten Release nicht bemerkt wird, kann es schwer werden, den Patch zu finden, der für das Problem verantwortlich ist, da in dieser Zeit möglicherweise hunderte Patches aufgenommen wurden. Hier kommt regression testing ins Spiel.
Mit regression testing können Problempatches gefunden werden. Dafür wird das Programm git und dessen bisect-Befehl verwendet. Ein vertiefender Artikel über git und Wine kann unter GitWine gefunden werden. Dieser Artikel befasst sich nur mit regression testing.
Einrichtung
Erstmal musst du sicherstellen, dass git auf deinem System installiert ist:
git --version
Git sollte in Version 1.4.1 oder neuer installiert sein. Wenn nicht, installiere git über die Paketverwaltung deiner Distribution. Um git beispielsweise auf Ubuntu zu installieren, benutze den folgenden Befehl:
sudo apt-get install git-core
Und, um viel Zeit zu sparen, installiere ccache über die Paketverwaltung. Unter Ubuntu:
sudo apt-get install ccache
Sobald git und ccache installiert sind, kannst du mit dem folgenden Befehl den Wine-Quellcode herunterladen:
git clone git://source.winehq.org/git/wine.git wine-git
cd wine-git
Das wird einige Minuten dauern, da etwa 90MB Daten heruntergeladen werden müssen. Wenn du eine Firewall nutzt, musst du möglicherweise git: durch http: ersetzen. Jetzt hast du eine Kopie des repositorys und das testen kann beginnen.
Bisect benutzen
Angenommen, du hast einen Bug, der nach einem Upgrade von Wine 0.9.36 auf Wine 0.9.37 aufgetreten ist. Die folgenden Befehle richten git ein, um den Bug zu finden:
git bisect start
git bisect good wine-0.9.36
git bisect bad wine-0.9.37
Manchmal kann es sein, dass du bereits weißt, in welcher Komponente der Fehler war, wenn, dann kannst du git dies mitteilen. Um git beispielsweise zu sagen, dass der Fehler in der wined3d dll liegt, dass sie in Wine 0.9.38 funktionierte und aktuell nicht funktioniert, benutze folgende Befehle:
git bisect start dlls/wined3d
git bisect good wine-0.9.38
git bisect bad
Jetzt wird git dir sagen, dass du jetzt X Änderungen zu testen hast. Keine Sorge, so viele Tests müssen nicht durchgeführt werden ☺. Git wird den Status des Quellcodes genau zwischen die beiden Versionen, die du testest, setzen. Wenn du zum Beispiel 100 Änderungen zu testen hast, wird es den Quellcode auf den Status der 50. Änderung setzen. Wir sind fast soweit, Wine zu kompilieren, erstmal müssen wir das ganze konfigurieren:
CC="ccache gcc" ./configure --verbose
Wenn du einen 64bit-Prozessor hast, musst du anders vorgehen, um Fehler zu vermeiden. Normalerweise reicht der folgende Befehl:
CC="ccache gcc -m32" ./configure --verbose
Oft, es sei denn du hast schon einmal Wine kompiliert, beendet configure mit Fehlern wegen fehlender Abhängigkeiten. Stelle sicher, dass alle Abhängigkeiten installiert sind uns kompiliere erneut. Dies musst du wiederholen, bis du keine Fehler mehr erhälst. Um benötigte Abhängigkeiten zu installieren, musst du auf Ubuntu/Debian dies ausführen:
sudo apt-get build-dep wine wine-dev
oder
sudo apt-get install git-core flex bison libstdc++6-dev libartsc0-dev libasound2-dev libaudio2 libaudiofile0 libc6-dev libesd-alsa0 libesd0-dev libgcc1 libgl1-mesa-glx libgl1-mesa-dev libglib2.0-0 libglu1-mesa-dev libgphoto2-2-dev libgphoto2-port0 libice6 liblcms1-dev libldap2-dev libsm6 libx11-6 libxau6 libxext6 libxml2-dev libxslt1.1 libxt6 libxxf86vm1 msttcorefonts build-essential
Dies wird alle Abhängigkeiten finden und sie automatisch installieren. Sobald du alle Abhängigkeiten hast, führe aus:
CC="ccache gcc" ./configure --verbose && make clean && make
Dies wird eine Weile dauern, je nach Geschwindigkeit deiner Hardware. Manche Computer brauchen nur 3 Minuten, manche können Stunden brauchen. Bei mir dauert das etwa 20 Minuten. Sobald Wine kompiliert ist, bist du fast fertig für das Testen. Zur Sicherheit brauchen wir ein sauberes .wine-Verzeichnis:
mv ~/.wine ~/.wine-backup
Das eigentliche Programm testen
Installiere das Programm:
./wine program_install.exe
und führe es aus:
./wine "C:\Program Files\Program Name\program.exe"
Überprüfe, ob dein Fehler immernoch auftritt. Wenn ja, dann weißt du, dass der Patch, der das Problem verursacht, irgendwo in der ersten Hälfte der Patches ist und nicht in der zweiten Hälfte. Um git dies mitzuteilen führe diesen Befehl aus:
git bisect bad
Wenn der Bug nicht auftrat, weißt du, dass der Fehler in der zweiten Hälfte der Patches seine Ursache hatte. Führe dafür dies aus:
git bisect good
das wird den Status des Quellcodes in die Mitte der übrigen Patches setzen. Nun musst du Wine neu kompilieren und erneut nach dem Bug suchen. Nach einigen Tests wird git letztendlich den fehlerhaften Patch erkennen. Dies sieht etwa folgendermaßen aus:
a460a2df43aa8eae10b1db028c6020829b009c54 is first bad commit
commit a460a2df43aa8eae10b1db028c6020829b009c54
Author: Stefan Doesinger <stefandoesinger@gmx.at>
Date: Sat Jun 9 14:27:41 2007 +0200
wined3d: Store the gl information in a per adapter structure and initialize it only once.
:040000 040000 d8ae35832fcdbca8de07acae73b9e21564ced413
1720cc38fb598110071c9ee4f21f8f61b6f764c3 M dlls
Achte darauf, dass es heißt:
a460a2df43aa8eae10b1db028c6020829b009c54 is first bad commit
Wenn du das siehst:
Bisecting: 0 revisions left to test after this
DANN BIST DU NOCH NICHT FERTIG!
Sobald der Patch identifiziert wurde, poste diese Information im Bugzilla in den entsprechenden Bugreport (wenn dort keiner ist, öffne einen). Vergewissere dich, dass du den Autoren das Patches der CC-Liste hinzufügt hast. Diese Informationen erlaubt es den Entwicklern, Probleme sehr viel schneller zu beheben.
Wenn du testest und alle bisects "good" sind (der Fehler tritt nicht auf) und eine Ausgabe erhälst, die "Release 0.9.xx" enthält, so wie dies:
b821e839bb33ac8f56939cc582010ecf4d9c25d4 is first bad commit
commit b821e839bb33ac8f56939cc582010ecf4d9c25d4
Author: Alexandre Julliard <julliard@winehq.org>
Date: Fri Mar 21 16:41:33 2008 +0100
Release 0.9.58.
:100644 100644 9123c03a3138b05cb8ebb5271f554bb76510cd09 3b88d88dcdfc8e148f8e7e0858bf0ca62c0bdff3 M ANNOUNCE
:100644 100644 900c8932cb5aad58e928a5c3192ab95967dc0664 e001d501bec609c31c5a91ab185a06ef1662f4c8 M ChangeLog
:100644 100644 5614cdd9b3c6af6d44027f067fcc423e49c49c91 36e035642c055736e2f833210f5db334a6706486 M VERSION
:100755 100755 a516335cb3e4c67298f285adbdb2ede09da133be 51a9fd0b9741b28a588e2dd3bb57ae2be8805af2 M configure
...dann musst du bisect zurücksetzen und das entsprechende Release als dein erstes "good" bisect setzen ("wine-0.9.xx"). Diese bisect-Ausgabe ist nur eine Versionskennzeichnung, das bedeutet, dass keine wirkliche Code-Änderung dein Problem verursacht hat. Alle "guten" bisect, die du gesetzt hast, zeigen git, dass der Code in Ordnung ist, bis wine-0.9.xx. Git entfernt nun den gesamten code bis auf die Versionskennzeichnung, welches die letzte Revision vor der nächsten Versionskennzeichnung wäre.
Das Bisect zurücksetzen
Wenn du den Test abgeschlossen hast, willst du vielleicht etwas anderes testen. Um dein git-repository zurückzusetzen, führe das Folgende aus:
git bisect reset
Wenn du versuchst ein neues bisect vor diesem Schritt zu starten, wirt git bisect start mit die Fehlermeldung "won't bisect on seeked tree" ausgeben.
Den Git-Tree patchen
Angenommen, ein Entwickler postet einen Patch, den du ausprobieren sollst. Auch wenn das kompliziert klingt, ist es sehr einfach. Du musst nur den Patch herunterladen und in deinen wine-git-Ordner kopieren. Dann führe den aus:
patch -p1 < patch_name.diff
Das wird den Quellcode patchen. Etwas wie dies wird ausgegeben werden:
dlls/wined3d has been patched.
Danach musst du einfach neu kompilieren:
./configure && make clean && make depend && make
und dein Programm erneut ausführen:
./wine "C:\Program Files\Program Name\program.exe"
Siehst du, das war nicht besonders schwer! Wenn du irgendwelche anderen Programme testen willst, dann sollte dein tree nicht verpatcht sein. Um deinen git tree zurückzusetzen, führe aus:
git reset --hard origin
Das wird alle Änderungen, die du gemacht hast, zurücksetzen. Aber da du nur testest und nicht selbst patches schreibst, geht keine Arbeit verloren.
Git Updaten
Nach einigen Wochen, wenn ein Bug, den du verfolgt hast, als behoben gilt und du den neusten Entwicklungsstand testen möchtest, musst du dein Git-Repository updaten und die neue Version kompilieren:
git fetch ; git rebase origin
Nun kannst du einfach erneut kompilieren:
./configure && make clean && make depend && make
Und testen. Dein Programm sollte jetzt laufen!
Tests deaktivieren um die Kompilierung zu beschleunigen
Wenn man für Regressionstests kompiliert, wird ein Großteil der Zeit für die Kompilierung von Konformitäts-Tests verwendet. Auch wenn diese Tests wertvoll sind, werden sie nicht für das regression testing benötigt (wir wissen, etwas ist kaputt, also ist die Konformität irrelevant). Bis es ein Patch für eine solche Option in den Haupt-tree geschafft hat, wird ein kleiner Hack benötigt:
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index d7b0976..2b4b779 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -332,7 +332,7 @@ SUBDIRS = \
winequartz.drv \
winex11.drv
-BUILDSUBDIRS = $(BASEDIRS) $(EXTRADIRS) $(TESTSUBDIRS)
+BUILDSUBDIRS = $(BASEDIRS) $(EXTRADIRS)
INSTALLSUBDIRS = $(BASEDIRS) $(EXTRADIRS) $(IMPLIBSUBDIRS)
DOCSUBDIRS = $(BASEDIRS) $(EXTRADIRS)
diff --git a/programs/Makefile.in b/programs/Makefile.in
index 3c128e1..72dbdb8 100644
--- a/programs/Makefile.in
+++ b/programs/Makefile.in
@@ -41,7 +41,6 @@ SUBDIRS = \
winemenubuilder \
winemine \
winepath \
- winetest \
winevdm \
winhelp \
winver \
--
1.4.4.2
Man muss allerdings aufpassen, wenn man diesen patch benutzt. Git-bisect mag es nicht, wenn man den tree während eines bisects verändert. Um also ordentlich zu bisecten und dennoch die tests zu deaktivieren, gehe wie folgendermaßen vor (es wird angenommen, der patch ist ~/wine-git/disable_test.diff):
Schritt: $ git bisect start
Schritt: $ git bisect bad wine-0.9.50
Schritt: $ git bisect good wine-0.9.52
Schritt: $ patch -p1 < disable_test.diff && CC="ccache gcc" ./configure && make clean && make depend && make && patch -p1 -R < disable_test.diff
Teste anschließend deine Anwendung und benutze "git bisect good" oder "git bisect bad" um den nächsten Test durchzuführen. Gehe danach immer wie im 4. Schritt vor, bis du den entsprechenden Patch gefunden hast.
Der Patch zur Deaktivierung der Tests kann hier heruntergeladen werden.
Moderiert von adun:
Syntax repariert