我有一个包含API的Django项目(如果在任何地方计算,则使用rest框架创建)。我已经为API添加了一些测试但是为了获得测试的整体视图,无论是传递失败还是失败,我都需要创建一个HTML报告。 测试完成后,应生成一个HTML表格报告,其中显示测试期间涵盖的端点和HTTP响应,测试结果以及缺少测试的组合。
不幸的是我无法理解我该怎么做。我知道报道可以给我一个详细的HTML报告,但这不是我需要的,我需要这样的东西:
|端点描述| 200 | 400 | 403 | 404 |
| GET / endpoint1 |通过|通过|通过| N / A |
| POST / endpoint1 |通过|失败|失败| N / A |
有人对此有任何想法吗?也许有些lib可以帮助解决这个问题或者我应该使用什么策略?
提前谢谢
答案 0 :(得分:0)
由于Django使用python的标准unittest
库,你必须调整它的一些部分。
首先,您需要一些方法来指定哪些测试实际测试哪个端点。自定义装饰器很方便:
from functools import wraps
def endpoint(path, code):
"""
Mark some test as one which tests specific endpoint.
"""
def inner(func):
@wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
inner._endpoint_path = path
inner._endpoint_code = code
return inner
class MyTestCase(TestCase):
@endpoint(path='/path/one', code=200)
def test_my_path_is_ok(self):
response = self.client.get('/path/one?foo=bar')
self.assertEqual(response.status_code, 200)
@endpoint(path='/path/one', code=404)
def test_my_path_expected_errors(self):
response = self.client.get('/path/one?foo=qux')
self.assertEqual(response.status_code, 404)
def test_some_other_stuff(self):
# this one will not be included in our results grid.
pass
你可以使用"魔法"方法(例如,特殊方法'名称来猜测他们正在测试的端点),但是explicit is better than implicit,对吧?
然后,您需要一种方法来收集测试结果 - 特别是测试端点的测试结果。在这里,我们创建一个(非常草案)unittest.TestResult
的子类来处理它:
class EndpointsTestResult(TestResult):
def __init__(self):
super(EndpointsTestResult, self).__init__()
self.endpoint_results = {}
def addError(self, test, err):
super(EndpointsTestResult, self).addError(test, err)
if hasattr(test, '_endpoint_path'):
branch = self.endpoint_results.setdefault(getattr(test, '_endpoint_path'), {})
branch[getattr(test, '_endpoint_code')] = 'MISSING'
def addFailure(self, test, err):
# similar as addError()
def addSuccess(self, test):
# similar as addError()
最后是时候实际输出我们的结果了。让我们创建unittest.TextTestRunner
的子类,并在我们的自定义运行器中指定它:
class EndpointsTestRunner(TextTestRunner):
def _makeResult(self):
self._result = EndpointsTestResult()
return self._result
def run(self, test):
super(EndpointsTestRunner).run(test)
# After running a test, print out the table
generate_a_nifty_table(self._result.endpoint_results)
class EndpointsDjangoRunner(django.test.runner.DiscoverRunner):
test_runner = EndpointsTestRunner
现在我们有了自定义EndpointsDjangoRunner
,我们应该在settings.py
中指定它:
TEST_RUNNER = 'path.to.the.EndpointsDjangoRunner'
那就是它。如果你发现代码中有任何尴尬的错误,请告诉我。
答案 1 :(得分:0)
晚了聚会,但这是我为Django测试输出HTML测试报告的解决方案。 (基于HtmlTestRunner cannot be directly used with Django DiscoverRunner)
以下类(如果放置在tests / html_test_reporter.py中)可以用作DiscoverRunner,并已修补为使用HTMLTestRunner。
from django.test.runner import DiscoverRunner
from HtmlTestRunner import HTMLTestRunner
class MyHTMLTestRunner(HTMLTestRunner):
def __init__(self, **kwargs):
# Pass any required options to HTMLTestRunner
super().__init__(combine_reports=True, report_name='all_tests', add_timestamp=False, **kwargs)
class HtmlTestReporter(DiscoverRunner):
def __init__(self, **kwargs):
super().__init__(**kwargs)
# Patch over the test_runner in the super class.
html_test_runner = MyHTMLTestRunner
self.test_runner=html_test_runner
然后运行此命令:
python manage.py test -v 2 --testrunner tests.html_test_reporter.HtmlTestReporter
默认情况下,Django项目使用django.test.runner.DiscoverRunner搜索测试,然后使用PyTest运行它们。 HTMLTestRunner可以与PyTest一起使用以输出HTML测试报告,但是似乎可以通过DiscoverRunner配置PyTest以使用HTMLRunner。
希望这会有所帮助。