Pregunta

La forma DUnit funciona normalmente es de escribir algunos métodos publicados, y DUnit los ejecuta como pruebas. Lo que quiero hacer es un poco diferente. Quiero crear pruebas en tiempo de ejecución en base a los datos. Estoy intentando probar un determinado módulo que procesa archivos de entrada para crea archivos de salida. Tengo un conjunto de archivos de entrada de prueba con los archivos de salida buenos conocidos correspondientes. La idea es crear dinámicamente pruebas, una para cada archivo de entrada, que procesan las entradas y comprobar las salidas contra los buenos conocidos.

La fuente real de los datos aquí, sin embargo no es importante. La dificultad está haciendo DUnit se comportan de una manera controlada por datos. Por el bien de este problema, supongamos que la fuente de datos eran sólo un generador de números aleatorios. Este es un ejemplo de problemas concretos que llega al corazón de la dificultad:

Cree algunos objetos de prueba (TTestCase o lo que sea) en tiempo de ejecución, por ejemplo, 10 de ellos, donde cada uno

  1. Se nombra en tiempo de ejecución de un número entero generado aleatoriamente. (Por 'nombre' quiero decir el nombre de la prueba que aparece en el árbol de prueba-corredor.)
  2. pasa o no basado en un entero aleatorio. Pasar incluso, fallar por extraño.

Desde el diseño de DUnit, que ve que fue diseñado con la suficiente flexibilidad en mente para hacer este tipo de cosas posible. No estoy seguro de que se trata sin embargo. Intenté crear mi propia clase de prueba heredando de TAbstractTest y ITest, pero algunos métodos cruciales no eran accesibles. También he intentado heredando de TTestCase, pero esa clase está estrechamente ligada a la idea de correr métodos publicados (y las pruebas llevan el nombre de los métodos, así que no podía simplemente tener una sola llamada, digamos, 'ir', porque entonces todas mis pruebas serían llamados 'ir', y yo quiero todas mis pruebas para ser nombrados individualmente).

O, alternativamente, ¿hay alguna alternativa a DUnit que podría hacer lo que quiero?

¿Fue útil?

Solución

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.

Otros consejos

Yo diría que básicamente quiere tener una sola función "prueba super" que luego llama a las otras pruebas, una para cada archivo de datos. Esto es lo que hacemos con una de nuestras pruebas DUnit. Usted sólo tiene que cargar cada archivo disponible a su vez en un bucle, y ejecuta la prueba con la de Comprobar según el caso.

La alternativa, que también se utiliza en el mismo proyecto para probar la aplicación final y su carga y análisis de datos, es usar algo como FinalBuilder de bucle en la aplicación (es de suponer que podía bucle en la aplicación DUnit también y utilizar una parámetro) con los distintos archivos de datos diferentes. La aplicación se ejecuta a continuación, hace un análisis, a continuación, sale después de guardar. Otra aplicación compara entonces los datos resultantes con los datos ideales, e informa de un fallo si es apropiado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top