Liebe Forums-Teilnehmer,
lieber Michael,
recht herzlichen Dank für das tolle Wochenende in Wittenberg und Euer Feedback zu meinen Unit Testing Fragen.
Ich habe das Test Projekt nochmal vereinfacht und
hier hochgeladen.
Das Problem ist das ein einzelner Testfall nicht dazu führt das alle Parent Testfälle auch ausgeführt werden. Hier der kritische Code von
Code: Alles auswählen
procedure TGUITestRunner.ActRunHighlightedTestExecute(Sender: TObject);
begin
FFirstFailure := nil;
if (TestTree.Selected <> nil) and (TestTree.Selected.Data <> nil) then
begin
testSuite := TTest(TestTree.Selected.Data);
end;
RunTest(testSuite);
TestTree.MakeSelectionVisible;
end;
Es wählt nur den selektierten Knoten/Testfall aus. In DUnit sieht die Funktion so aus:
Code: Alles auswählen
procedure TGUITestRunner.RunSelectedTestActionExecute(Sender: TObject);
begin
Setup;
ListSelectedTests;
ProgressBar.Max := 1;
ScoreBar.Max := 1;
RunTheTest(Suite);
{$IFDEF VER130}
FreeAndNil(FSelectedTests);
{$ELSE}
FSelectedTests.Free;
FSelectedTests := nil;
{$ENDIF}
end;
mit der Methode ListSelectedTests:
Code: Alles auswählen
procedure TGUITestRunner.ListSelectedTests;
var
aTest: ITest;
aNode: TTreeNode;
begin
FSelectedTests.Free;
FSelectedTests := nil;
FSelectedTests := TInterfaceList.Create;
aNode := TestTree.Selected;
while Assigned(aNode) do
begin
aTest := NodeToTest(aNode);
FSelectedTests.Add(aTest as ITest);
aNode := aNode.Parent;
end;
end;
Diesem Code kann man entnehmen, daß alle Parent Nodes auch mit übergeben werden müssen als selektierte Testfälle, selbst dann wenn der Parent kein Testfall ist sondern nur eine Test Klasse oder ein Dekorator.
Eine Sache wäre noch echt wünschenswert: Alle fehlgeschlagenen Testfälle sollten auf einen Schlag selektierbar sein und alle erfolgreichen Testfälle deselektiert.
DUnit löst das so:
Code: Alles auswählen
procedure TGUITestRunner.SelectFailedActionExecute(Sender: TObject);
var
i: integer;
ANode: TTreeNode;
begin
{ deselect all }
ApplyToTests(TestTree.Items[0], DisableTest);
{ select failed }
for i := 0 to FailureListView.Items.Count - 1 do
begin
ANode := TTreeNode(FailureListView.Items[i].Data);
SetNodeState(ANode, true);
end;
UpdateStatus(True);
end;
Wenn ich bei der Überarbeitung mithelfen kann, laß es mich bitte wissen.
Salut,
Mathias