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
- 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.)
- 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ę?
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.
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ę.
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