2017-01-20 3 views
3

Ich bin ziemlich neu in Codeception und ich bin auf ein Problem gestoßen, das ich nicht herausfinden kann. Ich habe ungefähr 40 Tests in meiner Testsuite, und wenn ein Test fehlschlägt, muss ich eine E-Mail mit dem Grund senden, warum sie fehlgeschlagen ist. Zum Beispiel, wenn Codeception kein Element auf der Seite, was zu einem fehlgeschlagenen Test finden, muss ich nur mit dem Fehler E-Mail senden, wie folgt aus:Logging Codeception Fehler

konnte nicht verifizieren Suchliste E-Mail wie in ThisClass erwartet verhält: : thisTest (/home/qauser/codeception_tests///acceptance-mobile/Wishlist/EmailWishlistCest.php) Konnte "Erfolg!", "// * [@ id =" wish-list-confirm-popup "] nicht sehen/div/div/div [1]/h4 ":

Ich möchte nicht die vollständige Stack-Trace senden, nur den tatsächlichen Fehler. Weiß jemand, ob das möglich ist?

Antwort

4

Codeception macht eine nützliche Sammlung von Ereignissen verfügbar, die sich für diesen Anwendungsfall als nützlich erweisen werden. Werfen Sie einen Blick auf den Abschnitt Customization: Events der Dokumentation von Codeception für weitere Informationen.

Ich würde empfehlen, zwei der auf dieser Seite beschriebenen Ereignisse abfängt:

  • Die test.fail Ereignis, fehlgeschlagenen Test Informationen zu den einzelnen zu aggregieren.
  • Das Ereignis test.fail.print verarbeitet die aggregierten Daten (z. B. durch Senden einer Zusammenfassungs-E-Mail), wenn Codeception die Testsuite abgeschlossen hat, und druckt eine eigene Zusammenfassung der Fehler auf dem Bildschirm aus.

Um dies zu erreichen, müssen Sie einfach eine eigene Event-Handler-Klasse bauen und es als eine Erweiterung in der Config-Datei registrieren:

# codeception.yml 
extensions: 
    enabled: [MyCustomEventHandler] 

# MyCustomEventHandler.php 
<?php 
// Note: this was drafted using Codeception 2.0. Some of the namespaces 
// maybe different if you're using a more-recent version of Codeception. 
class MyCustomEventHandler extends \Codeception\Platform\Extension 
{ 
    /** 
    * @var \Exception[] 
    */ 
    protected $testFailures = []; 

    /** 
    * Maps Codeception events to method names in this class. 
    * 
    * Defining an event/method pair in this array essentially subscribes 
    * the method as a listener for its corresponding event. 
    * 
    * @var array 
    */ 
    public static $events = [ 
     \Codeception\Events::TEST_FAIL  => 'singleTestJustFailed', 
     \Codeception\Events::TEST_FAIL_PRINT => 'allTestFailuresAreBeingDisplayed', 
    ]; 

    /** 
    * This method will automatically be invoked by Codeception when a test fails. 
    * 
    * @param \Codeception\Event\FailEvent $event 
    */ 
    public function singleTestJustFailed(\Codeception\Event\FailEvent $event) 
    { 
     // Here we build a list of all the failures. They'll be consumed further downstream. 
     $this->testFailures[] = $event->getFail(); 
    } 

    /** 
    * This method will automatically be invoked by Codeception when it displays 
    * a summary of all the test failures at the end of the test suite. 
    */ 
    public function allTestFailuresAreBeingDisplayed() 
    { 
     // Build the email. 
     $emailBody = ''; 
     foreach ($this->testFailures as $failure) { 
      // Methods in scope include: $failure->getMessage(), $failure->getFile(), etc. 
      $emailBody .= $failure->getMessage() . "\r\n"; 
     } 

     // Now send the email! 
    } 
} 

hoffe, das hilft!

+0

Btw, dieser Vorschlag geht davon aus, dass Sie nur eine Digest-E-Mail am Ende der Testsuite senden möchten und nicht eine einzelne E-Mail für jeden fehlgeschlagenen Test. Wenn diese Annahme ungültig ist, wird die Lösung noch einfacher, da Sie das Ereignis "Codeception \ Events :: TEST_FAIL_PRINT" nicht abfangen müssen – Nate