【问题标题】:How do I unit test Django Views?如何对 Django 视图进行单元测试?
【发布时间】:2010-11-24 23:48:28
【问题描述】:

我想开始将单元测试集成到我的 Django 项目中,但我发现单元测试视图很棘手,因为 Django 使用函数实现视图的方式。

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

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

【问题讨论】:

    标签: python django unit-testing views


    【解决方案1】:

    我不确定测试视图有多棘手。

    您只需使用test client

    代码覆盖很容易。您推理 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 
    

    【讨论】:

    • 嗯,这可以回答我的另一个问题。在django项目/app层次结构中添加其他模块时如何管理目录结构?
    • test_all.py 如何工作?我假设我想把所有东西都放到一个大的 TestCase.TestSuite 中,然后运行它。这样,所有测试统计信息(通过和失败)最终都会汇总到单个输出中。我无法决定是否应该自定义 Django 的“manage.py 测试”来运行额外的单元测试,或者编写自己的包含 Django 单元测试的顶级测试运行器。
    • @Tartley:首先,试试 Django 的manage.py test。 80% 的时间,这就是你所需要的。如果你有更复杂的 RESTful web 服务(作为其他服务的服务器和客户端)或 Django “典型”框架之外的其他模块,那么你可能会发现不能简单地使用 Django 测试框架,需要额外编写 @ 987654324@ 测试。在这种情况下,您是 test_all 调用 Django,然后调用单元测试。不要调整他们的代码。只需编写您可以编写的最简单的脚本,该脚本使用他们的并使用 unittest。
    • 感谢洛特先生的建议!你是对的,我们已经开始将测试放在 Django 寻找测试的通常位置之外(即顶级“acceptancetests”目录(测试跨越应用程序的用户可见功能)和低级单元测试在 repo 上,不仅仅是在 Django 应用程序“test.py”脚本中。我已经编写了一个快速脚本,它搜索树中的所有模块以查找 TestCase 的子类,将它们放入一个套件中,然后运行它。这确实捕捉 Django 测试用例,以及我们自己的非 django 单元测试。
    • @Tartley:“搜索树中所有模块以查找 TestCase 子类的快速脚本”应该已经是 unittest 的一部分。在这里小心,因为其中许多功能已经可用。
    【解决方案2】:

    django.test.client 应该包含视图基本单元测试所需的一切。我也很喜欢 twillselenium 来测试整个堆栈。

    【讨论】:

      【解决方案3】:

      你可以试试tddspry - 帮助者集合,用鼻子测试和斜纹布测试 Django。鼻子也有覆盖插件,可以生成漂亮的覆盖报告。

      【讨论】:

        猜你喜欢
        • 2016-12-16
        • 1970-01-01
        • 2012-03-29
        • 2016-01-30
        • 1970-01-01
        • 2013-09-29
        • 2021-12-15
        • 1970-01-01
        • 2011-02-23
        相关资源
        最近更新 更多