1
1
import sys
2
2
3
+ try :
4
+ import io
5
+ import traceback
6
+ except ImportError :
7
+ import uio as io
8
+
9
+ traceback = None
10
+
3
11
4
12
class SkipTest (Exception ):
5
13
pass
@@ -160,7 +168,7 @@ class TestRunner:
160
168
def run (self , suite ):
161
169
res = TestResult ()
162
170
for c in suite .tests :
163
- run_class (c , res )
171
+ res . exceptions . extend ( run_class (c , res ) )
164
172
165
173
print ("Ran %d tests\n " % res .testsRun )
166
174
if res .failuresNum > 0 or res .errorsNum > 0 :
@@ -180,16 +188,27 @@ def __init__(self):
180
188
self .failuresNum = 0
181
189
self .skippedNum = 0
182
190
self .testsRun = 0
191
+ self .exceptions = []
183
192
184
193
def wasSuccessful (self ):
185
194
return self .errorsNum == 0 and self .failuresNum == 0
186
195
187
196
197
+ def capture_exc (e ):
198
+ buf = io .StringIO ()
199
+ if hasattr (sys , "print_exception" ):
200
+ sys .print_exception (e , buf )
201
+ elif traceback is not None :
202
+ traceback .print_exception (None , e , sys .exc_info ()[2 ], file = buf )
203
+ return buf .getvalue ()
204
+
205
+
188
206
# TODO: Uncompliant
189
207
def run_class (c , test_result ):
190
208
o = c ()
191
209
set_up = getattr (o , "setUp" , lambda : None )
192
210
tear_down = getattr (o , "tearDown" , lambda : None )
211
+ exceptions = []
193
212
for name in dir (o ):
194
213
if name .startswith ("test" ):
195
214
print ("%s (%s) ..." % (name , c .__qualname__ ), end = "" )
@@ -202,14 +221,14 @@ def run_class(c, test_result):
202
221
except SkipTest as e :
203
222
print (" skipped:" , e .args [0 ])
204
223
test_result .skippedNum += 1
205
- except :
224
+ except Exception as ex :
225
+ exceptions .append (capture_exc (ex ))
206
226
print (" FAIL" )
207
227
test_result .failuresNum += 1
208
- # Uncomment to investigate failure in detail
209
- # raise
210
228
continue
211
229
finally :
212
230
tear_down ()
231
+ return exceptions
213
232
214
233
215
234
def main (module = "__main__" ):
@@ -225,5 +244,9 @@ def test_cases(m):
225
244
suite .addTest (c )
226
245
runner = TestRunner ()
227
246
result = runner .run (suite )
247
+ if result .exceptions :
248
+ sep = "\n ----------------------------------------------------------------------\n "
249
+ print (sep )
250
+ print (sep .join (result .exceptions ))
228
251
# Terminate with non zero return code in case of failures
229
252
sys .exit (result .failuresNum > 0 )
0 commit comments