Option to generate code coverage with PHPUnit
authorFrederic Massart <fred@moodle.com>
Wed, 5 Nov 2014 01:58:39 +0000 (09:58 +0800)
committerFrederic Massart <fred@moodle.com>
Wed, 5 Nov 2014 01:58:39 +0000 (09:58 +0800)
extra/bash_completion
mdk/commands/phpunit.py
mdk/phpunit.py

index ea44ccd..f9ef0ee 100644 (file)
@@ -169,7 +169,7 @@ function _mdk() {
                     OPTS="$(compgen -A file $CUR)"
                     compopt -o nospace
                 else
-                    OPTS="--force --run --testcase --unittest --filter"
+                    OPTS="--force --run --testcase --unittest --filter --coverage"
                     OPTS="$OPTS $(_list_instances)"
                 fi
                 ;;
index 74e0324..f859a46 100644 (file)
@@ -65,6 +65,13 @@ class PhpunitCommand(Command):
             }
         ),
         (
+            ['-c', '--coverage'],
+            {
+                'action': 'store_true',
+                'help': 'creates the HTML code coverage report'
+            }
+        ),
+        (
             ['--filter'],
             {
                 'default': None,
@@ -134,13 +141,16 @@ class PhpunitCommand(Command):
             PU.init(force=args.force, prefix=prefix)
 
             kwargs = {
+                'coverage': args.coverage,
+                'filter': args.filter,
                 'testcase': args.testcase,
-                'unittest': args.unittest,
-                'filter': args.filter
+                'unittest': args.unittest
             }
 
             if args.run:
                 PU.run(**kwargs)
+                if args.coverage:
+                    logging.info('Code coverage is available at: \n %s', (PU.getCoverageUrl()))
             else:
                 logging.info('Start PHPUnit:\n %s' % (' '.join(PU.getCommand(**kwargs))))
 
index 4ac48b9..fa461d4 100644 (file)
@@ -40,7 +40,7 @@ class PHPUnit(object):
         self._Wp = Wp
         self._M = M
 
-    def getCommand(self, **kwargs):
+    def getCommand(self, testcase=None, unittest=None, filter=None, coverage=None):
         """Get the PHPUnit command"""
         cmd = []
         if self.usesComposer():
@@ -48,15 +48,35 @@ class PHPUnit(object):
         else:
             cmd.append('phpunit')
 
-        if kwargs.get('testcase'):
-            cmd.append(kwargs.get('testcase'))
-        elif kwargs.get('unittest'):
-            cmd.append(kwargs.get('unittest'))
-        elif kwargs.get('filter'):
-            cmd.append('--filter="%s"' % kwargs.get('filter'))
+        if coverage:
+            cmd.append('--coverage-html')
+            cmd.append(self.getCoverageDir())
+
+        if testcase:
+            cmd.append(testcase)
+        elif unittest:
+            cmd.append(unittest)
+        elif filter:
+            cmd.append('--filter="%s"' % filter)
 
         return cmd
 
+    def getCoverageDir(self):
+        """Get the Coverage directory, and create it if required"""
+        path = os.path.join(self.Wp.getPath(self.M.get('identifier'), 'extra'), 'coverage')
+        if not os.path.exists(path):
+            mkdir(path, 0777)
+        return path
+
+    def getCoverageUrl(self):
+        """Return the code coverage URL"""
+        # TODO Constructing the URL should be done elsewhere...
+        wwwroot = '%s://%s/' % (C.get('scheme'), C.get('host'))
+        if C.get('path') != '' and C.get('path') != None:
+            wwwroot = wwwroot + C.get('path') + '/'
+        wwwroot = wwwroot + C.get('mdkDir') + '/' + self.M.get('identifier') + '/coverage'
+        return wwwroot
+
     def init(self, force=False, prefix=None):
         """Initialise the PHPUnit environment"""