我希望开始将单元测试集成到我的Django项目中,但是我发现由于Django使用函数实现视图,因此对视图进行单元测试有些棘手。
例如,如果函数具有URL,则每个函数在Django中都是一个视图/页面。
我该如何对Django视图进行单元测试?
我希望开始将单元测试集成到我的Django项目中,但是我发现由于Django使用函数实现视图,因此对视图进行单元测试有些棘手。
例如,如果函数具有URL,则每个函数在Django中都是一个视图/页面。
我该如何对Django视图进行单元测试?
我不确定为什么测试视图会很棘手。
你只需要使用测试客户端。
代码覆盖率很容易。你推理出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
manage.py test
。80%的情况下,这就足够了。如果你有更复杂的RESTful Web服务(既作为其他服务的服务器和客户端),或者在Django“典型”框架之外的其他模块中,那么你可能会发现你不能简单地使用Django测试框架,需要编写额外的unittest
测试。在这种情况下,你的test_all
调用Django的测试框架,然后调用单元测试。不要修改他们的代码。只需编写最简单的脚本,使用他们的代码并使用unittest即可。 - S.Lottunittest
的一部分了。在这里要小心,因为许多这些功能已经可用。 - S.Lott