@@ -201,6 +201,7 @@ def get_fixture_values(test_class_instance, names):
201
201
import itertools as _itertools_module
202
202
return list (_itertools_module .product (* result_vector ))
203
203
204
+ _skipped_marker = object ()
204
205
205
206
class Mark :
206
207
@staticmethod
@@ -213,7 +214,7 @@ def decorator(obj):
213
214
214
215
@staticmethod
215
216
def xfail (obj ):
216
- def foo ():
217
+ def foo (self ):
217
218
pass
218
219
foo .__name__ = obj .__name__
219
220
return foo
@@ -312,6 +313,7 @@ def __init__(self):
312
313
self .exceptions = []
313
314
self .passed = 0
314
315
self .failed = 0
316
+ self .skipped_n = 0
315
317
316
318
def get_useful_frame (self , tb ):
317
319
from traceback import extract_tb
@@ -329,6 +331,9 @@ def run_safely(self, func, print_immediately=False):
329
331
with print_lock :
330
332
print (u"\n \t \u21B3 " , func .__name__ , " " , end = "" , flush = True )
331
333
334
+ if func .__code__ is Mark .xfail (func ).__code__ :
335
+ return _skipped_marker
336
+
332
337
# insert fixture params
333
338
co = func .__code__
334
339
fixture_args = []
@@ -376,7 +381,10 @@ def do_run():
376
381
r = self .run_safely (func )
377
382
end = time .monotonic () - start
378
383
with print_lock :
379
- self .success (end ) if r else self .failure (end )
384
+ if r is _skipped_marker :
385
+ self .skipped ()
386
+ else :
387
+ self .success (end ) if r else self .failure (end )
380
388
ThreadPool .start (do_run )
381
389
382
390
def success (self , time ):
@@ -392,6 +400,10 @@ def failure(self, time):
392
400
print ("[%.3fs]" % time , end = " " )
393
401
print (fail_msg , end = "" , flush = True )
394
402
403
+ def skipped (self ):
404
+ self .skipped_n += 1
405
+ print ("s " , end = "" , flush = True )
406
+
395
407
def assertIsInstance (self , value , cls ):
396
408
assert isinstance (value , cls ), "Expected %r to be instance of %r" % (value , cls )
397
409
@@ -541,6 +553,7 @@ def __init__(self, paths):
541
553
self .exceptions = []
542
554
self .passed = 0
543
555
self .failed = 0
556
+ self .skipped_n = 0
544
557
545
558
@staticmethod
546
559
def find_testfiles (paths ):
@@ -635,10 +648,11 @@ def run(self):
635
648
self .exceptions += testcase .exceptions
636
649
self .passed += testcase .passed
637
650
self .failed += testcase .failed
651
+ self .skipped_n += testcase .skipped_n
638
652
if verbose :
639
653
print ()
640
654
ThreadPool .shutdown ()
641
- print ("\n \n Ran %d tests (%d passes, %d failures)" % (self .passed + self .failed , self .passed , self .failed ))
655
+ print ("\n \n Ran %d tests (%d passes, %d failures, %d skipped )" % (self .passed + self .failed , self .passed , self .failed , self . skipped_n ))
642
656
for e in self .exceptions :
643
657
msg , exc = e
644
658
print (msg )
0 commit comments