2014-11-10 2 views
0

Я кодирую с unittest и у меня вопрос. Я хочу пропустить тестовый случай в зависимости от глобальной переменной.аргументы глобальной переменной и аргументы декоратора

import unittest 

_SKIP_TEST = False 
all_suites = unittest.TestSuite() 

class Test1(unittest.TestCase): 
    @unittest.skipIf(_SKIP_TEST, 'Test should be run') 
    def runTest(self): 
     global _SKIP_TEST 
     _SKIP_TEST = True 
     print('Test1 executed') 
all_suites.addTest(Test1()) 

class Test2(unittest.TestCase): 
    @unittest.skipIf(_SKIP_TEST, 'Test should skipped') 
    def runTest(self): 
     print('Test2 executed') 
all_suites.addTest(Test2()) 

if __name__ == '__main__': 
    unittest.TextTestRunner(verbosity=2).run(all_suites 

Я думал, что test2 будет пропущен после выполнения test1 (глобальная переменная _SKIP_TEST устанавливается в True), но и тест был выполнен.

$ python test.py                   
runTest (__main__.Test1) ... Test1 executed 
ok 
runTest (__main__.Test2) ... Test2 executed 
ok 

---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 

Это может быть, происходит из области видимости переменной или оценка ошибки синхронизации, или что-то я не знаю .... Как я могу сделать этот код работать, как я ожидал?

Спасибо.

ответ

1

Прикладной декоратор при модуле времени импорта; к тому времени, когда вы установили _SKIP_TEST в True, этот декоратор уже давно применяется.

Вы могли бы назвать TestCase.skipTest() method в тесте вместо:

class Test1(unittest.TestCase): 
    def runTest(self): 
     if _SKIP_TEST: 
      self.skipTest(_SKIP_TEST, 'Test should be run') 

     global _SKIP_TEST 
     _SKIP_TEST = True 
     print('Test1 executed') 

class Test2(unittest.TestCase): 
    def runTest(self): 
     if _SKIP_TEST: 
      self.skipTest(_SKIP_TEST, 'Test should be skipped') 
     print('Test2 executed') 

или написать свой собственный декоратора, который использует эту воскрешает unittest.SkipTest() exception основан на вызываемая:

from functools import wraps 
from unittest import SkipTest 

def dynamicSkipIf(callable, reason): 
    def decorator(f): 
     @wraps(f) 
     def wrapper(*args, **kw): 
      if callable(): 
       raise SkipTest(reason) 
      return f(*args, **kw) 
     return wrapper 
    return decorator 

затем использовать его в качестве :

class Test1(unittest.TestCase): 
    @dynamicSkipIf(lambda: _SKIP_TEST, 'Test should be run') 
    def runTest(self): 
     global _SKIP_TEST 
     _SKIP_TEST = True 
     print('Test1 executed') 
all_suites.addTest(Test1()) 

class Test2(unittest.TestCase): 
    @dynamicSkipIf(lambda: _SKIP_TEST, 'Test should skipped') 
    def runTest(self): 
     print('Test2 executed') 

Не тестируется _SKIP_TEST, когда тест выполнен, а не во время импорта модуля.

Смежные вопросы