2016-08-05 5 views
0

Ich möchte einige meiner Testfälle mit KnownFault annotieren - was ziemlich genau das tut, was expectedException erwartet, und etwas Magie mit YouTracks REST-API. Ich möchte auch ein IntermittentFailure-Attribut haben, was bedeuten würde, dass mir bewusst ist, dass der Test gelegentlich mit [exception] [message] fehlschlägt, aber ich möchte nicht, dass dies den Rest meiner Build-Kette blockiert.testng - Erstellen von KnownFault- und IntermittentFailure-Annotationen

Nach einigen Recherchen habe ich, dass meine Testklasse gefunden IHookable implementieren sollte, dann könnte ich so etwas wie dieses:

@Override 
public void run(IHookCallBack callBack, ITestResult result) { 
    callBack.runTestMethod(result); 
    if (result.getThrowable().getCause() instanceof IllegalArgumentException){ 
     System.out.println("This is expected."); 
     result.setThrowable(null); 
    } 
    else{ 
     System.out.println("Unexpected exception"); 
    } 
} 

Das Problem dabei ist, die tatsächliche Umsetzung von invokeHookable:

final Throwable[] error = new Throwable[1]; 

IHookCallBack callback = new IHookCallBack() { 
    @Override 
    public void runTestMethod(ITestResult tr) { 
    try { 
     invokeMethod(thisMethod, testInstance, parameters); 
    } catch (Throwable t) { 
     error[0] = t; 
     tr.setThrowable(t); // make Throwable available to IHookable 
    } 
    } 

    @Override 
    public Object[] getParameters() { 
    return parameters; 
    } 
}; 
hookable.run(callback, testResult); 
if (error[0] != null) { 
    throw error[0]; 
} 

Leider bedeutet diese letzte Zeile, dass mein Testfall eine Exception auslösen wird, egal wie das error-Array in der run-Methode komplett aus meiner Hand ist.

Also, was wäre der richtige Weg, eine Ausnahme abzufangen und so zu behandeln, wie ich es möchte?

Antwort

1

Was Sie versuchen, ist wirklich interessant. Sie sollten versuchen, Änderungen an https://github.com/cbeust/testng/pull/

vorzuschlagen. Aber vielleicht ist IHookable nicht der beste Listener, den Sie verwenden können. Haben Sie versucht, IInvokedMethodListener?

void afterInvocation(IInvokedMethod method, ITestResult result) { 
    if (result.getThrowable().getCause() instanceof IllegalArgumentException) { 
     System.out.println("This is expected."); 
     result.setThrowable(null); 
     result.setStatus(SUCCESS); // If you want to change the status 
    } else { 
     System.out.println("Unexpected exception"); 
    } 
} 
+0

Cool, das hat funktioniert. Daher muss die Basisklasse leicht modifiziert werden, wenn ein Listener verwendet wird: Ich habe eine Klasse namens 'TestListener' hinzugefügt, die Ihre vorgeschlagene Implementierung ausführt, dann muss ich die Basisklasse der Tests mit' @Listeners (TestListener.class) 'annotieren . Lief wie am Schnürchen! – RekaB

+0

Oder Sie können einen anderen Listener-Erkennungsmechanismus verwenden, wenn Sie http://testng.org/doc/documentation-main.html#testng-listeners bevorzugen – juherr

Verwandte Themen