setName('tests:run'); $this->setDescription('Run Piwik PHPUnit tests one group after the other'); $this->addArgument('group', InputArgument::OPTIONAL, 'Run only a specific test group. Separate multiple groups by comma, for instance core,integration', ''); $this->addOption('options', 'o', InputOption::VALUE_OPTIONAL, 'All options will be forwarded to phpunit', ''); } protected function execute(InputInterface $input, OutputInterface $output) { $options = $input->getOption('options'); $groups = $input->getArgument('group'); $groups = explode(",", $groups); $groups = array_map('ucfirst', $groups); $groups = array_filter($groups, 'strlen'); $command = 'phpunit'; // force xdebug usage for coverage options if (false !== strpos($options, '--coverage') && !extension_loaded('xdebug')) { $output->writeln('xdebug extension required for code coverage.'); $output->writeln('searching for xdebug extension...'); $extensionDir = shell_exec('php-config --extension-dir'); $xdebugFile = trim($extensionDir) . DIRECTORY_SEPARATOR . 'xdebug.so'; if (!file_exists($xdebugFile)) { $dialog = $this->getHelperSet()->get('dialog'); $xdebugFile = $dialog->askAndValidate($output, 'xdebug not found. Please provide path to xdebug.so', function($xdebugFile) { return file_exists($xdebugFile); }); } else { $output->writeln('xdebug extension found in extension path.'); } $output->writeln("using $xdebugFile as xdebug extension."); $phpunitPath = trim(shell_exec('which phpunit')); $command = sprintf('php -d zend_extension=%s %s', $xdebugFile, $phpunitPath); } if(empty($groups)) { $groups = $this->getTestsGroups(); } foreach($groups as $group) { $params = '--group ' . $group . ' ' . str_replace('%group%', $group, $options); $cmd = sprintf('cd %s/tests/PHPUnit && %s %s', PIWIK_DOCUMENT_ROOT, $command, $params); $output->writeln('Executing command: ' . $cmd . ''); passthru($cmd); $output->writeln(""); } } private function getTestsGroups() { return array('Core', 'Plugins', 'Integration', 'UI'); } }