From cc57dcd01a1ffbd7e329f49a124ff3cba4cb99f1 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 26 Sep 2020 10:43:50 +0200 Subject: [PATCH] Added code coverage to API tests --- .travis.yml | 4 +-- bin/test/run-api-tests.sh | 3 +- composer.json | 17 +++++---- config/test/bootstrap_api_tests.php | 18 +++++++++- config/test/constants.php | 8 +++++ config/test/test_config.global.php | 54 ++++++++++++++++++++++++++--- data/infra/php.Dockerfile | 21 +++-------- data/infra/php.ini | 2 ++ data/infra/swoole.Dockerfile | 10 +++--- phpstan.neon | 1 + 10 files changed, 99 insertions(+), 39 deletions(-) create mode 100644 config/test/constants.php diff --git a/.travis.yml b/.travis.yml index cd132c43..bf7e8b15 100644 --- a/.travis.yml +++ b/.travis.yml @@ -44,7 +44,7 @@ before_install: - phpenv config-rm xdebug.ini || return 0 - sudo ./data/infra/ci/install-ms-odbc.sh - docker-compose -f docker-compose.yml -f docker-compose.ci.yml up -d shlink_db_ms shlink_db shlink_db_postgres shlink_db_maria - - yes | pecl install pdo_sqlsrv swoole-4.5.2 + - yes | pecl install pdo_sqlsrv swoole-4.5.2 pcov install: - composer self-update @@ -62,6 +62,6 @@ script: after_success: - rm -f build/clover.xml - wget https://phar.phpunit.de/phpcov-7.0.2.phar - - phpdbg -qrr phpcov-7.0.2.phar merge build --clover build/clover.xml + - php phpcov-7.0.2.phar merge build --clover build/clover.xml - wget https://scrutinizer-ci.com/ocular.phar - php ocular.phar code-coverage:upload --format=php-clover build/clover.xml diff --git a/bin/test/run-api-tests.sh b/bin/test/run-api-tests.sh index fae0c628..f3236d1b 100755 --- a/bin/test/run-api-tests.sh +++ b/bin/test/run-api-tests.sh @@ -1,6 +1,7 @@ #!/usr/bin/env sh export APP_ENV=test export DB_DRIVER=mysql +export TEST_ENV=api # Try to stop server just in case it hanged in last execution vendor/bin/mezzio-swoole stop @@ -9,7 +10,7 @@ echo 'Starting server...' vendor/bin/mezzio-swoole start -d sleep 2 -phpdbg -qrr vendor/bin/phpunit --order-by=random -c phpunit-api.xml --testdox --colors=always $* +vendor/bin/phpunit --order-by=random -c phpunit-api.xml --testdox --colors=always --log-junit=build/coverage-api/junit.xml $* testsExitCode=$? vendor/bin/mezzio-swoole stop diff --git a/composer.json b/composer.json index c37f378f..a2cb9539 100644 --- a/composer.json +++ b/composer.json @@ -68,6 +68,7 @@ "eaglewu/swoole-ide-helper": "dev-master", "infection/infection": "^0.16.1", "phpstan/phpstan": "^0.12.18", + "phpunit/php-code-coverage": "^8.0", "phpunit/phpunit": "~9.0.1", "roave/security-advisories": "dev-master", "shlinkio/php-coding-standard": "~2.1.0", @@ -93,7 +94,10 @@ "module/Core/test", "module/Core/test-db" ] - } + }, + "files": [ + "config/test/constants.php" + ] }, "scripts": { "ci": [ @@ -113,10 +117,10 @@ "test:ci": [ "@test:unit:ci", "@test:db", - "@test:api:ci" + "@test:api" ], - "test:unit": "phpdbg -qrr vendor/bin/phpunit --order-by=random --colors=always --coverage-php build/coverage-unit.cov --testdox", - "test:unit:ci": "@test:unit --coverage-clover=build/clover.xml --coverage-xml=build/coverage-unit/coverage-xml --log-junit=build/coverage-unit/junit.xml", + "test:unit": "@php vendor/bin/phpunit --order-by=random --colors=always --coverage-php build/coverage-unit.cov --testdox", + "test:unit:ci": "@test:unit --coverage-xml=build/coverage-unit/coverage-xml --log-junit=build/coverage-unit/junit.xml", "test:db": [ "@test:db:sqlite:ci", "@test:db:mysql", @@ -124,15 +128,14 @@ "@test:db:postgres", "@test:db:ms" ], - "test:db:sqlite": "APP_ENV=test phpdbg -qrr vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-db.xml", + "test:db:sqlite": "APP_ENV=test php vendor/bin/phpunit --order-by=random --colors=always --testdox -c phpunit-db.xml", "test:db:sqlite:ci": "@test:db:sqlite --coverage-php build/coverage-db.cov --coverage-xml=build/coverage-db/coverage-xml --log-junit=build/coverage-db/junit.xml", "test:db:mysql": "DB_DRIVER=mysql composer test:db:sqlite", "test:db:maria": "DB_DRIVER=maria composer test:db:sqlite", "test:db:postgres": "DB_DRIVER=postgres composer test:db:sqlite", "test:db:ms": "DB_DRIVER=mssql composer test:db:sqlite", "test:api": "bin/test/run-api-tests.sh", - "test:api:ci": "bin/test/run-api-tests.sh --coverage-php build/coverage-api.cov", - "test:unit:pretty": "phpdbg -qrr vendor/bin/phpunit --order-by=random --colors=always --coverage-html build/coverage", + "test:unit:pretty": "@php vendor/bin/phpunit --order-by=random --colors=always --coverage-html build/coverage-unit-html", "infect": "infection --threads=4 --min-msi=80 --log-verbosity=default --only-covered", "infect:ci:base": "@infect --skip-initial-tests", "infect:ci": [ diff --git a/config/test/bootstrap_api_tests.php b/config/test/bootstrap_api_tests.php index 4cf01807..7bda8c10 100644 --- a/config/test/bootstrap_api_tests.php +++ b/config/test/bootstrap_api_tests.php @@ -7,12 +7,28 @@ namespace Shlinkio\Shlink\TestUtils; use Doctrine\ORM\EntityManager; use Psr\Container\ContainerInterface; +use function register_shutdown_function; +use function sprintf; + +use const ShlinkioTest\Shlink\SWOOLE_TESTING_HOST; +use const ShlinkioTest\Shlink\SWOOLE_TESTING_PORT; + /** @var ContainerInterface $container */ $container = require __DIR__ . '/../container.php'; $testHelper = $container->get(Helper\TestHelper::class); $config = $container->get('config'); $em = $container->get(EntityManager::class); +$httpClient = $container->get('shlink_test_api_client'); + +// Start code coverage collecting on swoole process, and stop it when process shuts down +$httpClient->request('GET', sprintf('http://%s:%s/api-tests/start-coverage', SWOOLE_TESTING_HOST, SWOOLE_TESTING_PORT)); +register_shutdown_function(function () use ($httpClient): void { + $httpClient->request( + 'GET', + sprintf('http://%s:%s/api-tests/stop-coverage', SWOOLE_TESTING_HOST, SWOOLE_TESTING_PORT), + ); +}); $testHelper->createTestDb(); -ApiTest\ApiTestCase::setApiClient($container->get('shlink_test_api_client')); +ApiTest\ApiTestCase::setApiClient($httpClient); ApiTest\ApiTestCase::setSeedFixturesCallback(fn () => $testHelper->seedFixtures($em, $config['data_fixtures'] ?? [])); diff --git a/config/test/constants.php b/config/test/constants.php new file mode 100644 index 00000000..a2c880fc --- /dev/null +++ b/config/test/constants.php @@ -0,0 +1,8 @@ +filter()->addDirectoryToWhitelist($item); + } +} $buildDbConnection = function (): array { $driver = env('DB_DRIVER', 'sqlite'); @@ -78,8 +93,8 @@ return [ 'mezzio-swoole' => [ 'enable_coroutine' => false, 'swoole-http-server' => [ - 'host' => $swooleTestingHost, - 'port' => $swooleTestingPort, + 'host' => SWOOLE_TESTING_HOST, + 'port' => SWOOLE_TESTING_PORT, 'process-name' => 'shlink_test', 'options' => [ 'pid_file' => sys_get_temp_dir() . '/shlink-test-swoole.pid', @@ -88,6 +103,35 @@ return [ ], ], + 'routes' => !$isApiTest ? [] : [ + [ + 'name' => 'start_collecting_coverage', + 'path' => '/api-tests/start-coverage', + 'middleware' => middleware(static function () use (&$coverage) { + if ($coverage) { + $coverage->start('api tests'); + } + return new EmptyResponse(); + }), + 'allowed_methods' => ['GET'], + ], + [ + 'name' => 'dump_coverage', + 'path' => '/api-tests/stop-coverage', + 'middleware' => middleware(static function () use (&$coverage) { + if ($coverage) { + $basePath = __DIR__ . '/../../build/coverage-api'; + $coverage->stop(); + (new Clover())->process($coverage, $basePath . '.cov'); + (new Xml(Version::getVersionString()))->process($coverage, $basePath . '/coverage-xml'); + } + + return new EmptyResponse(); + }), + 'allowed_methods' => ['GET'], + ], + ], + 'mercure' => [ 'public_hub_url' => null, 'internal_hub_url' => null, @@ -97,7 +141,7 @@ return [ 'dependencies' => [ 'services' => [ 'shlink_test_api_client' => new Client([ - 'base_uri' => sprintf('http://%s:%s/', $swooleTestingHost, $swooleTestingPort), + 'base_uri' => sprintf('http://%s:%s/', SWOOLE_TESTING_HOST, SWOOLE_TESTING_PORT), 'http_errors' => false, ]), ], diff --git a/data/infra/php.Dockerfile b/data/infra/php.Dockerfile index 5b0ac28a..94d5e8fe 100644 --- a/data/infra/php.Dockerfile +++ b/data/infra/php.Dockerfile @@ -3,7 +3,6 @@ MAINTAINER Alejandro Celaya ENV APCU_VERSION 5.1.18 ENV APCU_BC_VERSION 1.0.5 -ENV XDEBUG_VERSION 2.9.0 RUN apk update @@ -55,29 +54,17 @@ RUN rm /tmp/apcu_bc.tar.gz RUN rm /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini RUN echo extension=apcu.so > /usr/local/etc/php/conf.d/20-php-ext-apcu.ini -# Install xdebug -ADD https://pecl.php.net/get/xdebug-$XDEBUG_VERSION /tmp/xdebug.tar.gz -RUN mkdir -p /usr/src/php/ext/xdebug\ - && tar xf /tmp/xdebug.tar.gz -C /usr/src/php/ext/xdebug --strip-components=1 -# configure and install -RUN docker-php-ext-configure xdebug\ - && docker-php-ext-install xdebug -# cleanup -RUN rm /tmp/xdebug.tar.gz - -# Install sqlsrv driver +# Install pcov and sqlsrv driver RUN wget https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.5.1.1-1_amd64.apk && \ apk add --allow-untrusted msodbcsql17_17.5.1.1-1_amd64.apk && \ apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS unixodbc-dev && \ - pecl install pdo_sqlsrv && \ - docker-php-ext-enable pdo_sqlsrv && \ + pecl install pdo_sqlsrv pcov && \ + docker-php-ext-enable pdo_sqlsrv pcov && \ apk del .phpize-deps && \ rm msodbcsql17_17.5.1.1-1_amd64.apk # Install composer -RUN php -r "readfile('https://getcomposer.org/installer');" | php -RUN chmod +x composer.phar -RUN mv composer.phar /usr/local/bin/composer +COPY --from=composer:1.10.13 /usr/bin/composer /usr/local/bin/composer # Make home directory writable by anyone RUN chmod 777 /home diff --git a/data/infra/php.ini b/data/infra/php.ini index 5ef7b7ea..64838d11 100644 --- a/data/infra/php.ini +++ b/data/infra/php.ini @@ -4,3 +4,5 @@ memory_limit=-1 log_errors_max_len=0 zend.assertions=1 assert.exception=1 +pcov.enabled=1 +pcov.directory=module diff --git a/data/infra/swoole.Dockerfile b/data/infra/swoole.Dockerfile index 70d52fa1..ecc8ede0 100644 --- a/data/infra/swoole.Dockerfile +++ b/data/infra/swoole.Dockerfile @@ -66,19 +66,17 @@ RUN docker-php-ext-configure inotify\ # cleanup RUN rm /tmp/inotify.tar.gz -# Install swoole and mssql driver +# Install swoole, pcov and mssql driver RUN wget https://download.microsoft.com/download/e/4/e/e4e67866-dffd-428c-aac7-8d28ddafb39b/msodbcsql17_17.5.1.1-1_amd64.apk && \ apk add --allow-untrusted msodbcsql17_17.5.1.1-1_amd64.apk && \ apk add --no-cache --virtual .phpize-deps $PHPIZE_DEPS unixodbc-dev && \ - pecl install swoole-${SWOOLE_VERSION} pdo_sqlsrv && \ - docker-php-ext-enable swoole pdo_sqlsrv && \ + pecl install swoole-${SWOOLE_VERSION} pdo_sqlsrv pcov && \ + docker-php-ext-enable swoole pdo_sqlsrv pcov && \ apk del .phpize-deps && \ rm msodbcsql17_17.5.1.1-1_amd64.apk # Install composer -RUN php -r "readfile('https://getcomposer.org/installer');" | php -RUN chmod +x composer.phar -RUN mv composer.phar /usr/local/bin/composer +COPY --from=composer:1.10.13 /usr/bin/composer /usr/local/bin/composer # Make home directory writable by anyone RUN chmod 777 /home diff --git a/phpstan.neon b/phpstan.neon index 35b1beda..0ce0463c 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -5,3 +5,4 @@ parameters: - '#AbstractQuery::setParameters\(\)#' - '#mustRun\(\)#' - '#AssociationBuilder::setOrderBy#' + - '#If condition is always false#'