Testowanie DUnit oparte na danych

Sposób, w jaki DUnit normalnie działa, polega na tym, że piszesz niektóre opublikowane metody, a DUnit uruchamia je jako testy. To, co chcę zrobić, jest trochę inne. Chcę tworzyć testy w czasie wykonywania na podstawie danych. Próbuję przetestować konkretny moduł, który przetwarza pliki wejściowe i tworzy pliki wyjściowe. Mam zestaw testowych plików wejściowych z odpowiednimi znanymi dobrymi plikami wyjściowymi. Chodzi o dynamiczne tworzenie testów, po jednym dla każdego pliku wejściowego, które przetwarzają wejścia i sprawdzają wyjścia pod kątem znanego dobra jeden.

Rzeczywiste źródło danych tutaj jednak nie jest ważne. Trudność polega na tym, że DUnit zachowuje się w sposób oparty na danych. Ze względu na ten problem, Załóżmy, że źródłem danych był po prostu generator liczb losowych. Oto przykładowy konkretny problem, który trafia do sedna trudności:

Utwórz kilka obiektów testowych (TTestCase lub cokolwiek innego) w czasie wykonywania, powiedzmy 10 z nich, gdzie każdy z nich

  1. jest nazwany w czasie wykonywania od losowo wygenerowanej liczby całkowitej. (Przez 'imię' I oznacza nazwę testu, która pojawia się w drzewie Test-runner.)
  2. przechodzi lub nie na podstawie losowej liczby całkowitej. Pass za parzyste, fail za nieparzyste.

Z projektu DUnit, wygląda jakby został zaprojektowany z myślą o wystarczającej elastyczności, aby takie rzeczy były możliwe. Nie jestem pewien, czy to prawda. Próbowałem stworzyć własną klasę testową dziedzicząc z TAbstractTest i ITest, ale niektóre kluczowe metody nie były dostępne. Próbowałem też dziedziczyć z TTestCase, ale ta klasa jest ściśle związana z ideą uruchamiania opublikowanych metod (a testy są nazwane po metodach, więc nie mogę mieć TYLKO JEDNEJ o nazwie, powiedzmy 'go', ponieważ wtedy wszystkie moje testy będą nazywane 'go' i chcę, aby wszystkie moje testy były indywidualnie nazwane).

A może jest jakaś alternatywa dla Dunita, która mogłaby zrobić to, co ja chcę?

Author: dan-gph, 2009-04-01

2 answers

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.
 18
Author: Ondrej Kelle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-01 11:58:03

Powiedziałbym, że w zasadzie chcesz mieć jedną funkcję "super-test", która następnie wywołuje inne testy, po jednej dla każdego pliku danych. To właśnie robimy z jednym z naszych testów DUnit. Po prostu ładujesz każdy dostępny plik po kolei w pętli i uruchamiasz test z czekami odpowiednio.

Alternatywą, której używamy również w tym samym projekcie do testowania ostatecznej aplikacji i jej ładowania i analizy danych, jest użycie czegoś takiego jak FinalBuilder do pętli na aplikacji (prawdopodobnie można pętli na DUnit aplikacji też i użyć parametru) z różnych różnych plików danych. Następnie aplikacja uruchamia się, wykonuje analizę, a następnie zamyka się po zapisaniu. Następnie inna aplikacja porównuje dane wynikowe z danymi idealnymi i w razie potrzeby zgłasza awarię.

 2
Author: mj2008,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-01 11:47:53