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

10 投票
3 回答
11257 浏览
提问于 2025-04-15 14:01

我想在我的Django项目中开始加入单元测试,但我发现测试视图(view)有点棘手,因为Django是用函数来实现视图的。

举个例子,如果一个函数有一个网址,那这个函数就是Django中的一个视图或页面。

那么,我该怎么对Django的视图进行单元测试呢?

3 个回答

0

你可以试试 tddspry 这个工具,它是一些帮助你用 nosetests 和 twill 来测试 Django 的小工具集合。Nose 还有一个覆盖率插件,可以生成很漂亮的覆盖率报告。

2

django.test.client 里有你进行基本视图单元测试所需的一切。我个人也很喜欢 twillselenium,它们可以用来测试整个应用的功能。

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 

撰写回答