Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Unit tests #55

Closed
wants to merge 29 commits into from
Closed

Added Unit tests #55

wants to merge 29 commits into from

Conversation

andig
Copy link
Contributor

@andig andig commented Oct 18, 2013

Added base set of unit tests using PHPUnit and VisualPHPUnit as frontend.
Included is one logical fix to DataIterator.php to make the test cases behave sanely.

@andig
Copy link
Contributor Author

andig commented Oct 19, 2013

Sobald die Unit Tests drin sind würde ich gerne zwei weitere PRs auf Basis dieses einstellen:

  1. Unterstützung für composer.json, damit automatisierte Installation von Doctrine (Voraussetzung für 2)
  2. Unterstützung für travis-ci und damit automatisierte Builds für das VZ Repository.

Beide Lösungen sind fertig, aufgrund der Abhängigkeiten möchte ich bei der Reihenfolge aber keine Verwirrung stiften ;)

@r00t-
Copy link
Contributor

r00t- commented Oct 19, 2013

magst du (auch fuer phpunit-neulige) ein paar worte dazu sagen, wie man die tests ausfuehrt,
und was die abhaengigkeiten sind?

das mit dem web-interface ist sicher praktisch,
aber liefert bei mir nur die sinnfreie fehlermeldung "The requested URL /home/user/public_html/volkszaehler.org/test/app/public/ was not found on this server.", wenn ich /test/ aufrufe.

zum ausfuehren auf der kommandozeile wohl einfach 'phpunit' im test/ verzeichniss.
dabei schlagen dann erstmal einfach alle tests fehl,
bis man die middleware-url in test/tests/Middleware.php hardcodet?

allgemein erscheint es mir unguenstig, fuer das ausfuehren der tests einen webserver zu brauchen?
kann man die aufrufe der middleware-funktione nicht auch direkt erzeugen?
ein test ob der web-zugriff auf die lokale installation gerade funktioniert,
muss ja nicht unbedingt bestanteil und vorraustzung der tests sein.

sorry fuer die vielen rueckfragen...

@r00t-
Copy link
Contributor

r00t- commented Oct 19, 2013

ach ja, und eigentlich sollte ja htdocs/ das docroot sein,
vlt. sollte test/ eher darin aufruffbar sein, neben /frontend/?

@andig
Copy link
Contributor Author

andig commented Oct 19, 2013

Erstmal vorweg- die Sache ist nicht ganz trivial und hat sicher Verbesserungspotential. Ich halte den Weg dennoch für wertvoll, also arbeiten wir dran!

magst du (auch fuer phpunit-neulige) ein paar worte dazu sagen, wie man die tests ausfuehrt,
und was die abhaengigkeiten sind?

Klar- ich mach's jetzt mal hier in englisch damit wir das evtl. wieder nutzen können wenn wir die passende Stelle dafür gefunden haben:

Unit tests require installation of PHPUnit, the de facto standard for unit testing under PHP. For installation details please see http://phpunit.de/manual/current/en/installation.html
One way to install PHPUnit that will make it available for use with Volkszaehler is installation via PEAR:

pear config-set auto_discover 1 
pear install pear.phpunit.de/PHPUnit

@root: ich hatte auch überlegt PHPUnit direkt mit ins repository aufzunehmen. Da es prinzipiell aber nur für die Entwickler interessant ist und diese sowas am Start haben sollten (oder wissen woher es kommt) habe ich mich dagegen entschieden.

das mit dem web-interface ist sicher praktisch,
aber liefert bei mir nur die sinnfreie fehlermeldung "The requested URL /home/user/public_html/volkszaehler.org/test/app/public/ was not found on this server.", wenn ich /test/ aufrufe.

Spannend. Gibt es den Pfad? Im Git sollte er vorhanden sein? Falls es nochmal die Möglichkeit gibt mir das auf Deinem Rechner anzuschauen gerne.

zum ausfuehren auf der kommandozeile wohl einfach 'phpunit' im test/ verzeichniss.
dabei schlagen dann erstmal einfach alle tests fehl,
bis man die middleware-url in test/tests/Middleware.php hardcodet?

Jaein. Per bash kann das Script die Server URL nicht herausfinden, jedenfalls wüsste ich nicht wie. In der aktuellen Version habe ich die Tests daher per phpunit.xml auf den PHP-internen Webserver verlagert und ein entsprechendes bootstrap Skript hinzugefügt.
Update: Ups, das liegt in meinem Travis branch, ich schiebe es rüber!

allgemein erscheint es mir unguenstig, fuer das ausfuehren der tests einen webserver zu brauchen?

Kann sein, aber andere Tests habe ich nicht und diese prüfen das Verhalten der MW. Wer bessere hat kann diese nehmen...

kann man die aufrufe der middleware-funktione nicht auch direkt erzeugen?

Keine Ahnung.

ein test ob der web-zugriff auf die lokale installation gerade funktioniert,
muss ja nicht unbedingt bestanteil und vorraustzung der tests sein.

Siehe oben- die Abhängigkeit zum Webserver ist über PHP aufgelöst.

sorry fuer die vielen rueckfragen...
ach ja, und eigentlich sollte ja htdocs/ das docroot sein,
vlt. sollte test/ eher darin aufruffbar sein, neben /frontend/?

M.E. nicht da die auf einem produktiven System nix zu suchen haben. U.a. braucht der AggregationTest (ein weiterer Branch bei mir) erhebliche Laufzeit und ich wollte nicht dass unautorisierte sowas auf einem produktiven Server ausführen.

OK?

@andig
Copy link
Contributor Author

andig commented Oct 19, 2013

Added README.md to test folder, visible when checking in github.

@andig
Copy link
Contributor Author

andig commented Oct 19, 2013

Und nochmal eine Idee was man draus machen kann: https://travis-ci.org/andig/volkszaehler.org
Den Fehler mit der falschen JSON-Codierung vor 2 Wochen hätten wir auf dem Weg automatisiert in Mailingliste und IRC-Kanal bekommen ;)

@andig
Copy link
Contributor Author

andig commented Oct 22, 2013

Ich habe jetzt nochmal untersucht ob sich die UTs nicht auch ohne Webserver ausführen lassen. Dafür habe ich Wrapper für Router, HTTP Request und Response geschrieben um die Ergebnisse abzufangen. "Im Prinzip" funktioniert es, hat aber einen grundsätzlichen Haken: sobald die Verarbeitung in eine Exception läuft die im View ausgegeben wird (bzw im ExceptionHandler), stoppt das Skript.
Eine saubere Rückgabe in den aufrufenden Unittest habe ich damit nicht hinbekommen. Falls es bessere Ideen gibt stelle ich meinen Ansatz gerne zur Verfügung, ansonsten müssen wir wohl fürs erste den Webserver nutzen.

@r00t-
Copy link
Contributor

r00t- commented Oct 22, 2013

sorry, das ist alles ein missverstaendniss,
mit "ohne webserver" meinte ich, ohne apache,
das mit dem php-internen ist doch ok wenn's funktioniert!

ich werd' die version mit dem fix nochmal testen und dann wohl mergen!

@andig
Copy link
Contributor Author

andig commented Oct 23, 2013

mit "ohne webserver" meinte ich, ohne apache,
das mit dem php-internen ist doch ok wenn's funktioniert!

macht für mich eigentlich keinen Unterschied. Der Webserver ist keine "echte" Abhängigkeit da der für VZ ja ohnehin laufen muss, natürlich muss die Konfiguration aber sauber sein und funktionieren (keine hardcodierten Pfade wie in meinem ersten Anlauf :/)

Ein erheblicher Vorteil ohne Webserver (da hast Du mich drauf gebracht...) bestünde darin, dass sich ohne auch die Code Coverage testen ließe, aktuell mit WS geht das nicht.

Alle Testfälle im moment beruhen auf "sauberer" Verarbeitung, es wäre also nicht mal ein Problem wenn Exceptions direkt von PHPUNIT verschluckt würden ohne dass die Test Cases dies in Form von JSON Responses verarbeiten können.

Long Story short: ich schlage vor die aktuelle Version zu committen und ich schaue mal in Ruhe ob es da nicht eine Möglichkeit gibt dennoch ohne WS zu testen, dann halt nicht alle Aspekte.

@andig
Copy link
Contributor Author

andig commented Nov 6, 2013

Mit den Testcases erreichen wir folgende Code Coverage:

 Summary:
  Classes: 7.14% (2/28)
  Methods: 37.78% (68/180)
  Lines:   50.27% (566/1126)

\Volkszaehler::Router
  Methods:  60.00% ( 3/ 5)   Lines:  43.10% ( 25/ 58)
\Volkszaehler\Controller::ChannelController
  Methods: 100.00% ( 3/ 3)   Lines:  91.30% ( 21/ 23)
\Volkszaehler\Controller::Controller
  Methods:  66.67% ( 2/ 3)   Lines:  50.00% (  7/ 14)
\Volkszaehler\Controller::DataController
  Methods: 100.00% ( 3/ 3)   Lines:  42.31% ( 22/ 52)
\Volkszaehler\Controller::EntityController
  Methods: 100.00% ( 5/ 5)   Lines:  86.67% ( 52/ 60)
\Volkszaehler\Definition::Definition
  Methods:  66.67% ( 4/ 6)   Lines:  80.00% ( 20/ 25)
\Volkszaehler\Definition::EntityDefinition
  Methods:  66.67% ( 4/ 6)   Lines:  77.78% (  7/  9)
\Volkszaehler\Definition::PropertyDefinition
  Methods: 100.00% ( 2/ 2)   Lines:  60.71% ( 17/ 28)
\Volkszaehler\Interpreter::CounterInterpreter
  Methods: 100.00% ( 3/ 3)   Lines:  85.00% ( 34/ 40)
\Volkszaehler\Interpreter::DataIterator
  Methods:  72.73% ( 8/11)   Lines:  80.56% ( 29/ 36)
\Volkszaehler\Interpreter::Interpreter
  Methods:  92.86% (13/14)   Lines:  71.43% ( 65/ 91)
\Volkszaehler\Interpreter::MeterInterpreter
  Methods: 100.00% ( 3/ 3)   Lines:  96.43% ( 27/ 28)
\Volkszaehler\Model::Channel
  Methods: 100.00% ( 3/ 3)   Lines: 100.00% (  8/  8)
\Volkszaehler\Model::Data
  Methods:  20.00% ( 1/ 5)   Lines:  50.00% (  4/  8)
\Volkszaehler\Model::Entity
  Methods:  83.33% (10/12)   Lines:  71.74% ( 33/ 46)
\Volkszaehler\Model::Property
  Methods: 100.00% ( 7/ 7)   Lines:  81.82% ( 18/ 22)
\Volkszaehler\Util::ClassLoader
  Methods:  18.18% ( 2/11)   Lines:  15.69% (  8/ 51)
\Volkszaehler\Util::Configuration
  Methods:  50.00% ( 1/ 2)   Lines:  47.37% (  9/ 19)
\Volkszaehler\Util::Debug
  Methods:   8.33% ( 1/12)   Lines:   1.79% (  1/ 56)
\Volkszaehler\Util::JSON
  Methods:  60.00% ( 3/ 5)   Lines:  22.00% ( 11/ 50)
\Volkszaehler\Util::JSONException
  Methods: 100.00% ( 1/ 1)   Lines: 100.00% (  2/  2)
\Volkszaehler\Util::Random
  Methods:  42.86% ( 3/ 7)   Lines:  37.84% ( 14/ 37)
\Volkszaehler\Util::UUID
  Methods:  45.45% ( 5/11)   Lines:  27.72% ( 28/101)
\Volkszaehler\View::JSON
  Methods:  69.23% ( 9/13)   Lines:  58.45% ( 83/142)
\Volkszaehler\View::View
  Methods:  30.00% ( 3/10)   Lines:  21.74% ( 10/ 46)
\Volkszaehler\View\HTTP::Request
  Methods:  50.00% ( 3/ 6)   Lines:  25.71% (  9/ 35)
\Volkszaehler\View\HTTP::Response
  Methods:  25.00% ( 2/ 8)   Lines:  27.27% (  6/ 22)

@r00t-
Copy link
Contributor

r00t- commented Nov 17, 2013

tthuermer@mc12[/public_html]$ git clone -b unittest https://github.com/andig/volkszaehler.org.git
tthuermer@mc12[
/public_html/volkszaehler.org/test]$ phpunit
PHP Fatal error: Uncaught exception 'Exception' with message 'Configuration file not found: '/home/tthuermer/public_html/volkszaehler.org/etc/volkszaehler.conf.pc.php'' in /home/tthuermer/public_html/volkszaehler.org/lib/Util/Configuration.php:70
woher sollte die datei kommen? im repository ist sie nicht.

und nach wie vor:
http://dhcp4.nonsens/~tthuermer/volkszaehler.org/test/
=>
"The requested URL /home/tthuermer/public_html/volkszaehler.org/test/app/public/ was not found on this server."
(verzeichniss existiert, auf dem dateisystem)
ich vermute da ist eine rewrite-regel drin, die sich nicht mit mod_userdir vertraegt...
die middleware als solche laeuft aber

http://dhcp4.nonsens/~tthuermer/volkszaehler.org/test/app/public/
liefert eine anscheinend vom php-code erzeugte "Not Found" meldung ohne pfadangabe,
im eror_log steht in beiden faellen nichts(!), php-errors landen da aber ansonsten (zB middleware aufrufen wenn doctrine noch nicht installiert)

werd's nochmal ausserhalb vom userdir testen, aber sehe nicht, warum es da nicht laufen sollte.
(AllowOverride All ist gesetzt)

@andig andig closed this Nov 18, 2013
@andig andig deleted the unittest branch November 18, 2013 02:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants