unitarias unitaria tutorial software pruebas prueba español ejemplos ejemplo con casos unit-testing delphi dunitx

unit testing - unitaria - ¿Puedo pasar un conjunto a un caso de prueba en DUnitX?



pruebas unitarias java eclipse (2)

Agregue esta función de conversión a DUnitX.Utils y DUnitX.Utils en la matriz de Conversiones para tkUString a tkSet (debido a las limitaciones de StringToSet y TValue esto solo funciona para conjuntos de hasta 32 elementos, para conjuntos más grandes de hasta 256 elementos, se necesita más código). aunque):

function ConvStr2Set(const ASource: TValue; ATarget: PTypeInfo; out AResult: TValue): Boolean; begin TValue.Make(StringToSet(ATarget, ASource.AsString), ATarget, AResult); Result := True; end;

También necesita usar un separador de caracteres diferente para los parámetros o los dividirá incorrectamente:

[TestCase(''Demo1'',''InputA;[resWarn,resError]'', '';'')]

Estoy tratando de verificar el estado de un objeto después de ejecutar una prueba. Este estado está contenido en un conjunto. ¿Es posible pasar el estado esperado al caso de prueba usando los atributos DUnitX, de modo que pueda usar la misma prueba para todas las diferentes entradas?

Traté de pasar el conjunto como una constante o como un conjunto, pero en mi rutina de prueba siempre llega como un conjunto vacío.

  • ¿Es esto posible usando atributos?
  • ¿Cómo probarías si los conjuntos son idénticos?

Código de ejemplo:

type TResult = (resOK,resWarn,resError); TResultSet = set of TResult; const cErrWarn : TResultSet = [resWarn]; type [TestFixture] TMyTest = class(TBaseTest) [Test] [TestCase(''Demo1'',''InputA,[resWarn]'')] // <-- tried as a set [TestCase(''Demo2'',''InputB,cErrWarn'')] // <-- tried as a constant procedure Test(Input:string; ExpectedResult: TResultSet); end; procedure TMyTest.Test(Input:string; ExpectedResult: TResultSet); begin // ExpectedResult is always the empty set [] RunTests(MyObject(Input)); Assert.AreEqual(ExpectedResult, MyObject.ResultSet); end;

También traté de definir el resultado esperado como una matriz, pero luego DUnitX ya no convoca la prueba. Probablemente es solo "demasiado"

procedure Test(Input:string; ExpectedResult: array of TResult);

Lo mejor que pude llegar hasta ahora fue usar el siguiente enfoque. Tome una muestra de hasta tres (inserte su entero favorito aquí ...) los estados esperados y verifique estos por separado. Esto no es realmente lo que esperaba, pero funciona.

procedure Test(Input:string; R1,R2,R3: TResult);

La ayuda es muy apreciada. :)


Está utilizando TestCaseAttribute para especificar los argumentos que se pasarán a su método de prueba. Sin embargo, simplemente no ofrece ningún soporte para pasar conjuntos como argumentos. Puede ver que esto es así al observar las Conversions constantes declaradas en la unidad DUnitX.Utils . ConvFail cualquier conversión a un conjunto a ConvFail .

Entonces, si desea especificar estos datos utilizando atributos, necesitará ampliar el marco de prueba. Puede derivar su propio descendiente de CustomTestCaseSourceAttribute y anular GetCaseInfoArray para descodificar los argumentos del conjunto. Como ejemplo crudo, podrías usar esto:

type MyTestCaseAttribute = class(CustomTestCaseSourceAttribute) private FCaseInfo: TestCaseInfoArray; protected function GetCaseInfoArray: TestCaseInfoArray; override; public constructor Create(const ACaseName: string; const AInput: string; const AExpectedResult: TResultSet); end; constructor MyTestCaseAttribute.Create(const ACaseName, AInput: string; const AExpectedResult: TResultSet); begin inherited Create; SetLength(FCaseInfo, 1); FCaseInfo[0].Name := ACaseName; SetLength(FCaseInfo[0].Values, 2); FCaseInfo[0].Values[0] := TValue.From<string>(AInput); FCaseInfo[0].Values[1] := TValue.From<TResultSet>(AExpectedResult); end; function MyTestCaseAttribute.GetCaseInfoArray: TestCaseInfoArray; begin Result := FCaseInfo; end;

A continuación, puede agregar el siguiente atributo a su método de prueba:

[MyTestCase(''Demo2'', ''InputB'', [resWarn])] procedure Test(Input: string; ExpectedResult: TResultSet);

He evitado usar RTTI aquí por simplicidad, pero usar RTTI le daría más flexibilidad. Pasa el argumento como una cadena y lo decodifica con RTTI, tal como lo hace el código en DUnitX. Esto significa que no necesita escribir atributos personalizados cada vez que quiera usar un argumento establecido.

Aún mejor sería implementar esto dentro de DUnitX extendiendo el mapa de Conversions a conjuntos de portadas, y enviarlo como un parche. Estoy seguro de que otros lo encontrarían útil.