PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Browserkomponente testen



joocom
25-06-2014, 11:22
Ich habe eine Browserkomponente, die als 'After-Hook' konzipiert ist (d.h. die sie wird um die eigentliche Methode herum ausgefuehrt):


/**
* Call a remote URL in execute after.
*/
class BrowseHook implements MethodHook {
private $user_id;
private $url;
private $params;
private $expectedResponse;
private $match = false;
/**
*/
public function __construct($user_id,$url,$params,$expected_respon se, $match = false) {
$this->user_id = $user_id;
$this->url = $url;
$this->params = $params;
$this->expectedResponse = trim($expected_response);
$this->match = $match;
if ($this->expectedResponse != '') {
$this->expectedResponse = explode('|', strtolower($this->expectedResponse));
} else {
$this->expectedResponse = false;
}
}

/**
*
* @param object $object Das Object auf dem der Backgroundjob erledigt werden soll.
* @param string $methodname Name der Methode die auf $object ausgefuehrt werden soll.
* @param array $params Parameter die an die Methode uebergeben wurden.
*/
public function executeBefore($object, $methodname, $params) {
return true;
}

/**
*
* @param object $object Das Object auf dem der Backgroundjob erledigt wurde.
* @param string $methodname Name der Methode, die auf $object ausgefuehrt wurde.
* @param array $params Parameter, die an die methode uebergeben wurden.
* @param $result Rueckgabewert der als Backgroundjob ausgefuehrten Methode.
*/
public function executeAfter($object, $methodname, $params, $result) {
$remote_url_params = ($this->params && $this->params != '') ? $this->params : array();
$cookieJar = tempnam(sys_get_temp_dir(), 'BrowseHook');
$browser = new Browser($cookieJar);
$result = $browser->Get($this->url, $remote_url_params);
if ($this->expectedResponse && count($this->expectedResponse) > 0) {
$result = trim(strtolower($result));
if (!$this->match) {
$result = in_array($result,$this->expectedResponse);
} else {
$result = array_reduce(
array_map(function($re) use ($result) {logDebug("Matching ~{$re}~");return preg_match("~{$re}~", $result);}, $this->expectedResponse),
function ($carry, $it) {return ($carry || $it);}, false);
}
} else {
$result = substr_compare($browser->http_code, "2", 0, 1);
}
return $result;
}
}

Interessant ist hier nur executeAfter(), ich teste die Methode mit einem Echo-Service (von scooterlabs, hier auf deutsch von mir vorgestellt (http://www.joocom.de/blog/ein-echo-wenn-man-es-braucht/)):


BrowseHook(Session::get('user_id'), 'http://scooterlabs.com/echo.json', array('test' => $testparam), "{\"test\":\"{$testparam}\"}", true);

Das ist ok fuer einen oberflaechlichen und manuellen Funktionstest. Aber wie kann ich das ganze automatisch, etwa mit travis-ci.org, und systematischer testen? -- da schwimmen mir grad ein wenig die Faelle weg...

dml
28-06-2014, 12:04
Also ich persönlich habe Probleme die Funktion executeAfter zu verstehen. Es sind zwar die Parameter schön beschrieben, aber ich weiß nicht was die Funktion tun soll. Hinzu ist das Objekt Browser nicht beschrieben, so weiß ich nicht was das Objekt tut.

joocom
09-07-2014, 16:10
Die Parameter existieren wegen des generischen Hook Aufbaus. executAfter wird ausgefuehrt, wenn $object->$methodName($params) ausgefuhert wurde; das ergebnis dieses aufrufs ist $result. Soweit das generische -- der BrowseHook nutzt diese Informationen nicht, sondern ruft die im constructor uebergebene URL auf und testet die http response auf gleichheit oder match mit $expectedResults -- die Broweserklasse wird separat getestet und sollte funktionieren. Hier teste ich, dass executeAfter allgmein funktioniert, nicht die integration in echte services/url/aufrufe. kein reiner unittest, aber auch kein integrationstest -- irgendwas dazwischen!?!?

dml
14-07-2014, 12:33
Also bei travis-ci.org kann ich Dir nicht helfen, da ich es nicht kenne. Zu systematischer kann ich sagen, Du hast eine Methode die beim Aufruf
von Methoden aufgerufen wird. Dann solltest du alle möglichenen Mehodenaufrufe durchführen und mit dem von Dir erwarteten Ergebnis vergleichen.
Das kannst Du manuell tun, oder Du schreibst Dir eine Funktion die die Metodenaufrufe und deren Ergebnisse z.B in eine Datei schreibt und wartest ab.