enable code coverage computation for API BDD tests

Fixes #505.
This commit is contained in:
Sarah Hoffmann 2017-07-17 22:59:13 +02:00
parent a27e191335
commit 3fba5e7867
4 changed files with 51 additions and 2 deletions

View File

@ -120,6 +120,21 @@ Before importing make sure to add the following to your local settings:
@define('CONST_Database_DSN', 'pgsql://@/test_api_nominatim');
@define('CONST_Wikipedia_Data_Path', CONST_BasePath.'/test/testdb');
#### Code Coverage
The API tests also support code coverage tests. You need to install
PHP_CodeCoverage. On Debian/Ubuntu run:
apt-get install php-codecoverage
The run the API tests as follows:
behave api -DPHPCOV=<coverage output dir>
To generate reports, you can use the phpcov tool:
phpcov merge --html=<report output dir> <coverage output dir>
### Indexing Tests (`test/bdd/db`)
These tests check the import and update of the Nominatim database. They do not

View File

@ -17,7 +17,8 @@ userconfig = {
'TEMPLATE_DB' : 'test_template_nominatim',
'TEST_DB' : 'test_nominatim',
'API_TEST_DB' : 'test_api_nominatim',
'TEST_SETTINGS_FILE' : '/tmp/nominatim_settings.php'
'TEST_SETTINGS_FILE' : '/tmp/nominatim_settings.php',
'PHPCOV' : False, # set to output directory to enable code coverage
}
use_step_matcher("re")
@ -28,16 +29,25 @@ class NominatimEnvironment(object):
def __init__(self, config):
self.build_dir = os.path.abspath(config['BUILDDIR'])
self.src_dir = os.path.abspath(os.path.join(os.path.split(__file__)[0], "../.."))
self.template_db = config['TEMPLATE_DB']
self.test_db = config['TEST_DB']
self.api_test_db = config['API_TEST_DB']
self.local_settings_file = config['TEST_SETTINGS_FILE']
self.reuse_template = not config['REMOVE_TEMPLATE']
self.keep_scenario_db = config['KEEP_TEST_DB']
self.code_coverage_path = config['PHPCOV']
self.code_coverage_id = 1
os.environ['NOMINATIM_SETTINGS'] = self.local_settings_file
self.template_db_done = False
def next_code_coverage_file(self):
fn = os.path.join(self.code_coverage_path, "%06d.cov" % self.code_coverage_id)
self.code_coverage_id += 1
return fn
def write_nominatim_config(self, dbname):
f = open(self.local_settings_file, 'w')
f.write("<?php\n @define('CONST_Database_DSN', 'pgsql://@/%s');\n" % dbname)

View File

@ -0,0 +1,13 @@
<?php
require_once 'SebastianBergmann/CodeCoverage/autoload.php';
$covfilter = new SebastianBergmann\CodeCoverage\Filter();
$covfilter->addDirectoryToWhitelist($_SERVER['COV_PHP_DIR']);
$coverage = new SebastianBergmann\CodeCoverage\CodeCoverage(null, $covfilter);
$coverage->start($_SERVER['COV_TEST_NAME']);
include $_SERVER['COV_SCRIPT_FILENAME'];
$coverage->stop();
$writer = new \SebastianBergmann\CodeCoverage\Report\PHP;
$writer->process($coverage, $_SERVER['PHP_CODE_COVERAGE_FILE']);

View File

@ -282,7 +282,18 @@ def send_api_query(endpoint, params, fmt, context):
if hasattr(context, 'http_headers'):
env.update(context.http_headers)
cmd = ['/usr/bin/php-cgi', env['SCRIPT_FILENAME']]
cmd = ['/usr/bin/php-cgi', '-f']
if context.nominatim.code_coverage_path:
env['COV_SCRIPT_FILENAME'] = env['SCRIPT_FILENAME']
env['COV_PHP_DIR'] = os.path.join(context.nominatim.src_dir, "lib")
env['COV_TEST_NAME'] = '%s:%s' % (context.scenario.filename, context.scenario.line)
env['SCRIPT_FILENAME'] = \
os.path.join(os.path.split(__file__)[0], 'cgi-with-coverage.php')
cmd.append(env['SCRIPT_FILENAME'])
env['PHP_CODE_COVERAGE_FILE'] = context.nominatim.next_code_coverage_file()
else:
cmd.append(env['SCRIPT_FILENAME'])
for k,v in params.items():
cmd.append("%s=%s" % (k, v))