2017-11-28 3 views
0

Ich habe eine Handvoll Komponententests erstellt, von denen einer testen muss, dass eine Ausnahme ausgelöst wird, nachdem eine Reihe von illegalen Aktivitäten stattgefunden hat. Dies ist ein Satz von Hilfscodes, so dass erwartet wird, dass zu irgendeinem Zeitpunkt in der Zukunft ungültige/ungültige Werte von irgendeinem Programmierer eingegeben werden.Gibt es eine Möglichkeit, das Auslösen einer Ausnahme in einem Ada-Unit-Test zu testen?

Ich sah this question, die das Ada-Unit-Test-Framework verwendet - in der gegenwärtigen Situation ist das keine Option; Ich kann sie jedoch neu bearbeiten, um sie verwenden zu können (mein Verständnis ist, dass das Hinzufügen von Komponententestprojekten zu einer vorhandenen Legacy-Codebasis ein zeitaufwändiger Prozess ist).

Also- was sollte ich in den Körper dieser Funktion so füllen, dass es nur wahr zurückgibt, wenn mehrere Ausnahmen auftreten?

--* 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; 

Antwort

2

Dies ist eine funktionierende Demo mit mehreren Testfällen in einer Verifikationsfunktion. Ich könnte es vorziehen, jedem Test ein eigenes Testverfahren zu geben.

Die Idee ist, dass Testfälle 5 und 6 Constraint_Error erhöhen sollen, und andere nicht.

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; 

Die Spezifikation des Verfahrens im Test:

procedure Exception_Capable_Test (Test_Case : Positive); 

und sein Körper:

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; 

Dies funktioniert (prints Verify passed) mit GCC 6.1.0, 7.1.0 und GNAT GPL 2016, 7.

+0

Ich schätze deine Zeit - ich werde dies in meinen Code einfügen und sehen, ob ich den Compiler damit zufriedenstellen kann. – theMayer

4
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; 
+0

Zwei Probleme hätte ich mit diesem appr oach-Ich kann es nur für einen Fehler zu einer Zeit (vielleicht ist das eine grundlegende Einschränkung?), und ich habe keine "Ahven.Fail" in meinen Quellen. – theMayer

+0

Die 'begin ... exception..end;' Blöcke können geschachtelt werden, vertauschen Sie die 'null;' für einen weiteren Block, wo Sie Ihren nächsten Testfall hinzufügen – egilhh

+0

'Ahven.Fail' ist eine der Reporting-Routinen in der Ahven-Test-Framework. Es wird eine Ausnahme ausgelöst, die vom Testläufer erfasst und als fehlgeschlagener Test registriert wird. - Sie können angeben, was Sie verwenden, um einen fehlgeschlagenen Test dort zu melden. –

0

So- was ich tun gelandet war eine Kombination von Jakobs Antwort und einigen Kommentaren. Es stellt sich heraus, dass die Ausnahme beginnen kann .. Ende kann verschachtelt werden (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; 
+3

Ich sehe nicht, warum du das verschachtelt hast (Masochismus, vielleicht ?! Was passiert, wenn es 3 Fälle gibt? 4? 10?) Du könntest mehrere aufeinanderfolgende Blöcke wie den zweiten verwenden, jedes mit 'when Constraint_Error => null, dann gib am Ende "True" zurück. –

+0

Ich habe versucht, das zu tun, aber es gab mir einen Compilerfehler (es sagte eine Ausnahme kann hier nicht verwendet werden oder so). Vielleicht könntest du mir zeigen, was ich falsch gemacht habe? Ada ist sehr empfindlich. – theMayer

+0

Das sollte wohl eine neue Frage sein. Aber ich stimme Simon zu, dass es in diesem Fall nicht notwendig sein sollte, die Ausnahmebehandlungsblöcke zu verschachteln. –

Verwandte Themen