2016-02-23 1 views
1

Я использую в моей реализации проекта испытательного генератора от hereСоздание результатов HTML из тестов генерируются динамически

Этого просто генерирует тестовые случаи на базе данных (объем данных), что я предоставить в test_function.

Я пытаюсь создать вывод HTML от этого в файл «report.html т.е.»

import unittest 


class DynamicClassBase(unittest.TestCase): 
    longMessage = True 


def make_test_function(description, a, b): 
    def test(self): 
     self.assertEqual(a, b, description) 
    return test 


def main(): 
    testsmap = { 
     'foo': [1, 1], 
     'bar': [1, 2], 
     'baz': [5, 5]} 

    for name, params in testsmap.iteritems(): 
     test_func = make_test_function(name, params[0], params[1]) 
     klassname = 'Test_{0}'.format(name) 
     globals()[klassname] = type(klassname, 
            (DynamicClassBase,), 
            {'test_gen_{0}'.format(name): test_func}) 

    unittest.main() 


if __name__ == '__main__': 
    main() 

Я нашел хороший способ произвести его с помощью HTMLTestRunner, но я имел проблемы, объединяющие эти два решения. Основная проблема заключается в том, что HTMLTestRunner получает пакет suite = unittest.TestLoader().loadTestsFromTestCase(classname) в качестве параметра

Образец HTMLTestRunner, что я использую:

import HTMLTestRunner 
import unittest 

def main(): 
    class htmlreportsdemo(unittest.TestCase): 

     def test_pass(self): 
      pass 

     def test_fail(self): 
      self.fail() 


suite = unittest.TestLoader().loadTestsFromTestCase(htmlreportsdemo) 
unittest.TextTestRunner(verbosity=2) 
output = open("results.html", "w") 
runner = HTMLTestRunner.HTMLTestRunner(stream=output, title='demo title', 
             description='demo desc') 
runner.run(suite) 

if __name__ == '__main__': 
    main() 

ответ

0

Я думаю, у меня есть решение на основе расширения suite, которое я передаю в runner.

Надежда кто-то найти его ПОЛЕЗНЫЕ:

import unittest 
import HTMLTestRunner 

class DynamicClassBase(unittest.TestCase): 
    longMessage = True 


def make_test_function(description, a, b): 
    def test(self): 
     self.assertEqual(a, b, description) 
    return test 


def main(): 
    tests_classes = [] # container for generated test classes 
    testsmap = { 
     'foo': [1, 1], 
     'bar': [1, 2], 
     'baz': [5, 5]} 

    for name, params in testsmap.iteritems(): 
     test_func = make_test_function(name, params[0], params[1]) 
     klassname = 'Test_{0}'.format(name) 
     globals()[klassname] = type(klassname, 
            (DynamicClassBase,), 
            {'test_gen_{0}'.format(name): test_func}) 
     test_classes_to_run.append(globals()[klassname]) 

    # solution starts here: 
    loader = unittest.TestLoader() 
    suites_list = [] 
    for test_class in test_classes_to_run: 
     suite = loader.loadTestsFromTestCase(test_class) 
     suites_list.append(suite) 

    big_suite = unittest.TestSuite(suites_list) 
    with open('results.html', 'w') as html_file: 
     runner = HTMLTestRunner.HTMLTestRunner(stream=html_file, 
              verbosity=2, 
              title='demo title', 
              description='demo descr') 
     runner.run(big_suite) 


if __name__ == '__main__': 
    main() 
0

Я думаю, что это делает то, что вы хотите:

import unittest 
import HTMLTestRunner 

class DynamicClassBase(unittest.TestCase): 
    longMessage = True 

def make_method(name, a, b): 
    def _method(self, a=a, b=b): 
     self.assertEqual(a, b, name) 
    return _method 

def main(): 
    tests_map = { 
     'foo': [1, 1], 
     'bar': [1, 2], 
     'baz': [5, 5] 
    } 
    for name, params in tests_map.iteritems(): 
     test_name = "test_gen_%s" % name 
     _method = make_method(test_name, params[0], params[1]) 
     setattr(DynamicClassBase, test_name, _method) 
    suite = unittest.TestLoader().loadTestsFromTestCase(DynamicClassBase) 
    unittest.TextTestRunner(verbosity=2) 
    with open('results.html', 'w') as html_file: 
     runner = HTMLTestRunner.HTMLTestRunner(stream=html_file, 
               title='demo title', 
               description='demo descr') 
     runner.run(suite) 

if __name__ == '__main__': 
    main() 

ПРИМЕЧАНИЕ: Это решение использует параметры по умолчанию для получения значений в тестовых функциях.

+0

Спасибо, это очень близко к тому, что я ищу. Единственное, что нужно исправить, это то, что 'setattr' производит все сгенерированные тесты, исходящие из' (__main __. DynamicClassBase) ', и в моем первом примере каждый тест исходит из собственного« класса »:' (__main __. Test_foo) 'и т. Д. В текущем решении если один из тестов потерпел неудачу, его сообщение как целого класса не удалось, а не как хотелось: отдельный тестовый пример. Но в любом случае, спасибо, это был хороший намек на стартер! – modzello86

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