我该如何单元测试Django视图?
我想在我的Django项目中开始加入单元测试,但我发现测试视图(view)有点棘手,因为Django是用函数来实现视图的。
举个例子,如果一个函数有一个网址,那这个函数就是Django中的一个视图或页面。
那么,我该怎么对Django的视图进行单元测试呢?
3 个回答
0
你可以试试 tddspry 这个工具,它是一些帮助你用 nosetests 和 twill 来测试 Django 的小工具集合。Nose 还有一个覆盖率插件,可以生成很漂亮的覆盖率报告。
11
我不太明白为什么测试视图会很麻烦。
其实你只需要用一下 测试客户端 就可以了。
代码覆盖率很简单。你只要想想一个网址请求是如何对应到代码路径的,然后发出相应的网址请求。
如果你愿意,也可以通过创建一个请求对象来“手动”调用视图函数,并检查响应对象,但这样做会比较麻烦。
如果你对代码覆盖率有疑问,那其实是好事。这说明你有一些代码无法轻易对应到网址(而用户在使用网页应用时只能看到网址)。如果有代码无法对应到网址,你可能应该考虑要么(a)删除这段代码,要么(b)把它重构成一个单独的模块。
我们的视图函数外面有很多模块。我们的视图函数会导入这些模块。我们用普通的单元测试来测试这些“视图函数外部”的模块。
下面是一个典型的结构。
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