oder wie immer sich das nennt, geht das irgendwie?
Ich will eine Klasse mit statische Methoden testen die von nichts erbt, intern aber einen \Environment::get(..) beinhaltet. Das würde ich gern mit testen.
oder wie immer sich das nennt, geht das irgendwie?
Ich will eine Klasse mit statische Methoden testen die von nichts erbt, intern aber einen \Environment::get(..) beinhaltet. Das würde ich gern mit testen.
Grüße, BugBuster"view source" is your guide.Danke an alle Amazon Wunschlisten Erfüller
Alle Sachen die ich bisher gefunden habe, basieren auf "staticExpects" und das gibt es leider ab PHPUnit 4.1 nicht mehr.
Sebastian Bergmann meint dazu: Die vorgeschlagene Alternative besteht darin, statische Methoden nicht verwenden.
Meine schräge Idee im Kopf will ich nicht umsetzen, ich suche daher weiter.
Das einfachste wäre ein Refactoring, wäre aber noch ein API Break. Aber was solls, einer mehr, ist eh ne neue Major Release die ich in der Mache habe, da ist das ja erlaubt.
Geändert von BugBuster (20.07.2015 um 22:26 Uhr)
Grüße, BugBuster"view source" is your guide.Danke an alle Amazon Wunschlisten Erfüller
TL;DR: Static methods are not testable!
Du solltest keine statischen Methoden mit side effects haben, da kannst du keine DI betreiben und auch nicht sauber mocken.
In Contao 4 haben wir hierzu nun Adapter geschaffen, welche die Contao 3 statischen Dinge wegabstrahieren und somit wieder testbar machen.
Was hast du denn fyr einen konkreten Usecase?
Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.
Ich will in einer meiner Methoden den UserAgent untersuchen (Bot:ja/nein)
Dazu lasse ich mir den UserAgent vom Framework geben, falls dieser beim Aufruf nicht mit übergeben wird.
Mal der Anfang:
Die Frontend Modul Klasse ruft diese bisher so aufPHP-Code:
class CheckBotAgentSimple
{
public static function checkAgent($UserAgent=false)
{
// Check if user agent present
if ($UserAgent === false)
{
if (\Environment::get('httpUserAgent'))
{
$UserAgent = trim(\Environment::get('httpUserAgent'));
}
else
{
return false; // No user agent, no search.
}
}
.....hier suche ich dann....
}
}
Ich könnte natürlich den Aufruf so machen:PHP-Code:
$return = CheckBotAgentSimple::checkAgent();
und die Methode entsprechend kürzen.PHP-Code:
$return = CheckBotAgentSimple::checkAgent( \Environment::get('httpUserAgent') );
Nachtrag: Hab das jetzt so abgeändert. So kann ich dann per PHPUnit Test Agent Strings übergeben wie bisher auch.
Geändert von BugBuster (21.07.2015 um 00:10 Uhr)
Grüße, BugBuster"view source" is your guide.Danke an alle Amazon Wunschlisten Erfüller
Das ist auf jeden Fall besser/richtiger.
Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.
Gibt es eigentlich irgendwo ein bisschen Info-Material zum Testen von Contao-Extensions? Ich würde das gerne machen, tue mir aber noch mit dem richtigen Setup im Zusammenhang mit dem Contao-Framework schwer.
Kommt drauf an was du machen willst. Eigene Erweiterungen testen oder fremde?
Und funktionale Tests (ohne Contao Framework) oder Integrationstest (mit Contao Framework)
Leider lässt sich das nicht recht trennen in allen Fällen.
Ich bin selber grad dabei die Erweiterungen von mir wenn ich was größeres ändern muss gleich ein wenig umzuschreiben, damit die überhaupt funktional testbar werden.
Testen dann natürlich mit PHPUnit, da muss man sich natürlich einarbeiten.
Ich sammle dabei einige Tipps: https://contao.ninja/tipps-und-trick...91;2][]=18
Nebenbei baue ich mir eine Testumgebung in einer VM die vieles lokal automatisieren soll (über Jenkins). Nur halt lokal und nicht auf Portalen die es dafür gibt.
Siehe auch den Vortrag von xtra auf der Konferenz https://www.cyberspectrum.de/talks.h...woe_ck2015.pdf
Wenn ich ein wenig Zeit finde kommt demnächst meine Erkenntnis darüber raus :-)
http://docs.contao.ninja/de/c3tdd.html
Grüße, BugBuster"view source" is your guide.Danke an alle Amazon Wunschlisten Erfüller
Hi Bugbuster,
danke für deine Tipps. Deine Tippssammlung verfolge ich bereits. Mir geht es um das Testen eigener Erweiterungen, sowohl funktional als auch was die Integration in Contao angeht. Ich frage mich, wie ich z.B. eine Klasse teste, die von \Module oder \Frontend erbt?
Derzeit teste ich solche Klassen mit PHPUnit gar nicht.
Bei meinen neuen Erweiterungen bestehen z.B. das Frontend Modul nur aus wenigen Zeilen, die ganze Logik lagere ich aus in mehrere passende Klassen die ich so schreibe, das ich diese testen kann.
Problematisch sind Klassen die Datenbank Abfragen haben. Hier wenns sein muss teste ich die Klasse indem ich die Erweiterung in eine lokale lauffähige Contao Version installiere und darin den Test mache. Dazu muss man dann natürlich die Initialisierung durchlaufen durch einlesen der initialize.php.
Es gibt einige Ansätze die Datenbank Klasse zu mocken, über class_alias zum Beispiel. Aber das ist mir derzeit noch zu komplex.
Ich bin schon froh, wenn ich meine Logiken testen kann. Dazu muss ich natürlich einiges Simulieren, Objekte über new stdClass nachbilden und als Parameter der Methode übergeben.
Grüße, BugBuster"view source" is your guide.Danke an alle Amazon Wunschlisten Erfüller
BugBuster: evtl was fyr dich https://github.com/MetaModels/phpunit-contao-database
Ist weit entfernt von perfekt, aber sollte dir helfen.
Bedenke stets: Wenn Du ungenaue oder unzureichende Angaben machst, so koennte dies die Bearbeitung deiner Frage endlos verzoegern (oder sogar dazu fyhren, dass ich zu viel nachdenken muss und die Antwort vergesse!). Kein Support per PN.
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Lesezeichen