Index: src/tests/pybin/test_run.py
===================================================================
--- src/tests/pybin/test_run.py	(revision e9a7e90bcf7f85996a4ac53fc5fab81096d04136)
+++ src/tests/pybin/test_run.py	(revision ca54499c30d3851f774da304ea39374bc91c002d)
@@ -4,4 +4,16 @@
 
 import pybin.settings
+import datetime
+
+from string import Template
+
+class DeltaTemplate(Template):
+    delimiter = "%"
+
+def strfdelta(tdelta, fmt):
+    d["H"], rem = divmod(tdelta.seconds, 3600)
+    d["M"], d["S"] = divmod(rem, 60)
+    t = DeltaTemplate(fmt)
+    return t.substitute(**d)
 
 # Test class that defines what a test is
@@ -57,11 +69,23 @@
 
 	@classmethod
-	def toString( cls, retcode ):
+	def toString( cls, retcode, duration ):
 		if settings.generating :
-			if   retcode == TestResult.SUCCESS: 	return "Done"
-			elif retcode == TestResult.TIMEOUT: 	return "TIMEOUT"
-			else :						return "ERROR code %d" % retcode
+			if   retcode == TestResult.SUCCESS: 	text = "Done   "
+			elif retcode == TestResult.TIMEOUT: 	text = "TIMEOUT"
+			else :						text = "ERROR code %d" % retcode
 		else :
-			if   retcode == TestResult.SUCCESS: 	return "PASSED"
-			elif retcode == TestResult.TIMEOUT: 	return "TIMEOUT"
-			else :						return "FAILED with code %d" % retcode
+			if   retcode == TestResult.SUCCESS: 	text = "PASSED "
+			elif retcode == TestResult.TIMEOUT: 	text = "TIMEOUT"
+			else :						text = "FAILED with code %d" % retcode
+
+		text += "    C%s - R%s" % (cls.fmtDur(duration[0]), cls.fmtDur(duration[1]))
+		return text
+
+	@classmethod
+	def fmtDur( cls, duration ):
+		if duration :
+			hours, rem = divmod(duration, 3600)
+			minutes, rem = divmod(rem, 60)
+			seconds, millis = divmod(rem, 1)
+			return "%2d:%02d.%03d" % (minutes, seconds, millis * 1000)
+		return " n/a"
Index: src/tests/test.py
===================================================================
--- src/tests/test.py	(revision e9a7e90bcf7f85996a4ac53fc5fab81096d04136)
+++ src/tests/test.py	(revision ca54499c30d3851f774da304ea39374bc91c002d)
@@ -9,4 +9,5 @@
 import re
 import sys
+import time
 
 ################################################################################
@@ -136,11 +137,18 @@
 
 	# build, skipping to next test on error
+	before = time.time()
 	make_ret, _ = make( test.target(),
 		redirects  = "2> %s 1> /dev/null" % out_file,
 		error_file = err_file
 	)
+	after = time.time()
+
+	comp_dur = after - before
+
+	run_dur = None
 
 	# if the make command succeds continue otherwise skip to diff
 	if make_ret == 0 or settings.dry_run:
+		before = time.time()
 		if settings.dry_run or fileIsExecutable(test.target()) :
 			# run test
@@ -149,4 +157,7 @@
 			# simply cat the result into the output
 			retcode, _ = sh("cat %s > %s" % (test.target(), out_file))
+
+		after = time.time()
+		run_dur = after - before
 	else:
 		retcode, _ = sh("mv %s %s" % (err_file, out_file))
@@ -174,5 +185,5 @@
 	sh("rm -f %s > /dev/null 2>&1" % test.target())
 
-	return retcode, error
+	return retcode, error, [comp_dur, run_dur]
 
 # run a single test and handle the errors, outputs, printing, exception handling, etc.
@@ -183,8 +194,8 @@
 		name_txt = "%20s  " % t.name
 
-		retcode, error = run_single_test(t)
+		retcode, error, duration = run_single_test(t)
 
 		# update output based on current action
-		result_txt = TestResult.toString( retcode )
+		result_txt = TestResult.toString( retcode, duration )
 
 		#print result with error if needed
