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;
0
theMayer 28 nov. 2017 à 21:36

3 réponses

Meilleure réponse

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.

2
Simon Wright 29 nov. 2017 à 09:19

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;
0
Jacob Sparre Andersen 29 nov. 2017 à 12:27
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;
5
Jacob Sparre Andersen 28 nov. 2017 à 18:43
47538650