2012-12-20 6 views
5

Ich richte einige Browser-Tests mit SauceLabs ein. Ich war in der Lage, Tests lokal und über Sauce laufen zu lassen, also versuche ich jetzt, es mit meiner Jenkins-Installation zu integrieren, um Builds und Browser-Tests automatisch auszulösen.

Das meiste funktioniert alles, aber ich habe ein kleines Problem. Damit ich meine Tests lokal und über Sauce ausführen kann, möchte ich die statische Eigenschaft $ browsers während der Funktion phpUnit setup() festlegen, anstatt sie hart zu codieren. Dies scheint nicht möglich zu sein.

Ich bin mit der Wurst zu binden, sieht mein Testcase ziemlich ähnlich wie diese Demo: https://github.com/jlipps/sausage/blob/master/WebDriverDemo.php

ich in setUp versucht habe(), um den $ Browser Array zu aktualisieren, aber es scheint nie zu übernehmen. z.B.

Gibt es eine Möglichkeit, die Browserdetails von Jenkins zu übergeben, damit die Testfälle flexibler sind? Ich fühle mich, als würde ich etwas Einfaches hier vermissen?

+0

Jenkins verfügt über Parameter-Plugins, die Parameter übernehmen, wenn Sie einen Job auslösen. Wäre so etwas wie folgt: https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build dir helfen? –

+0

Ich habe keine Probleme die Params in den phpunit Testfall zu bekommen. Sobald sie da sind, scheint es zu spät, sie zu benutzen. –

Antwort

1

Ok, also habe ich das ausgearbeitet. Sollte jemand das gleiche Problem haben, so habe ich es so gelöst.

In dem ANT-Skript, das Jenkins ausführt, das wiederum PHPUnit ausführt, habe ich eine config.xml-Datei eingefügt. Dies setzt einen config (Umwelt) Variable sauce zu true

<phpunit> 
    <php> 
     <env name="sauce" value="true" /> 
    </php> 
</phpunit> 

Nun der Trick ist, aufgerufen, um nicht den $ Browser statisches Array zu verwenden, sondern stattdessen die setupSpecificBrowser Methode zu verwenden. Nun, in meiner setUp() - Funktion meiner Tests, schalte ich einfach die soce env-Variable ein und wenn es existiert, dann weiß ich, dass wir von Jenkins laufen und so benutze ich die mitgelieferten Variablen.

if(getenv('sauce') == true) { 
     $browser = array(
       'browserName' => getenv('SELENIUM_BROWSER'), 
       'desiredCapabilities' => array(
         'version' => getenv('SELENIUM_VERSION'), 
         'platform' => getenv('SELENIUM_PLATFORM'), 
       ) 
     ); 
    } else { 
     $browser = array(
       'browserName' => 'firefox', 
       'local' => true, 
       'sessionStrategy' => 'isolated' 
     ); 
    } 
    $this->setupSpecificBrowser($browser); 

AFAIK scheint es keine Dokumentation dafür zu geben, ich habe es nur aus dem Blick auf den Code gearbeitet. Spaß.

+0

Haben Sie mehrere Browser hinzugefügt? –

+0

Die automatische Benennung von Tests scheint auf diese Weise zu brechen. Alle Tests wurden "unbenannter Job" genannt. –

+0

Mit meiner Methode müssten Sie eine separate Jenkins Aufgabe pro Browser erstellen, die Sie testen wollten - da diese über das SauceOnDemand Plugin in Ant übergeben werden. Das heißt, die Benutzeroberfläche erlaubt es Ihnen, Browser mehrfach auszuwählen. Ich bin nicht sicher, wie Sie auf diese Werte zugreifen würden, wenn Sie das getan haben (apols Ich habe keine Zeit, um jetzt zu testen) –

0

Nur noch zu beachten, dass die Einstellung der Browser nach der Tatsache stoppt paralleles Testen. Wenn Sie zu Beginn drei verschiedene Browser haben (im statischen Browser von $ browsers) und den Browser auf chrome einstellen, dann haben Sie jetzt drei Computer, auf denen chrome ausgeführt wird.

5

Nachdem ich ziemlich viel Zeit mit der Suche verbracht habe, habe ich eine Lösung für das Szenario "Mehrere Browser" gefunden. Die Behauptungen von chapmatic bezüglich mehrerer Browser und der gegebenen Antwort waren in der Tat richtig: Es funktioniert nicht für paralleles Testen und führt denselben Browser mehrere Male aus, wenn Sie mehrere Browser in Ihrem $ browser-Array definiert haben. Die Lösung verwendet weiterhin Umgebungsvariablen, aber Sie müssen weiterhin Ihr $ browser-Array verwenden.

Stellen Sie zuerst sicher, dass Sie Ihr $ browsers-Array in Ihrer abstrakten Testklasse definiert haben. Nehmen wir an, Sie definieren den env var BROWSER und weisen ihm den Browser zu, den Sie testen möchten. Sie können die folgende statische Funktion in der abstrakten Testklasse eingerichtet, die Sauce \ Wurst \ WebDriverTestCase erweitert:

public static function browserSetup() 
    { 
     switch (getenv('BROWSER')) { 
      case 'firefox': 
       self::$browsers = array(
        array(
         'browserName' => 'firefox', 
         'desiredCapabilities' => array(
          'platform' => 'self::WIN_VERSION', 
          'version' => self::FIREFOX_VERSION, 
         ) 
        ) 
       ); 
       break; 

      case 'safari': 
       //safari desiredCapabilities 
       break; 

      case 'explorer': 
       //ie desiredCapabilities 
       break; 

      case 'chrome': 
      //chrome desiredCapabilities 

      default: //This will just use the default $browsers array you defined 
     return; 
    } 

Nun, da browserSetup() definiert ist, müssen Sie sicherstellen, dass es aufgerufen wird, bevor die Testsuite gesetzt auf, so dass die Tests nur für den Browser ausgeführt werden, den Sie in Ihrer BROWSER-Umgebungsvariablen angegeben haben.Schauen wir uns PHPUnit_Extensions_Selenium2TestCase an, das von Sauce \ Sausage \ WebDriverTestCase ausgegeben wird; PHPUnit_Extensions_Selenium2TestCase definiert die folgende Methode:

public static function suite($className) 
{ 
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className); 
} 

Diese Methode wird aufgerufen, die Testsuite mit allen Browsern einrichten Sie in $ Browser Array angegeben, so dass Sie diese Methode in der abstrakten Testklasse außer Kraft setzen müssen, um sicherzustellen, browserSetup() vor fromTestCaseClass() aufrufen heißt:

public static function suite($className) 
{ 
    self::browserSetup(); 
    return PHPUnit_Extensions_SeleniumTestSuite::fromTestCaseClass($className); 
} 

Nun, wenn Sie die Umgebungsvariable BROWSER mit dem Browser, den Sie testen wollen definieren, können Sie Ihre Test-Suite beginnen und Ihre Array $ Browser sein Überschreiben Sie die Einstellungen, die Sie für den in Ihrem BROWSER enviro definierten Browser festgelegt haben Variable. Stellen Sie sicher, dass jenkins diese Umgebungsvariable im Abschnitt "Build-> Execute shell" richtig setzt, und Sie können loslegen.

+0

Diese Lösung sieht etwas vielversprechend aus.Warum nicht browsergroups wie - 'local', 'soße', –

+0

Das funktioniert auch, wenn Sie 'PHPUnit_Extensions_SeleniumTestCase' als Ihre Basisklasse verwenden. – Kryten