icingaweb2/doc/test/running_tests.md

3.6 KiB

Test organization

Testfolders

Tests for the application can be found underneath the test folder:

test/
    php/            PHPUnit tests for backend code
    js/             mocha tests for JavaScript frontend code unittests
    frontend/       Integration tests for the frontend using casperjs

The same structure applies for modules, which also contain a toplevel test folder and suitable subtests. When you fix a bug and write a regression test for it, put the test in the 'regression' and name it %DESCRIPTION%%TicketNumber% (myBug1234.js)

Running tests

The tests can be run in the specific folder using the runtests script.

Running PHP tests example:

cd test/php
./runtests

In this case, all application and all module tests will be executed. The testrunners also support additional flags, which affect they way the test is executed:

Options:
  -h, --help            show this help message and exit
  -b, --build           Enable reporting.
  -v, --verbose         Be more verbose.
  -i PATTERN, --include=PATTERN
                        Include only specific files/test cases.
  -V, --vagrant         Run in vagrant VM

Some tests also support the --exclude method, it's best to use the --help option to see which flags are supported.

Setting up databases

Despite running most of the tests should work out of the box, a few specific cases require some setup. At this moment, only database tests require additional setup and expect an icinga_unittest user with an icinga_unittest database to exist and have rights in your database.

The database test procedure

When testing PostgreSQL and MySQL databases, the test library (normally) executes the following test procedure for every test case:

  • Log in to the rdbms as the user icinga_unittest with password icinga_unittest
  • Use the icinga_unittest database (which must be existing)
  • Drop all tables in the icinga_unittest database
  • Create a new, clean database schema

If anything goes wrong during this procedure, the test will be skipped (because maybe you don't have a pgsql database, but want to test mysql, for example).

Setting up a test user and database in MySQL

In MySQL, it's best to create a user icinga_unittest@localhost, a database icinga_unittest and grant all privileges on this database:

mysql -u root -p
mysql> CREATE USER `icinga_unittest`@`localhost` IDENTIFIED BY 'icinga_unittest';
mysql> CREATE DATABASE `icinga_unittest`;
mysql> GRANT ALL PRIVILEGES ON `icinga_unittest`.* TO `icinga_unittest`@`localhost`;
mysql> FLUSH PRIVILEGES;
mysql> quit

Setting up a test user and database in PostgreSQL

In PostgreSQL, you have to modify the pg_hba database if you don't have password authentication set up (which often is the case). In this setup the icinga_unittest user is set to trust authentication on localhost, which means that no password is queried when connecting from the local machine:

sudo su postgres
psql
postgres=#  CREATE USER icinga_unittest WITH PASSWORD 'icinga_unittest';
postgres=#  CREATE DATABASE icinga_unittest;
postgres=#  \q
bash$       createlang plpgsql icinga;

Add the following lines to your pg_hba.conf (etc/postgresql/X.x/main/pg_hba.conf under debian, /var/lib/pgsql/data/pg_hba.conf for Redhat/Fedora) to enable trust authentication for the icingaweb user when connecting from the localhost.

local   icinga_unittest      icinga_unittest                            trust
host    icinga_unittest      icinga_unittest      127.0.0.1/32          trust
host    icinga_unittest      icinga_unittest      ::1/128               trust