From 3fba5e786763b3a31c3721b7e5719228a93fdafb Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Mon, 17 Jul 2017 22:59:13 +0200 Subject: [PATCH] enable code coverage computation for API BDD tests Fixes #505. --- test/README.md | 15 +++++++++++++++ test/bdd/environment.py | 12 +++++++++++- test/bdd/steps/cgi-with-coverage.php | 13 +++++++++++++ test/bdd/steps/queries.py | 13 ++++++++++++- 4 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 test/bdd/steps/cgi-with-coverage.php diff --git a/test/README.md b/test/README.md index f6112620..f6c1ac2a 100644 --- a/test/README.md +++ b/test/README.md @@ -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= + +To generate reports, you can use the phpcov tool: + + phpcov merge --html= + ### Indexing Tests (`test/bdd/db`) These tests check the import and update of the Nominatim database. They do not diff --git a/test/bdd/environment.py b/test/bdd/environment.py index aca7929d..6f50817a 100644 --- a/test/bdd/environment.py +++ b/test/bdd/environment.py @@ -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("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']); diff --git a/test/bdd/steps/queries.py b/test/bdd/steps/queries.py index 55285d6a..443342b0 100644 --- a/test/bdd/steps/queries.py +++ b/test/bdd/steps/queries.py @@ -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))