Fixes #505.
@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
'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")
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)
--- /dev/null
+<?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']);
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))