J'ai créé une poignée de tests unitaires, dont l'un doit tester qu'une exception est levée après une série d'activités illégales. Il s'agit d'un ensemble de codes utilitaires, donc on s'attend à ce que des valeurs invalides / illégales soient entrées par un programmeur à un moment donné dans le futur.
J'ai vu cette question qui utilise le framework de test unitaire Ada - dans le situation actuelle, ce n’est pas une option; cependant, je peux les retravailler pour pouvoir l'utiliser (je crois comprendre que l'ajout de projets de test unitaire à une base de code héritée existante est un processus qui prend du temps).
Alors, que dois-je remplir dans le corps de cette fonction pour qu'elle ne renvoie true que si plusieurs exceptions sont rencontrées?
--* Returns true if an exception is yielded for test cases 5 and 6
function VerifyInvalidValuesCauseExceptions return Boolean is
begin
--Run tests for 5 and 6, assert that exception is thrown for each
--Not exactly sure how to do this yet
return false;
end;
3 réponses
Il s'agit d'une démonstration fonctionnelle avec plusieurs cas de test dans une fonction de vérification. Je préférerais peut-être donner à chaque test sa propre procédure de test.
L'idée est que les cas de test 5 et 6 sont censés déclencher Constraint_Error
, et d'autres non.
with Exception_Capable_Test;
with Ada.Text_IO;
procedure Verify_Exception_Tests is
function Verify return Boolean is
begin
begin
Exception_Capable_Test (4);
exception
when Constraint_Error =>
return False;
end;
begin
Exception_Capable_Test (5);
return False;
exception
when Constraint_Error =>
null;
end;
begin
Exception_Capable_Test (6);
return False;
exception
when Constraint_Error =>
null;
end;
begin
Exception_Capable_Test (7);
exception
when Constraint_Error =>
return False;
end;
return True;
end Verify;
begin
Ada.Text_IO.Put_Line
("Verify " & (if Verify then "passed" else "failed"));
end Verify_Exception_Tests;
La spécification de la procédure sous test:
procedure Exception_Capable_Test (Test_Case : Positive);
Et son corps:
procedure Exception_Capable_Test (Test_Case : Positive) is
begin
case Test_Case is
when 5 | 6 =>
raise Constraint_Error with "failed with case" & Test_Case’Img;
when others =>
null;
end case;
end Exception_Capable_Test;
Cela fonctionne (imprime Verify passed
) avec GCC 6.1.0, 7.1.0 et GNAT GPL 2016, 7.
Donc, ce que j'ai fini par faire était une combinaison de la réponse de Jacob et de quelques commentaires. Il s'avère que l'exception begin .. end peut être imbriquée (yikes!).
-- Returns true if an exception is yielded for test cases 5 and 6
function Verify_Invalid_Values_Cause_Exceptions return Boolean is
begin
Case_5 :
declare
Test_Output : Data_Type;
begin
-- Run conversions, assert that exception is thrown for each
Test_Output := Function_That_Throws_Exception (Test_Case_5);
return False; -- Should not get here
exception
when Constraint_Error =>
null; -- Should get here
end Case_5;
Case_6 :
declare
Test_Output : Data_Type;
begin
-- Run conversions, assert that exception is thrown for each
Test_Output := Function_That_Throws_Exception (Test_Case_6);
return False; -- Should not get here
exception
when Constraint_Error =>
null; -- Should get here
end Case_6;
return True;
end Verify_Invalid_Values_Cause_Exceptions;
Raising_An_Exception :
begin
Should_Raise_A_Constraint_Error;
Ahven.Fail (Message => "Exception not raised as expected.");
exception
when Constraint_Error =>
null;
end Raising_An_Exception;
Questions connexes
De nouvelles questions
unit-testing
Les tests unitaires sont une méthode par laquelle des unités individuelles de code source sont testées pour déterminer si elles sont aptes à l'utilisation.