从动态生成的测试中创建 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()
我在我的项目实施中使用来自 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()