PHP, QA, and Jenkins Eric Cope June 25, 2013 http://voltampmedia.com About Me • I run Voltamp Media Inc., a 1-man web-dev shop • PHP-literate since 2002 • CodeIgniter since 2005 (1.6 whenever that was) • Bitten by the TDD bug around 2006 • Met Hudson/Jenkins in 2011 The Tools • Jenkins - http://jenkins-ci.org – Continuous Integration Tool – Basic install is a quick download then: • java –jar jenkins.war • Normal vs. LTS – For bigger installations, its recommended to run within a java container, like Tomcat. • PHPUnit – http://phpqatools.org – A set of QA tools – Installation is via PEAR • Selenium – http://seleniumhq.org/ – java -jar selenium-server-standalone-2.31.0.jar Getting Started • Open a browser to: – http://localhost:8080 Managing Jenkins • File System Location – Config files – Project build areas – Manage plugins • Start from here - http://jenkins-php.org/ • Get the plugins Static Code Analysis Plug-ins Clover PHP Plugin Plot plugin DRY Plugin Checkstyle Plugin PMD Plugin Git Plugin HTML Publisher Plugin xUnit Plugin The First Job • Each job must be configured! – Source Code – how to get the code – Build triggers (poll SCM, commit hooks) – Build Steps • Scripts (very limited environment) • Maven • Ant – see http://jenkins-php.org/ for yours! – Post Build Steps • Plots, reports The ANT Script • This is auto-generated, then modified as needed • Test by running: % ant /path/to/build.xml • More at http://ant.apache.or g The PHPUnit Script • This is auto-generated, then modified as needed too • Test by running: % phpunit PHPUnit Tips and Tricks - fixtures • YAML files can be used within a fixture PHPUnit Tips and Tricks – data providers • YAML files can be used as a data provider too – Calls the provider (returns an array) – For each row it calls the test • The YAML is different! PHPUnit Tips and Tricks – Exceptions • Test your exceptions! • Check exception class and code Bonus! PHPUnit and Selenium • Make Jenkins drive PHPUnit drive Selenium! My Issues - controller • My current projects use CodeIgniter. CIUnit makes using PHPUnit and CI better, but setup is painful. – End case of parent controller • Correct parent class in setUp, but not in the testMethod! • MY_Controller vs. Controller – $this->CI = set_controller('MY_Controller'); My Issues - Selenium • Selenium has matured quite a bit, but documentation and support is still very lean. • PHPUnit’s Selenium2 class is much better, but still leaves much to be desired. – Click() does not wait for the page to load after a form submission. Selenese supported clickandwait(), but I can’t find documentation… – https://github.com/sebastianbergmann/phpunitselenium/blob/master/Tests/Selenium2TestCaseTest.p hp – http://stackoverflow.com/questions/9102505/phpunit -with-selenium Still to Learn/Do • • • • • • Mocks Dependency Injection Code Coverage DRY-er! More Integration coverage with Selenium Exclude External Libraries in analysis || fix them! • Better TDD / BDD