Skip to content
Snippets Groups Projects
TESTING.md 2.76 KiB
Newer Older
Hanne Moa's avatar
Hanne Moa committed
Testing
=======

Testing your code is crucial to have a stable and good quality product.
We are therefore slowly increasing the amount of tests we perform, and
as a rule of thumb **all new code should have associated tests**. If you
want to contribute to the project with a pull request, make sure to
**include tests covering your code**. We won't accept pull requests
without tests or getting the code coverage down, except in very specific
situations.
Hanne Moa's avatar
Hanne Moa committed

All the tests reside in the `tests` directory. The directory structure
there replicates the main structure of the code. Each class is tested by
a class named with the same name and `Test` appended, having the same
directory structure as the original, but inside the `tests` directory.
We also use namespaces, with `SimpleSAML\Test` as the root for standard
classes, and `SimpleSAML\Test\Module\modulename` for classes located in
modules.
Hanne Moa's avatar
Hanne Moa committed

For example, if you want to test the `SimpleSAML\Utils\HTTP` class
located in `lib/SimpleSAML/Utils/HTTP.php`, the tests must be in a class
named `HTTPTest` implemented in
`tests/lib/SimpleSAML/Utils/HTTPTest.php`, with the following namespace
definition:
Hanne Moa's avatar
Hanne Moa committed

```php
namespace SimpleSAML\Test\Utils;
Hanne Moa's avatar
Hanne Moa committed
```
The test classes need to extend `PHPUnit\Framework\TestCase`, and inside
you can implement as many methods as you want. `phpunit` will only run
the ones prefixed with "test".

You will usually make use of the `assert*()` methods provided by
`PHPUnit\Framework\TestCase`, but you can also tell `phpunit` to expect
an exception to be thrown using *phpdoc*. For example, if you want to
ensure that the `SimpleSAML\Utils\HTTP::addURLParameters()` method
throws an exception in a specific situation:

```php
  /**
Hanne Moa's avatar
Hanne Moa committed
    * Test SimpleSAML\Utils\HTTP::addURLParameters().
    *
    * @expectedException \InvalidArgumentException
    */
  public function testAddURLParametersInvalidParameters() {
Hanne Moa's avatar
Hanne Moa committed
```

Refer to [the `phpunit 4.8` documentation](https://phpunit.de/manual/4.8/en/installation.html)
for more information on how to write tests. We currently use the `phpunit 4.8`
since it is the last version to support php 5.3.
Hanne Moa's avatar
Hanne Moa committed

Once you have implemented your tests, you can run them locally. First,
make sure the `config` directory is **not** in the root of your
SimpleSAMLphp installation, as the tests cannot use that. Make sure
you have `phpunit` installed and run:

```sh
Hanne Moa's avatar
Hanne Moa committed
phpunit -c tools/phpunit/phpunit.xml
```

If your default version of `phpunit` is more recent than 4.8, you can run
the old version installed by composer

```sh
./vendor/bin/phpunit -c tools/phpunit/phpunit.xml
```

All the tests are run by our *continuous integration* platform,
[travis](https://travis-ci.org/simplesamlphp/simplesamlphp). If you are
submitting a pull request, Travis will run your tests and notify whether
your code builds or not according to them.