]> git.openstreetmap.org Git - nominatim.git/commitdiff
enable code coverage computation for API BDD tests
authorSarah Hoffmann <lonvia@denofr.de>
Mon, 17 Jul 2017 20:59:13 +0000 (22:59 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Mon, 17 Jul 2017 20:59:13 +0000 (22:59 +0200)
Fixes #505.

test/README.md
test/bdd/environment.py
test/bdd/steps/cgi-with-coverage.php [new file with mode: 0644]
test/bdd/steps/queries.py

index f6112620018513f6ef49e1db7833eb8ca0ccccef..f6c1ac2a9edeb816f20865ea4b5558ce4b7d1556 100644 (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
index aca7929d250de6fa6fd69a2c3c4b565bc2062fba..6f50817a96d97a930380ce5c5f3bf91770ec4ac8 100644 (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)
diff --git a/test/bdd/steps/cgi-with-coverage.php b/test/bdd/steps/cgi-with-coverage.php
new file mode 100644 (file)
index 0000000..17104d4
--- /dev/null
@@ -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']);
index 55285d6a6bac83c52fc6559c4e227dae5323b2bb..443342b0d1b86f79d634f42c1daaf01972f8c281 100644 (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))