我该如何对Django视图进行单元测试?

10

我希望开始将单元测试集成到我的Django项目中,但是我发现由于Django使用函数实现视图,因此对视图进行单元测试有些棘手。

例如,如果函数具有URL,则每个函数在Django中都是一个视图/页面。

我该如何对Django视图进行单元测试?

3个回答

11

我不确定为什么测试视图会很棘手。

你只需要使用测试客户端

代码覆盖率很容易。你推理出URL请求如何映射到代码路径,并进行适当的URL请求。

如果你愿意,你可以通过创建Request对象并检查Response对象来“手动”调用视图函数,但这太麻烦了。

如果你对代码覆盖率有疑问,那是件好事。这意味着你有一些无法轻松映射到URL的代码(这是用户在Web应用程序中能看到的全部内容)。如果你有一些不能映射到URL的代码,你应该考虑要么(a)删除这段代码,要么(b)将其重构为一个单独的模块。

我们有很多模块在视图函数之外。我们的视图函数导入这些模块。我们使用普通的unittest测试这些“视图函数之外”的模块。


以下是典型的结构。

some_big_product/
|-- __init__.py
|-- settings.py
|-- urls.py
|-- logging.ini
|-- other_global_files.py
|-- an_app_1/
|   |-- __init__.py
|   |-- urls.py
|   |-- models.py
|   |-- views.py
|   |-- tests.py <-- the generic Django testing 
|   |-- app_specific_module.py
|   |-- app_specific_package/
|   |   |-- __init__.py
|   |-- test_app_specific_module.py <-- unittest 
|   |-- test_app_specific_package.py
|-- generic_module.py
|-- generic_package/
|   |-- __init__.py
|-- tests/
|   |-- test_this.py
|   |-- test_that.py
|   |-- test_all.py <-- not always practical
|-- scripts/
    |-- run_tests.sh 

test_all.py应该如何工作?我假设我想把所有东西都放到一个大的TestCase.TestSuite中,然后运行它。这样所有的测试统计数据(通过和失败)都会在最后聚合成一个单一的输出。我无法决定是否应该自定义Django的“manage.py test”来运行额外的unittests,还是编写自己的顶级测试运行器,将Django的单元测试合并进去。 - Jonathan Hartley
@Tartley:首先,尝试使用Django的manage.py test。80%的情况下,这就足够了。如果你有更复杂的RESTful Web服务(既作为其他服务的服务器和客户端),或者在Django“典型”框架之外的其他模块中,那么你可能会发现你不能简单地使用Django测试框架,需要编写额外的unittest测试。在这种情况下,你的test_all调用Django的测试框架,然后调用单元测试。不要修改他们的代码。只需编写最简单的脚本,使用他们的代码并使用unittest即可。 - S.Lott
感谢您的建议,Lott先生!您说得对,我们已经开始将测试放置在Django寻找测试的常规位置之外(即顶级“acceptancetests”目录(测试跨越应用程序的用户可见功能)和低级单元测试,它们分布在整个repo中,而不仅仅是在Django应用程序的“test.py”脚本中。我编写了一个快速脚本,搜索树中的所有模块以查找TestCase的子类,将它们放入单个套件中并运行它。这确实捕获了Django测试用例以及我们自己的非Django单元测试。 - Jonathan Hartley
@Tartley: "快速脚本,搜索树中的所有模块,查找TestCase的子类",应该已经是unittest的一部分了。在这里要小心,因为许多这些功能已经可用。 - S.Lott
很遗憾,提供的测试客户端链接已经失效。正确的位置现在是https://docs.djangoproject.com/en/1.5/topics/testing/overview/#module-django.test.client。 - Klaas van Schelven
显示剩余2条评论

2
django.test.client应该包含您需要对视图进行基本单元测试的所有内容。我还非常喜欢 twill selenium来测试整个堆栈。

0
你可以尝试使用tddspry,它是一个用于在nosetests和twill中测试Django的辅助工具集合。Nose还有一个覆盖率插件,可以生成漂亮的覆盖报告。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接