diff --git a/benchmarks/utils.py b/benchmarks/utils.py
index fe1db153c773dd119303f9d28fa65a3f350be882_YmVuY2htYXJrcy91dGlscy5weQ==..4ef570a34bb7dd5aaeaca73b040a79279b634ed1_YmVuY2htYXJrcy91dGlscy5weQ== 100644
--- a/benchmarks/utils.py
+++ b/benchmarks/utils.py
@@ -173,6 +173,33 @@
             '-T', '{node|short}', '-r', '.'],
             env=self.environ).strip()
 
+    def check_output(self, *args, **kwargs):
+        """Helper to run commands
+
+        Run given command in a subprocess
+        Optional expected_return_code (default 0) is used to control whenever
+        we expect the command should exit.
+
+        If the command succeeded with expected_return_code = 0, return the output
+        If the command succeeded with expected_return_code != 0, raise RuntimeError
+        If the command fail with expected_return_code, return None, else raise
+        original subprocess.CalledProcessError exception.
+        """
+        env = kwargs.pop('env', self.environ)
+        expected_return_code = kwargs.pop('expected_return_code', 0)
+        cmd = list(args)
+        try:
+            output = subprocess.check_output(cmd, env=env, **kwargs)
+        except subprocess.CalledProcessError as exc:
+            if exc.returncode == expected_return_code:
+                # failed as we expected
+                return None
+            raise
+        else:
+            if expected_return_code != 0:
+                raise RuntimeError('unexpected return code 0 for {}'.format(cmd))
+            return output
+
     def setup(self, repo_name, *args, **kwargs):
         venv = os.path.abspath(os.path.join(os.path.dirname(sys.executable), ".."))
         self.repo_name = repo_name
@@ -222,14 +249,9 @@
 
     def _single_execute(self, cmd):
         before = time.time()
-        try:
-            output = subprocess.check_output(cmd, stderr=subprocess.STDOUT,
-                                             env=self.environ)
-            after = time.time()
-            duration = after - before
-            return duration
-        except subprocess.CalledProcessError as e:
-            raise
+        self.check_output(*cmd, stderr=subprocess.STDOUT)
+        after = time.time()
+        return after - before
 
 
 class BaseTimeTestSuite(BaseTestSuite):
@@ -252,17 +274,8 @@
         ] + list(args)
         return cmd
 
-    def _single_execute(self, cmd, expected_return_code=0):
-        try:
-            subprocess.check_output(cmd, stderr=subprocess.STDOUT,
-                                    env=self.environ)
-        except subprocess.CalledProcessError as exc:
-            if exc.returncode != expected_return_code:
-                print(exc.output)
-                raise
-        else:
-            if expected_return_code != 0:
-                raise RuntimeError('unexpected return code 0 for %s' % (cmd,))
+    def _single_execute(self, cmd, **kwargs):
+        self.check_output(*cmd, **kwargs)
 
 
 class BaseNChangesetsTestSuite(BaseTimeTestSuite):