Auflösen von inkludierten Dateien

Dies ist ein Abschnitt den Sie hoffentlich nie lesen müssen. Er erklärt detailliert, wie implizite Referenzen von 'Prozeduren' und 'Komponenten' bei der Wiedergabe von Tests aufgelöst werden. Wenn Sie diesen Abschnitt doch lesen müssen, ist das ein Zeichen dafür, dass die Include Hierarchie Ihrer Testsuiten zu kompliziert geworden ist und Sie diese eventuell vereinfachen sollten.

Es gibt im wesentlichen zwei Fälle, in denen QF-Test implizit Referenzen in anderen Testsuiten auflöst, nämlich immer wenn die angeforderte 'Prozedur' oder 'Komponente' in der aktuellen Suite nicht gefunden wird und

  • Die Suite andere Testsuiten über das Attribut 'Inkludierte Dateien' des 'Testsuite' Knotens einbindet. QF-Test durchsucht dann diese Testsuiten in der angegebenen Reihenfolge.
  • Diese Testsuite (genauer gesagt eine ihrer 'Prozeduren') von einer anderen Testsuite aufgerufen wurde. QF-Test sucht dann auch in der aufrufenden Suite nach einem passenden Knoten.

Die ganze Sache wird kompliziert, wenn (möglicherweise indirekte) 'Prozeduraufrufe' und (möglicherweise indirekte, evtl. sogar rekursive) Includes kombiniert werden. Die folgende detaillierte Aufstellung des Suchalgorithmus wird Ihnen hoffentlich helfen, Probleme mit inkludierten Dateien zu lösen.

  • Wann immer ein Testlauf die aktuelle Suite verlässt, um mit einer 'Prozedur' oder einer 'Komponente' in einer anderen Testsuite fortzufahren, wird die andere Suite zur aktuellen Suite. Dabei geschehen zwei Dinge: Die alte Suite wird auf den Aufrufstapel gelegt und die Variablen der neuen Suite werden auf den Sekundärstapel für Variablendefinitionen gelegt (vgl. Kapitel 6), so dass sie stärker binden, als die Variablendefinitionen der alten Suite. Im Protokoll wird dieser Prozess durch einen Testsuite Wechsel Knoten festgehalten, der alle Knoten des Testlaufs außerhalb der alten Suite enthält.
  • Jede Suche startet in der aktuellen Suite und geht dann von oben nach unten durch den Aufrufstapel weiter. Beispiel: Suite A ruft Suite B auf, die Suite C aufruft. Dann wird zunächst C, dann B, dann A durchsucht.
  • Includes haben Vorrang vor dem Aufrufstapel. Das bedeutet, dass bei der Suche in der aktuellen Suite oder den Testsuiten auf dem Aufrufstapel bei jedem Schritt die inkludierten Dateien durchsucht werden, bevor mit der nächsten Suite auf dem Aufrufstapel fortgefahren wird. Beispiel: Suite A ruft Suite B auf, welche Suite C einbindet. A ist auf dem Aufrufstapel und B ist die aktuelle Suite. Dann wird zunächst B, dann C, dann A durchsucht.
  • Im Fall mehrfacher, ggf. indirekter Includes wird die Suche "depth-first", d.h. zuerst in die Tiefe gehend durchgeführt. Dabei wird die Reihenfolge der Includes beachtet. Beispiel. Suite A bindet Testsuiten B und C ein, Suite B bindet Suite D ein. Dann wird zunächst A, dann B, dann D und dann C durchsucht.
  • Wird eine 'Prozedur' in einer (evtl. indirekt) eingebundenen Suite gefunden (im Gegensatz zu einer Suite auf dem Aufrufstapel), findet der Wechsel von der aktuellen zur neuen aktuellen Suite nicht in einem Schritt statt. Für diese Erklärung brauchen wir von Anfang an ein Beispiel: Sagen wir Suite A ruft Suite B auf und A bindet Suite C ein. B ruft eine 'Prozedur' auf, die (auf dem Umweg über A) in C gefunden wird. Anstatt direkt von B zu C zu wechseln, wird zunächst A zur aktuellen Suite und dann B. Dadurch landet A noch einmal über B auf dem Aufrufstapel und die Variablendefinitionen von A werden über die von B auf den Sekundärstapel gelegt. Die Argumentation hierfür ist folgende: Suite C, welche jetzt die aktuelle Suite ist, "ist näher an" Suite A, welche C einbindet, als an Suite B, die lediglich von A aufgerufen wurde. Man könnte auch sagen, dass Testsuite und Include Datei eine Art Einheit bilden, so dass aus der Sicht von B die Testsuiten A und C immer wie eine einzelne Testsuite aussehen, solange B nicht explizit C aufruft.
  • Das war es, bis auf ein kleines Detail: Während der Suche überprüft QF-Test jede Testsuite höchstens einmal. Eine zweiter Durchgang wäre ohnehin sinnlos, aber es handelt sich hierbei nicht nur um eine Optimierung, da dadurch Probleme mit rekursiven Includes vermieden werden, wenn z.B. Suite A Suite B einbindet und umgekehrt.

Sollten Sie wirklich ein Problem haben, herauszufinden wie, warum oder warum nicht eine bestimmte 'Prozedur' oder 'Komponente' ermittelt wurde, sollten Sie als erstes einen Blick auf das Protokoll werfen. Es zeigt Ihnen genau, welche Testsuiten aktuell sind und welche Variablenexpansionen stattgefunden haben.