有没有办法测试在Ada单元测试中抛出异常?

时间:2017-11-28 18:36:18

标签: unit-testing ada

我创建了一些单元测试,其中一个需要测试在发生一系列非法活动后抛出异常。这是一组实用程序代码,因此预计将来某些程序员会输入无效/非法值。

我看到this question使用了Ada单元测试框架 - 在目前的情况下,这不是一个选项;但是,我可以重新使用它们以便能够使用它(我的理解是将单元测试项目添加到现有的遗留代码库是一个耗时的过程)。

那么 - 我应该填写这个函数的主体,以便只有在遇到多个异常时才返回true?

--* 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 个答案:

答案 0 :(得分:5)

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;

答案 1 :(得分:2)

这是一个工作演示,在一个验证功能中包含多个测试用例。我可能更愿意为每个测试提供自己的测试程序。

这个想法是测试用例5和6应该引发Constraint_Error,而其他则不是。{/ p>

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;

测试程序的规格:

procedure Exception_Capable_Test (Test_Case : Positive);

及其身体:

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;

这适用于(打印Verify passed)GCC 6.1.0,7.1.0和GNAT GPL 2016,7。

答案 2 :(得分:0)

所以我最终做的是雅各布的回答和一些评论的结合。事实证明异常开始..结束可以嵌套(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;