Automatisierte Tests mit dunit

Automatisierte Tests mit dunit


Irren ist menschlich - automatisierte Prüfung von Delphi Code mit DUnit. Von Kris Golko



Um Fehler einzuführen ist menschlich; das Problem ist in der Regel nicht mit beheben, sondern mit ihnen zu finden, bevor Ihre Kunden tun. Automatisierten Testtools kommen zur Rettung hier, mit ihrer Fähigkeit, den Testprozess unerbittlich, zu wiederholen, sodass Entwickler mit viel mehr Vertrauen arbeiten können. Warum DUnit? Weil es um Unit-Tests (Einheit im Sinne des Aufbaus eines Blocks von Code anstatt einer Object Pascal-Unit) geht. Ein weiterer Vorteil ist, dass DUnit Tests Rahmenbedingungen sind, um Code auszuführen, die schneller und bequemer als eine gesamte Anwendung ausgeführt wird. Was ich am liebsten in DUnit ist, dass ich meine Testfälle mit meinem Lieblings-Entwicklungs-Tool erstellen können. DUnit unterstützt Delphi 4 bis 7 sowie Kylix.



Erste Schritte

DUnit ist als Quellcode verteilt; Es umfasst eine Reihe von Delphi-Quellcode-Dateien, Beispiele und Dokumentation. Es kann von der Web-Projektseite auf SourceForge der sourceforge.net:/projects/dunit heruntergeladen werden. Um zu installieren, entpacken Sie die Datei in ein Verzeichnis Ihrer Wahl, Erhaltung der Unterverzeichnisse. Die Einheiten, die zum Erstellen und Ausführen von Tests sind in 'Src'-Unterverzeichnis, die entweder dem Bibliothekspfad in hinzugefügt werden soll ' Umwelt Optionen| Bibliothek ' oder den Suchpfad von Dialogfeld Optionen im Testprojekt.



Gewusst wie: Schreiben von Testfällen

Das ist einfach: alles, was Sie tun müssen ist, erstellen Sie eine Klasse von TTestCase geerbt, TTestCase wird in der Einheit TestFramework deklariert. Um Prüfungen ein Testfall-Klasse hinzuzufügen, einfach hinzufügen einer veröffentlichten Verfahren für jeden Test in der abgeleiteten Klasse. Ein Testobjekt Läufer verwendet RTTI um zu erkennen, welche Tests in einem Testfall-Klasse verfügbar sind.



Es gibt zwei sehr nützliche Methoden: auf- und Abbau. Ausführung des Einzelfalls Test innerhalb einer Klasse beginnt mit Setup, dann kommt das veröffentlichte Verfahren, das was den Test bildet, die von TearDown gefolgt wird. Setup kann verwendet werden, um erforderlichen Tests ausgeführt und ihre Zustände nach der Testphase zu initialisieren Objekte zu instanziieren. Setup sollte auch Maßnahmen durchgeführt werden, bevor jeder Test ausgeführt wird, enthalten wie verbinden mit einer Datenbank. Abrüsten-Methode sollte verwendet werden, zu säubern und entsorgen von Objekten.



Eine veröffentlichte Prozedur enthält in der Regel mehrere Aufrufe der Methode Check. Die Prüfmethode wird wie folgt deklariert:




Verfahren überprüfen (Bedingung: Boolean; msg: Zeichenfolge = ''); virtuellen;





Der Condition-Parameter ist in der Regel in Form eines Ausdrucks, die einen booleschen Wert ergibt. Wenn der Ausdruck übergeben die Check-Prozedur zu False ausgewertet wird, dann der Test als fehlerhaft markiert und die Ausführung des Tests abgebrochen ist wird.




...

Überprüfen (Expected = Istwert, 'Tatsächliche Anzahl anders als erwartet');

...





Prüfungen werden in bündeln, genannt Suiten organisiert. Testsuites können mehrere Tests und andere Test-Suites, wodurch eine Möglichkeit zum Erstellen einer Struktur von Tests enthalten. DUnits Operationen im Mittelpunkt steht die Test-Registrierung, die alle Suiten in der Testanwendung hält. In der Regel ist die Test-Registrierung Initialisiert eine Testanwendung integriert. Einheiten die Testfälle vereinbarungsgemäß zu deklarieren haben einen Initialisierungsabschnitt, wo die Testfälle erstellt und zur Registrierung hinzugefügt werden.



Testsuites können erstellt werden, indem die Instanziierung der Klasse des TTestSuite in das TestFramework deklariert. Die bequemste und häufig verwendete Möglichkeit, eine Testsuite erstellen ist-Methode Suite der TTestCase-Klasse, die eine neue TTestSuite, enthält nur die TestCase erstellt: Beachten Sie, dass es eine Klassenmethode ist.



Die Prozeduren RegisterTest und RegisterTests Hinzufügen von Tests oder Testreihen an der Test-Registrierung. Das einfachste Beispiel ist eine Testsuite enthält einen einzelnen Testfall erstellen und registrieren es dann wie folgt:




Framework.RegisterTest(TMyTest.Suite);





Gewusst wie: Ausführen von tests

DUnit beinhaltet zwei standard-Test-Läufer-Klassen: TGUITestRunner mit interaktiven GUI-Schnittstelle und TTextTestRunner mit Batch-Modus Befehl Leitungsschnittstelle. TGUITestRunner wird in der GUITestRunner-Einheit zusammen mit dem RunRegisteredTests Standalone Verfahren, deklariert die registrierte Testsuites mit TGUITestRunner läuft. Die CLX-Version von TGUITextRunner wird in der Einheit QGUITestRunner deklariert.



01.gif



TTextTestRunner ist die TextTestRunner-Einheit zusammen mit der entsprechenden RunRegisteredTests-Standalone-Prozedur deklariert. Aufrufe von RunRegisteredTest sind in der Regel mit einem Namen Einheit qualifiziert, da dort mehrere globale RunRegisteredTests-Verfahren, zum Beispiel sind:




GUITestRunner.RunRegisteredTest;





Benutzer von DUnit werden feststellen, dass die jüngsten Änderungen DUnit gehört das Hinzufügen von Methoden der RunRegisteredTests-Klasse und die Missbilligung des eigenständigen RunRegisteredTests, da mehrere globale Prozeduren mit dem gleichen Namen unnötig den Namensraum Krempel. Der Aufruf von RunRegisteredTests wird nun mit den Test-Läufer-Klassennamen anstatt ein Gerätename qualifiziert werden empfohlen:




TGUITestRunner.RunRegisteredTest;





Ein Beispiel

Sagen wir es in die Praxis. Die Beispielanwendung sammelt Bewertungen in der Weise, dass viele Websites eine Möglichkeit bieten, 'diese Website bewerten'. Vor allem hat CodeCentral eine interessante Bewertungssystem wo können Sie Entscheidungen nach Ihren persönlichen Präferenzen festlegen (mein Favorit ist antiken griechischen Mythologie). Die grundlegende Logik von unserem Rating-System wird durch die IRateCollector-Schnittstelle definiert.




IRatingCollector = Interface

Funktion GetPrompt: string;

Verfahren Rate (Rater: string; Wahl: Integer);

Funktion GetChoiceCount: Integer;

Funktion GetChoice(Choice: integer): string;

Funktion GetChoiceRatings(Choice: integer): Integer;

Funktion GetRatingCount: Integer;

Funktion GetRating (Index: Integer; Var Rater: Zeichenfolge): Ganzzahl;

Funktion GetRatersRating(Rater: string): Integer;

Ende;





Die TRateTests-Klasse kann wir entwickeln und testen Sie die Business-Logik unabhängig von der Benutzeroberfläche zu entwickeln. Es ist tatsächlich vorteilhaft entwickeln und testen die Business-Logik vor dem Start der Benutzeroberfläche. Die Testfälle sollen eine Umsetzung des IRatingCollector zu testen.




TRateTests = class(TTestCase)

Private

FRateCollector: IRatingCollector;

geschützt

Setup des Verfahrens; außer Kraft setzen;

Verfahrens TearDown; außer Kraft setzen;

veröffentlicht

testet hier

Ende;





Die Setup- und TearDown-Verfahren werden zum Instanziieren und verfügen über eine Implementierung der IRatingCollector.




const

SAMPLE_RATE_PROMPT = 'Bewerten DUnit (mythologische slawische weibliche)';

SAMPLE_RATE_CHOICES: Array [0..3] String = ('Lada', 'Jurata', 'Marzanna', 'Baba Jaga');



Prozedur TRateTests.Setup;

beginnen

Ändern Sie diese Zeile nur um eine andere Implementierung der IRatingCollector zu testen

FRateCollector: = TSimpleRatingCollector.Create (SAMPLE_RATE_PROMPT, SAMPLE_RATE_CHOICES);

Ende;



Prozedur TRateTests.TearDown;

beginnen

FRateCollector: = Nil;

Ende;





Verfahren in der veröffentlichten-Abschnitt deklariert sind grundlegende Tests Einheiten; Schreiben sie erfordert Einfallsreichtum und Kreativität. In unserem Beispiel überprüft TestChoices, wenn die Liste der Möglichkeiten ist, wie erwartet.




Prozedur TRateTests.TestChoices;

var

I: Ganzzahl;

beginnen

Prüfen (FRatingCollector.GetChoiceCount = Length(SAMPLE_RATE_CHOICES),

Format ('Es sollte genau %d Entscheidungen',

Length(SAMPLE_RATE_CHOICES)]));

für I: = 0 to FRatingCollector.GetChoiceCount - 1

Check(FRatingCollector.GetChoice(I) = SAMPLE_RATE_CHOICES [I],

'Erwartet' + SAMPLE_RATE_CHOICES[I]);

Ende;





Die TestRate-Prozedur wird überprüft, ob die Rate Verfahren Ergebnisse in Zunahme der Preise für die bewertet Wahl ausgeführt:




Verfahren TestRate

...

FRatingCollector.Rate (NextRater, 0);

Prüfen (FRatingCollector.GetRatingCount = RatingCount + 1,

'Erwartet' + IntToStr(RatingCount + 1));

...

Ende;





Tests sollten so umfassend wie möglich sein, aber es ist sehr schwierig, alle mögliche Szenarien abdecken. Während Fehler gemeldet werden, sollten Tests überprüft werden.



Es ist sehr wichtig, die Cover für Extrembedingungen testet; in unserem Beispiel könnte die Wahl oder die Rater Rate-Prozedur übergeben ungültig sein. Die Tests prüfen, ob eine Ausnahme ausgelöst wird, wenn eine Ausnahme erwartet wird. Der folgende Code überprüft, ob EinvalidRater-Ausnahme ausgelöst wird, wenn ein Rater versucht, Zweitens bewerten Zeit.




ErrorAsExpected: = False;

Rater: = NextRater;

versuchen Sie

FRatingCollector.Rate (Rater, 0);

FRatingCollector.Rate (Rater, 0);

mit Ausnahme von

Ausnahme erwartet

E:EInvalidRater do

ErrorAsExpected: = True;

Ende;

Scheck (ErrorAsExpected, 'Ausnahme erwartet wenn ein Rater schon bewertet hat');





Schließlich die Registrierung des Tests im Initialisierungsabschnitt:




RegisterTest ('grundlegende Tests', [TRateTests.Suite]);





Die Projektdatei zeigt die typische Vorgehensweise zum Ausführen von Tests im GUI-Modus.




GUITestRunner.runRegisteredTests;





02.gif



CLX anstatt der VCL verwenden möchten, ersetzen Sie GUITestRunner mit QGUITestRunner in qualifizierten Aufrufe von RunRegisteredTests ebenso wie in der Klausel verwendet.



Extreme plattformübergreifende Programmierung

Bei der Portierung von DUnit, Kylix gibt es zwei Kategorien von Problemen, der Unterschied zwischen Windows und Linux Systemaufrufe und die Unterschiede zwischen VCL und CLX. Überraschenderweise ist es einfacher, mit OS Unterschiede. Der erste Schritt ist, setzen bedingte Anweisungen in den Klauseln verwendet, Einheiten wie Windows oder Nachrichten natürlich nicht in Kylix verfügbar sind; Prototypen von Basissystem anrufen finden Sie in der Libc Einheit und einfache Typdefinitionen Typen und Qt Standardanlagen. Einige Systemfunktionen durch Linux-äquivalente ersetzt wurden, andere haben umgesetzt werden.



Es hat eine Reihe von Tricks auf CLX zu portieren. CLX und VCL visuellen Komponenten unterscheiden sich nur geringfügig, aber dennoch manchmal portieren kann ziemlich schwierig sein.



DUnit für Delphi und Kylix kompiliert aus derselben Quelle mit Ausnahme von GUITestRunner/QGUITestRunner GUI Test Läufer, es gibt jedoch viele bedingte Anweisungen in die Quelle dieser Cross-Plattform aktivieren unterstützt.



Dies ist erst der Anfang

Sobald die Grundlagen beherrschen, gibt es viele zusätzliche Funktionen innerhalb DUnit, die komplexere Prüfungen durchgeführt werden, ermöglicht. Beispielsweise gibt es vorgefertigte Klassen, die für einen bestimmten Zweck, z. B. für ein Memory Leak Tests verwendet werden kann. Die TestExtension-Einheit enthält eine Reihe von nützliche Klassen basieren auf dem Decorator-Entwurfsmuster. Einer der wichtigsten ist die TRepeatedTest-Klasse, die einen Testfall eine bestimmte Anzahl von Wiederholungen ausgeführt werden können. In diesem Beispiel wird TRepeatedTest verwendet, um die Rate-Prozedur mehrmals hintereinander aufrufen.




RegisterTest ('wiederholte Rate',

TRepeatedTest.Create(TRateTests.Create('CheckRate'), 5));





Die Klasse TGUITestCase, unterstützt von der grafischen Benutzeroberfläche testen. TGUITestCase wird in der Einheit GUITesting deklariert. Siehe RateGUITests-Einheit für ein Beispiel benutzen, um das Dialogfeld um die Bewertung einreichen Testen.



Wie die Delphi-Quellcode für DUnit frei verfügbar ist, kann also ein erfahrener Delphi-Entwickler einfach DUnit, z. B. erweitern indem Sie neue Erweiterungen erstellen.



Prüfung als befreite Kunst

Testen bringt bessere Ergebnisse, wenn Prüfungen auf Erkenntnissen des Anwendungsentwurfs basieren. Wenn UML-Diagramme erstellt wurden, können sie als Grundlage für den Bau von Tests, damit Abschluss der Anforderung, Analyse, Implementierung, Testzyklus verwendet werden.



Im Idealfall sollten die Prüfungen zur gleichen Zeit wie die Entwicklung der Projektcode entwickelt werden. Technisch, Tests können erstellt werden, für Anwendungen, die bereits abgeschlossen sind, diese Anwendungen sind jedoch oft nicht geeignet für Unit-Tests, da sie nicht gut entwickelte modular aufgebaut. Mit automatisierten Tests mit DUnit fördert bessere Anwendungsdesign sowie die Umgestaltung von Code erleichtert, aber ich denke, dass der größte Unterschied macht es im Stadium der Anwendungswartung ist. Betreuer können Einheiten (im Sinne von Modulen) anstatt komplette Projekte und sie können Bugfix und Prüfeinheiten zugewiesen werden ohne erstellen und Testen einer ganzen Anwendung. Manchmal kann ein Problem gelöst werden, auf der Einheitenebene und Einbeziehung der ein erfahrener Entwickler ist notwendig, aber im Falle einer großen amorphen Anwendung haben erfahrene Entwickler ständig zu beteiligen.









Automatisierte Tests mit dunit


Automatisierte Tests mit dunit : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Irren ist menschlich - automatisierte Prüfung von Delphi Code mit DUnit. Von Kris Golko



Um Fehler einzuführen ist menschlich; das Problem ist in der Regel nicht mit beheben, sondern mit ihnen zu finden, bevor Ihre Kunden tun. Automatisierten Testtools kommen zur Rettung hier, mit ihrer Fähigkeit, den Testprozess unerbittlich, zu wiederholen, sodass Entwickler mit viel mehr Vertrauen arbeiten können. Warum DUnit? Weil es um Unit-Tests (Einheit im Sinne des Aufbaus eines Blocks von Code anstatt einer Object Pascal-Unit) geht. Ein weiterer Vorteil ist, dass DUnit Tests Rahmenbedingungen sind, um Code auszuführen, die schneller und bequemer als eine gesamte Anwendung ausgeführt wird. Was ich am liebsten in DUnit ist, dass ich meine Testfälle mit meinem Lieblings-Entwicklungs-Tool erstellen können. DUnit unterstützt Delphi 4 bis 7 sowie Kylix.



Erste Schritte

DUnit ist als Quellcode verteilt; Es umfasst eine Reihe von Delphi-Quellcode-Dateien, Beispiele und Dokumentation. Es kann von der Web-Projektseite auf SourceForge der sourceforge.net:/projects/dunit heruntergeladen werden. Um zu installieren, entpacken Sie die Datei in ein Verzeichnis Ihrer Wahl, Erhaltung der Unterverzeichnisse. Die Einheiten, die zum Erstellen und Ausführen von Tests sind in 'Src'-Unterverzeichnis, die entweder dem Bibliothekspfad in hinzugefügt werden soll ' Umwelt Optionen| Bibliothek ' oder den Suchpfad von Dialogfeld Optionen im Testprojekt.



Gewusst wie: Schreiben von Testfällen

Das ist einfach: alles, was Sie tun müssen ist, erstellen Sie eine Klasse von TTestCase geerbt, TTestCase wird in der Einheit TestFramework deklariert. Um Prüfungen ein Testfall-Klasse hinzuzufügen, einfach hinzufügen einer veröffentlichten Verfahren für jeden Test in der abgeleiteten Klasse. Ein Testobjekt Läufer verwendet RTTI um zu erkennen, welche Tests in einem Testfall-Klasse verfügbar sind.



Es gibt zwei sehr nützliche Methoden: auf- und Abbau. Ausführung des Einzelfalls Test innerhalb einer Klasse beginnt mit Setup, dann kommt das veröffentlichte Verfahren, das was den Test bildet, die von TearDown gefolgt wird. Setup kann verwendet werden, um erforderlichen Tests ausgeführt und ihre Zustände nach der Testphase zu initialisieren Objekte zu instanziieren. Setup sollte auch Maßnahmen durchgeführt werden, bevor jeder Test ausgeführt wird, enthalten wie verbinden mit einer Datenbank. Abrüsten-Methode sollte verwendet werden, zu säubern und entsorgen von Objekten.



Eine veröffentlichte Prozedur enthält in der Regel mehrere Aufrufe der Methode Check. Die Prüfmethode wird wie folgt deklariert:




Verfahren überprüfen (Bedingung: Boolean; msg: Zeichenfolge = ''); virtuellen;





Der Condition-Parameter ist in der Regel in Form eines Ausdrucks, die einen booleschen Wert ergibt. Wenn der Ausdruck übergeben die Check-Prozedur zu False ausgewertet wird, dann der Test als fehlerhaft markiert und die Ausführung des Tests abgebrochen ist wird.




...

Überprüfen (Expected = Istwert, 'Tatsächliche Anzahl anders als erwartet');

...





Prüfungen werden in bündeln, genannt Suiten organisiert. Testsuites können mehrere Tests und andere Test-Suites, wodurch eine Möglichkeit zum Erstellen einer Struktur von Tests enthalten. DUnits Operationen im Mittelpunkt steht die Test-Registrierung, die alle Suiten in der Testanwendung hält. In der Regel ist die Test-Registrierung Initialisiert eine Testanwendung integriert. Einheiten die Testfälle vereinbarungsgemäß zu deklarieren haben einen Initialisierungsabschnitt, wo die Testfälle erstellt und zur Registrierung hinzugefügt werden.



Testsuites können erstellt werden, indem die Instanziierung der Klasse des TTestSuite in das TestFramework deklariert. Die bequemste und häufig verwendete Möglichkeit, eine Testsuite erstellen ist-Methode Suite der TTestCase-Klasse, die eine neue TTestSuite, enthält nur die TestCase erstellt: Beachten Sie, dass es eine Klassenmethode ist.



Die Prozeduren RegisterTest und RegisterTests Hinzufügen von Tests oder Testreihen an der Test-Registrierung. Das einfachste Beispiel ist eine Testsuite enthält einen einzelnen Testfall erstellen und registrieren es dann wie folgt:




Framework.RegisterTest(TMyTest.Suite);





Gewusst wie: Ausführen von tests

DUnit beinhaltet zwei standard-Test-Läufer-Klassen: TGUITestRunner mit interaktiven GUI-Schnittstelle und TTextTestRunner mit Batch-Modus Befehl Leitungsschnittstelle. TGUITestRunner wird in der GUITestRunner-Einheit zusammen mit dem RunRegisteredTests Standalone Verfahren, deklariert die registrierte Testsuites mit TGUITestRunner läuft. Die CLX-Version von TGUITextRunner wird in der Einheit QGUITestRunner deklariert.



01.gif



TTextTestRunner ist die TextTestRunner-Einheit zusammen mit der entsprechenden RunRegisteredTests-Standalone-Prozedur deklariert. Aufrufe von RunRegisteredTest sind in der Regel mit einem Namen Einheit qualifiziert, da dort mehrere globale RunRegisteredTests-Verfahren, zum Beispiel sind:




GUITestRunner.RunRegisteredTest;





Benutzer von DUnit werden feststellen, dass die jüngsten Änderungen DUnit gehört das Hinzufügen von Methoden der RunRegisteredTests-Klasse und die Missbilligung des eigenständigen RunRegisteredTests, da mehrere globale Prozeduren mit dem gleichen Namen unnötig den Namensraum Krempel. Der Aufruf von RunRegisteredTests wird nun mit den Test-Läufer-Klassennamen anstatt ein Gerätename qualifiziert werden empfohlen:




TGUITestRunner.RunRegisteredTest;





Ein Beispiel

Sagen wir es in die Praxis. Die Beispielanwendung sammelt Bewertungen in der Weise, dass viele Websites eine Möglichkeit bieten, 'diese Website bewerten'. Vor allem hat CodeCentral eine interessante Bewertungssystem wo können Sie Entscheidungen nach Ihren persönlichen Präferenzen festlegen (mein Favorit ist antiken griechischen Mythologie). Die grundlegende Logik von unserem Rating-System wird durch die IRateCollector-Schnittstelle definiert.




IRatingCollector = Interface

Funktion GetPrompt: string;

Verfahren Rate (Rater: string; Wahl: Integer);

Funktion GetChoiceCount: Integer;

Funktion GetChoice(Choice: integer): string;

Funktion GetChoiceRatings(Choice: integer): Integer;

Funktion GetRatingCount: Integer;

Funktion GetRating (Index: Integer; Var Rater: Zeichenfolge): Ganzzahl;

Funktion GetRatersRating(Rater: string): Integer;

Ende;





Die TRateTests-Klasse kann wir entwickeln und testen Sie die Business-Logik unabhängig von der Benutzeroberfläche zu entwickeln. Es ist tatsächlich vorteilhaft entwickeln und testen die Business-Logik vor dem Start der Benutzeroberfläche. Die Testfälle sollen eine Umsetzung des IRatingCollector zu testen.




TRateTests = class(TTestCase)

Private

FRateCollector: IRatingCollector;

geschützt

Setup des Verfahrens; außer Kraft setzen;

Verfahrens TearDown; außer Kraft setzen;

veröffentlicht

testet hier

Ende;





Die Setup- und TearDown-Verfahren werden zum Instanziieren und verfügen über eine Implementierung der IRatingCollector.




const

SAMPLE_RATE_PROMPT = 'Bewerten DUnit (mythologische slawische weibliche)';

SAMPLE_RATE_CHOICES: Array [0..3] String = ('Lada', 'Jurata', 'Marzanna', 'Baba Jaga');



Prozedur TRateTests.Setup;

beginnen

Ändern Sie diese Zeile nur um eine andere Implementierung der IRatingCollector zu testen

FRateCollector: = TSimpleRatingCollector.Create (SAMPLE_RATE_PROMPT, SAMPLE_RATE_CHOICES);

Ende;



Prozedur TRateTests.TearDown;

beginnen

FRateCollector: = Nil;

Ende;





Verfahren in der veröffentlichten-Abschnitt deklariert sind grundlegende Tests Einheiten; Schreiben sie erfordert Einfallsreichtum und Kreativität. In unserem Beispiel überprüft TestChoices, wenn die Liste der Möglichkeiten ist, wie erwartet.




Prozedur TRateTests.TestChoices;

var

I: Ganzzahl;

beginnen

Prüfen (FRatingCollector.GetChoiceCount = Length(SAMPLE_RATE_CHOICES),

Format ('Es sollte genau %d Entscheidungen',

Length(SAMPLE_RATE_CHOICES)]));

für I: = 0 to FRatingCollector.GetChoiceCount - 1

Check(FRatingCollector.GetChoice(I) = SAMPLE_RATE_CHOICES [I],

'Erwartet' + SAMPLE_RATE_CHOICES[I]);

Ende;





Die TestRate-Prozedur wird überprüft, ob die Rate Verfahren Ergebnisse in Zunahme der Preise für die bewertet Wahl ausgeführt:




Verfahren TestRate

...

FRatingCollector.Rate (NextRater, 0);

Prüfen (FRatingCollector.GetRatingCount = RatingCount + 1,

'Erwartet' + IntToStr(RatingCount + 1));

...

Ende;





Tests sollten so umfassend wie möglich sein, aber es ist sehr schwierig, alle mögliche Szenarien abdecken. Während Fehler gemeldet werden, sollten Tests überprüft werden.



Es ist sehr wichtig, die Cover für Extrembedingungen testet; in unserem Beispiel könnte die Wahl oder die Rater Rate-Prozedur übergeben ungültig sein. Die Tests prüfen, ob eine Ausnahme ausgelöst wird, wenn eine Ausnahme erwartet wird. Der folgende Code überprüft, ob EinvalidRater-Ausnahme ausgelöst wird, wenn ein Rater versucht, Zweitens bewerten Zeit.




ErrorAsExpected: = False;

Rater: = NextRater;

versuchen Sie

FRatingCollector.Rate (Rater, 0);

FRatingCollector.Rate (Rater, 0);

mit Ausnahme von

Ausnahme erwartet

E:EInvalidRater do

ErrorAsExpected: = True;

Ende;

Scheck (ErrorAsExpected, 'Ausnahme erwartet wenn ein Rater schon bewertet hat');





Schließlich die Registrierung des Tests im Initialisierungsabschnitt:




RegisterTest ('grundlegende Tests', [TRateTests.Suite]);





Die Projektdatei zeigt die typische Vorgehensweise zum Ausführen von Tests im GUI-Modus.




GUITestRunner.runRegisteredTests;





02.gif



CLX anstatt der VCL verwenden möchten, ersetzen Sie GUITestRunner mit QGUITestRunner in qualifizierten Aufrufe von RunRegisteredTests ebenso wie in der Klausel verwendet.



Extreme plattformübergreifende Programmierung

Bei der Portierung von DUnit, Kylix gibt es zwei Kategorien von Problemen, der Unterschied zwischen Windows und Linux Systemaufrufe und die Unterschiede zwischen VCL und CLX. Überraschenderweise ist es einfacher, mit OS Unterschiede. Der erste Schritt ist, setzen bedingte Anweisungen in den Klauseln verwendet, Einheiten wie Windows oder Nachrichten natürlich nicht in Kylix verfügbar sind; Prototypen von Basissystem anrufen finden Sie in der Libc Einheit und einfache Typdefinitionen Typen und Qt Standardanlagen. Einige Systemfunktionen durch Linux-äquivalente ersetzt wurden, andere haben umgesetzt werden.



Es hat eine Reihe von Tricks auf CLX zu portieren. CLX und VCL visuellen Komponenten unterscheiden sich nur geringfügig, aber dennoch manchmal portieren kann ziemlich schwierig sein.



DUnit für Delphi und Kylix kompiliert aus derselben Quelle mit Ausnahme von GUITestRunner/QGUITestRunner GUI Test Läufer, es gibt jedoch viele bedingte Anweisungen in die Quelle dieser Cross-Plattform aktivieren unterstützt.



Dies ist erst der Anfang

Sobald die Grundlagen beherrschen, gibt es viele zusätzliche Funktionen innerhalb DUnit, die komplexere Prüfungen durchgeführt werden, ermöglicht. Beispielsweise gibt es vorgefertigte Klassen, die für einen bestimmten Zweck, z. B. für ein Memory Leak Tests verwendet werden kann. Die TestExtension-Einheit enthält eine Reihe von nützliche Klassen basieren auf dem Decorator-Entwurfsmuster. Einer der wichtigsten ist die TRepeatedTest-Klasse, die einen Testfall eine bestimmte Anzahl von Wiederholungen ausgeführt werden können. In diesem Beispiel wird TRepeatedTest verwendet, um die Rate-Prozedur mehrmals hintereinander aufrufen.




RegisterTest ('wiederholte Rate',

TRepeatedTest.Create(TRateTests.Create('CheckRate'), 5));





Die Klasse TGUITestCase, unterstützt von der grafischen Benutzeroberfläche testen. TGUITestCase wird in der Einheit GUITesting deklariert. Siehe RateGUITests-Einheit für ein Beispiel benutzen, um das Dialogfeld um die Bewertung einreichen Testen.



Wie die Delphi-Quellcode für DUnit frei verfügbar ist, kann also ein erfahrener Delphi-Entwickler einfach DUnit, z. B. erweitern indem Sie neue Erweiterungen erstellen.



Prüfung als befreite Kunst

Testen bringt bessere Ergebnisse, wenn Prüfungen auf Erkenntnissen des Anwendungsentwurfs basieren. Wenn UML-Diagramme erstellt wurden, können sie als Grundlage für den Bau von Tests, damit Abschluss der Anforderung, Analyse, Implementierung, Testzyklus verwendet werden.



Im Idealfall sollten die Prüfungen zur gleichen Zeit wie die Entwicklung der Projektcode entwickelt werden. Technisch, Tests können erstellt werden, für Anwendungen, die bereits abgeschlossen sind, diese Anwendungen sind jedoch oft nicht geeignet für Unit-Tests, da sie nicht gut entwickelte modular aufgebaut. Mit automatisierten Tests mit DUnit fördert bessere Anwendungsdesign sowie die Umgestaltung von Code erleichtert, aber ich denke, dass der größte Unterschied macht es im Stadium der Anwendungswartung ist. Betreuer können Einheiten (im Sinne von Modulen) anstatt komplette Projekte und sie können Bugfix und Prüfeinheiten zugewiesen werden ohne erstellen und Testen einer ganzen Anwendung. Manchmal kann ein Problem gelöst werden, auf der Einheitenebene und Einbeziehung der ein erfahrener Entwickler ist notwendig, aber im Falle einer großen amorphen Anwendung haben erfahrene Entwickler ständig zu beteiligen.


Automatisierte Tests mit dunit

Automatisierte Tests mit dunit : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Freunden empfehlen
  • gplus
  • pinterest

Kürzliche Posts

Kommentar

Einen Kommentar hinterlassen

Wertung