2016-06-09 10 views
1

Я работаю над тестовым runner, который читает файл «.test» из заданного каталога.Запуск всех тестовых файлов в python из одной функции с помощью «assert» без выхода из цикла «for loop» при ошибке теста

Структура ".test" является:

---TEMPLATE--- 
template content 
---CONTEXT--- 
context to render on template 
---RESULT--- 
expected result of the template. 

Есть 'п' нет. тестового файла в моем тестовом каталоге. Я храню номер теста. .test файлов в словаре «тесты» как его ключ и имя файла .test в качестве значения.

после этого итерация по словарю «тесты» и чтение содержимого .test-файла и сохранение их в переменных.

---TEMPLATE--- part in "template_string", 
---CONTEXT--- part in "context_string", and 
---RESULT--- part in "expected_result" 

затем сделать template_string с context_string используя класс jinja2.Environment и хранить их в "результат" varibale.

сравнить "результат" с "expected_result".

текущий код тест бегун:

class TestTempates(TestCase): 
    def test_method(self): 
     tests = { dictionary of .test file } 
     results = {} #to store status of test case at there index (pass or error). 
     env = jinja2.Environment() 
     passed = 0 
     error = 0  
     for index, fname in tests.items(): 
      file_path = dirpath + os.sep + fname 
      with open(file_path) as f: 
       # logic to read file content 
       template_string = #content of ---TEMPLATE--- part from file 
       context_string = #content of ---CONTEXT--- part from file 
       expected_result = #content of ---RESULT--- part from file 
      template = env.from_string(template_string) 
      context = json.loads(context_string) 
      result = template.render(context) 

      if result == expected_result: 
       results[index] = "Pass" 
       passed += 1 
      else: 
       sep = "-----------------------------" 
       error = "Error: results mismatch:\n%s\n%s\n%s\n%s" % \ 
         (sep, result, sep, expected_result) 
       results[index] = error 
       errors += 1 

сравнивая «результат» и «EXPECTED_RESULT» с в «если еще» условие работает нормально. Но теперь я хочу использовать «assert» или «assertEquals», не выходя из «for loop», когда какой-либо тестовый файл «result» не соответствует «expected_result», пока все файлы тестов не будут выполнены. Итак, я могу использовать свой тестовый бегун в Travis CI, чтобы сборка Travis не удалась, если какой-либо тестовый пример не получился.

В сложившейся ситуации конструкция Travis CI не терпит неудачу при сбое тестового теста.

ответ

1

Для решения проблемы может потребоваться код фрагмента кода.

suite = unittest.TestSuite() 

def test_main(self): 
    self.assertEquals(self.result, self.expected_output) 


def test_method(self): 
    """ 
    """ 
    # -- code to get tests objects to have all .tests content 
    for index, fname in tests.items(): 
     # get result and expected_output value 
     obj = type('Test', (unittest.TestCase,), {'test_main': test_main, 
        'result':result, 'expected_output':expected_output}) 

     suite.addTest(obj('test_main')) 

unittest.TextTestRunner(verbosity=2).run(suite)