Frage

Die Art und Weise DUnit normalerweise funktioniert, ist, Sie einige veröffentlichten Methoden schreiben und DUnit läuft sie als Tests. Was ich tun möchte, ist ein wenig anders. Ich will Tests zur Laufzeit auf Daten basieren. Ich versuche, ein bestimmtes Modul zu testen, die Eingabedateien verarbeitet, um Ausgabedateien erstellt. Ich habe eine Reihe von Testeingabedateien mit entsprechenden bekannten guten Ausgabedateien. Die Idee ist, dynamisch Tests zu erstellen, eine für jede Eingabedatei, die die Eingänge und überprüfen Sie die Ausgänge gegen die bekannten guten verarbeiten.

Die eigentliche Datenquelle hier jedoch nicht wichtig. Die Schwierigkeit macht DUnit in einer datengesteuerten Art und Weise verhalten. Im Interesse dieses Problems annimmt, dass die Datenquelle nur ein Zufallszahlengenerator war. Hier ist ein Beispiel konkretes Problem, das in das Herz der Schwierigkeit wird:

Erstellen Sie einige Testobjekte (TTestCase oder was auch immer) zur Laufzeit, sagen wir 10 von ihnen, wo jeder

  1. wird zur Laufzeit von einer zufällig erzeugten ganzen Zahl benannt. (Unter ‚Namen‘ meine ich den Namen des Tests, die in dem Testläufer Baum gelingt.)
  2. besteht oder nicht auf einer Zufallszahl basiert. Pass für selbst, nicht für ungerade.

Von der Gestaltung von DUnit, es sieht wie es mit genügend Flexibilität entwickelt wurde, um solche Dinge möglich zu machen. Ich bin nicht sicher, dass es aber ist. Ich habe versucht, meine eigenen Testklasse zu erstellen, indem Sie aus TAbstractTest vererben und ITest, aber einige wichtige Methoden nicht zugänglich waren. Ich habe auch versucht, aus TTestCase erben, aber die Klasse ist eng mit der Idee der veröffentlichten Verfahren läuft (und die Tests nach den Methoden genannt werden, so konnte ich nicht nur ein einziges genannt haben, sagen wir, ‚gehen‘, weil dann alle meine Tests ‚go‘ genannt werden würde, und ich möchte alle meine Tests einzeln genannt) werden.

oder alternativ gibt es eine Alternative zu DUnit das tun konnte, was ich will?

War es hilfreich?

Lösung

program UnitTest1;

{$IFDEF CONSOLE_TESTRUNNER}
{$APPTYPE CONSOLE}
{$ENDIF}

uses
  Forms, Classes, SysUtils,
  TestFramework,
  GUITestRunner,
  TextTestRunner;

{$R *.RES}

type
  TIntTestCase = class(TTestCase)
  private
    FValue: Integer;
  public
    constructor Create(AValue: Integer); reintroduce;
    function GetName: string; override;
  published
    procedure Run;
  end;

{ TIntTestCase }

constructor TIntTestCase.Create(AValue: Integer);
begin
  inherited Create('Run');
  FValue := AValue;
end;

function TIntTestCase.GetName: string;
begin
  Result := Format('Run_%.3d', [FValue]);
end;

procedure TIntTestCase.Run;
begin
  Check(FValue mod 2 = 0, Format('%d is not an even value', [FValue]));
end;

procedure RegisterTests;
const
  TestCount = 10;
  ValueHigh = 1000;
var
  I: Integer;
begin
  Randomize;
  for I := 0 to TestCount - 1 do
    RegisterTest(TIntTestCase.Create(Random(ValueHigh) + 1));
end;

begin
  Application.Initialize;
  RegisterTests;
  if IsConsole then
    TextTestRunner.RunRegisteredTests
  else
    GUITestRunner.RunRegisteredTests;
end.

Andere Tipps

Ich würde sagen, Sie im Grunde eine einzige „Super-Test“ Funktion haben wollen, die dann andere Tests nennen, eine für jede Datendatei. Dies ist, was wir mit einem unserer DUnit-Tests tun. Sie laden nur jede verfügbare Datei wiederum in einer Schleife, und führen Sie den Test mit Check entsprechend.

Die Alternative, die wir auch im selben Projekt verwenden, um die endgültige App und seine Daten Laden und Analyse zu testen, ist auf die Anwendung so etwas wie Finalbuilder in einer Schleife verwenden (vermutlich konnte man Schleife auf der DUnit App zu und verwenden Parameter) mit den verschiedenen Datendateien. Die App läuft dann, tut eine Analyse, beendet dann nach dem Speichern. Eine weitere App vergleicht dann die resultierenden Daten mit den idealen Daten und meldet einen Fehler, wenn angemessen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top