====== PEAR QA Continuous Integration and Unit Tests ====== There are a number of tools [[pear:qa]] use to maintain quality. ===== PHPCS and General QA tools ===== http://test.pear.php.net/ hosts continuous integration tools * [[http://test.pear.php.net/|Pearweb test installation]] * [[http://test.pear.php.net:8080/|Jenkins]] * [[http://test.pear.php.net/unit-test-results/|(old) Test results overview]] * [[https://github.com/pear/pear-svn-git|Migrate to github script]] The helper scripts live at https://github.com/pear/phpuc/ ===== Jenkins ===== Jenkins is a continuous integration platform. Currently, all packages in both PEAR and PEAR2 were scanned for the presence of a 'tests' folder, and corresponding jenkins jobs were created. ==== Access === Jenkins is configured to authenticate against the github organisations of pear / pear2. You simply need to be associated with one of the organisations to modify builds. ==== Adding a new job/build ==== * Create job * Enter package name * Enter link to github * Enter the read-only git url into source management * Select 'build on push from github' as a trigger * Add either manual build steps or invoke an ant build.xml target. Manual steps should include executing * phpunit --coverage-html build/coverage/ --coverage-clover build/logs/clover.xml --log-junit build/logs/junit.xml tests/ * php ~/pyrus.phar package * Add in Post-build Actions for 'Publish junit test result report' ==== How do I make sure my tests work? ==== In general, we encourage the use of an appropriate phpunit.xml - we target PHPUnit 3.6 at this time. Your package directory layout should allow you to successfully run your test suite as below (assuming svn): $ cd Foo_Bar/trunk $ phpunit -c phpunit.xml tests/ ==== My directory layout doesn't work === A common pattern with older packages is to have a directory structure which is unlike the installed package layout. IE: ''Foo_Bar/trunk/Bar.php''. Most authors make use of the ''baseinstalldir'' attribute in the package.xml, or only run tests after installation To fix this: $ svn mkdir Foo $ svn mv Bar.php Foo/ # Edit package.xml, change baseinstalldir to / $ vim package.xml # Rebuild package using PEAR_PackageFileManager_CLI $ pfm # Run tests to confirm no fatal errors, using one of $ pear run-tests -r tests/ $ phpunit tests/ # Commit $ svn commit -m "Updated directory layout" ==== Pyrus won't build my package 1.0 ==== See [[pear:packages:migration]] ==== My unit tests need a (database/server/setup/configuration) ==== Two strategies exist for this: - Making use of PHPUnit's mocking capabilities or utilising something like HTTP_Request2's Mock Adapter - Checking your environment and skipping the test if it cannot run There is also a test mysql instance available. > Hi Daniel: > > On Wed, Nov 16, 2011 at 08:34:04AM +1030, Daniel O'Connor wrote: > > http://test.pear.php.net:8080/job/DB_DataObject/4/console > > > > This and a few others obviously need a database to be tested properly. > > Certainly that machine has mysql on it; or sqlite is probably available - > > what would be needed to load up an appropriate schema/tear it down after > > the tests? > > I agree and mentioned this on pear-qa a while ago. Take a look at what > I committed to DB tests yesterday. It takes advantage of the > MYSQL_TEST_* environment variables, which are used for PHP's tests. We > should create a test user and database and set those environment > variables in the cron job, or whatever. > > A similar setup should be made for PostgreSQL in PEAR and PHP's unit > tests. Right now, PHP's tests don't use such environment variables. > > SQLite3 tests should use ":memory:" as the database. > > Thanks, > > --Dan ==== Build tools ==== In general, ant is the preferred way of managing a build after a certain level of complexity. See http://jenkins-php.org/ for more detail. Noteably, we prefer phpdoc/docblox over phpdox. Some packages use phing ==== Dependencies ==== There are two available techniques for managing dependencies without installing system wide libraries. The first is relatively straight forward - simply pulling the library from source and pushing it into a lib directory. $ git clone git://path/to/package.git lib/package $ git clone git://path/to/package2.git lib/package2 $ phpunit --include-path lib/package:lib/package2 ... This can be either configured in the jenkins build or (preferred) in the relevant build.xml and phpunit.xml files. The second is to utilise [[http://getcomposer.org|composer.phar]] in combination with a relevant phpunit.xml ==== Todo ==== - Put more packages into jenkins - Investigate a notification task to package maintainers? - Investigate allowing bootstrapped build.xml files back in (Pyrus) - Upgrade PHP on test.pear.php.net - Install xdebug for proper code coverage ===== How to test a new PEAR release ===== Before releasing a new version of PEAR, we need to make sure it runs on as many systems as possible. It's pretty easy: - Install the new PEAR - Make sure you have the XML_RPC package - Checkout pear-core from the repository to get the tests - Run the tests pear upgrade -f PEAR pear upgrade XML_RPC git clone git://github.com/pear/pear-core.git cd pear-core/tests && pear run-tests -r Tell pear-qa@lists.php.net if you got failures, and if, which tests did not pass. We will come back to you in that case. ==== Common pitfalls ==== * Make sure that PHP is compiled with tokenizer support (--enable-tokenizer). On most systems this is default, but on Gentoo Linux for instance, you need to enable the tokenizer USE flag. * For some tests the executable php-cgi is needed. In some Linux distributions this is contained in a separate package, but on for instance Gentoo Linux this has to be enabled using the cgi USE flag. * If running on linux, do not run the tests as root