从动态生成的测试中创建 html 个结果

Creating html results from tests generated dynamically

我在我的项目实施中使用来自 here

的测试生成器

这只是根据我提供给 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) 作为参数

示例 HTML我使用的 TestRunner:

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()

我认为这符合您的要求:

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()

注意:此解决方案使用默认参数将值获取到测试函数中。

我想我有一些基于 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()