跳转到主要内容

nosedjango通过提供Nose生态系统中的所有测试功能,为Django项目增添了神奇的功能。使用多进程、xunit、覆盖率等,甚至可以编写自己的插件,将其钩入NoseDjango插件系统(一个具有插件系统的插件!)

项目描述

https://travis-ci.org/nosedjango/nosedjango.svg?branch=issue_30

Nosedjango将Nose及其插件生态系统的好处带给Django测试的世界。Nose已经有了多进程、覆盖率、标记、分析、跳过、xunit插件等插件。Nosedjango意味着你不必重新发明轮子。

使用nosedjango最有说服力的理由可能是使用多进程模块时的性能提升。(在核心i7笔记本电脑上运行的具有密集型测试套件的运行)

使用sqlite的常规Django测试运行器

$ ./manage.py test account
...
Ran 65 tests in 507.930s

OK

具有8个进程的NoseDjango

$ nosetests --with-doctest --with-django --django-settings pstat.settings --with-django-testfs --with-django-sqlite --processes 8 pstat.account
...
Ran 65 tests in 35.731s

Nose大约快14倍。

易于扩展

此外,Nosedjango提供自己的插件系统,以钩入低级别的特定于Django的测试操作。Nosedjango包含以下插件:

  • 为测试创建一个独立的文件存储位置。

  • 使用内存中的sqlite数据库。

  • 为集成式测试启动cherrpy服务器。

  • 使测试Celery更容易。

  • 创建并使用Sphinx搜索索引进行全文搜索测试。

  • 为需要外部资源的东西(如Selenium)打开SSH隧道。

  • 在无头虚拟帧缓冲区中运行Selenium2功能测试。

  • 从命令行选择性地切换不同类型测试的设置。

插件负责查找你的应用程序settings.py文件和创建/销毁测试数据库。它还支持固定装置,并且有一个实验性的机制,可以将测试包装在事务中以提高测试速度。

此插件与Django版本1.2和1.3兼容。

基本用法

可以使用以下命令运行单元测试

nosetests --with-django [nose-options]

命令行选项

除了默认的nose命令行选项之外,nosedjango还提供以下选项

--django-settings=MODULE

指定自定义Django设置MODULE。指定的MODULE需要在sys.path中找到。

--django-sqlite

如果设置,则使用内存中的sqlite数据库进行测试。

--django-interactive

以交互模式运行测试(请参阅DjangoTestSuiteRunner 文档)。默认:false。

通过多进程并行测试运行

Nosedjango 默认的一个简单优势是能够安全地将测试分布在多个进程中,这在多核机器上可以显著加快测试运行速度。

在最简单的情况下,以下命令将在两个核心上分布式运行您的测试,使用内存中的 sqlite 数据库和单独的文件存储位置来最小化文件冲突冲突

nosetests --with-django --with-django-sqlite --with-django-testfs --processes=2 <your_project_module>

安装

通过 Pip 安装非常简单

$ pip install -e git+git://github.com/nosedjango/nosedjango.git#egg=nosedjango

运行 Nosedjango 测试套件

尝试您的 nosedjango 安装的一个简单方法是自己尝试测试套件

$ python setup.py nosetests

Django Testrunner 的偏差

Nosedjango 与 Django 的正常 testrunner 在一些决策上有所不同,根据您的项目,您可能需要调整所有测试以正确运行。

默认跳过 doctests

默认情况下,Nose 仅在包含 --with-doctest 选项时运行 doctests。Nosedjango 遵循此默认值而不是 Django 的默认值,因此如果您想运行 doctests,请将 --with-doctest 添加到您的选项中。

测试发现

Nosedjango 依赖于 Nose 的测试发现方法,这意味着 Nose 可能会发现一些 Django 未运行的测试。

数据库模式并非每次测试都会重新创建

出于性能原因,数据库模式只创建一次。

Fixture 加载

Nose 支持模块级别的 fixtures,Nosedjango 也一样。这意味着如果您在测试模块中有一个 fixtures 变量,Nosedjango 会加载它。

例如

fixtures = ['cheese.json', 'cakes']

def test_cheesecake():
    # do something...

测试之间清除缓存

与 Django 的新版本一样,在每个测试运行之间都会清除缓存。如果您有依赖于其他测试修改缓存的测试(tsk tsk tsk),那么您需要修改这些测试以使其在 Nosedjango 下工作。

忽略对 TestCase.fixtures 的修改

如果您依赖通过 __init__ 或实际测试期间修改 TestCasefixtures 属性,那么您是一个不道德的人。此外,NoseDjango 不会尊重此更改,而是会尊重在类定义时分配的 fixtures 的值。

插件系统

Nosedjango 的插件系统深受 Nose 自身系统的启发,并为 Django 测试运行过程提供了大量钩子。Nosedjango 插件实际上是 Nose 插件,它们可以访问额外的钩子。要查看可用的钩子,请查看 nosedjango.plugins.base_plugin.Plugin。插件应该扩展该类。

更好的文档有望即将推出,但阅读包含的 file_storage_pluginsqlite_plugin 的源代码,以及 Nose 关于编写插件的文档,应提供线索。解决非常项目特定的测试需求的一个示例是位于 https://github.com/jlward/nosedjango-pstat 的 NoseDjango 插件。

已知问题

  • 多进程测试目前仅适用于内存中的 sqlite。不过这个问题很容易修复,欢迎提交 pull request。

  • Nosedjango 与 Nose 1.0 及以上版本不兼容,因为 Nose 的多进程模块发生了变化。目前正在进行调查。

作者

NoseDjango 目前由 Wes Winham 维护 <winhamwr@gmail.com>。它之前由 Jyrki Pulliainen 维护 <jyrki.pulliainen@inoi.fi>。

原始插件由 Victor Ng <crankycoder@gmail.com> 提供,他重写了 Jason Pellerin 的原始 nose-django 插件。

有关所有贡献者,请参阅 AUTHORS 文件。

贡献

此项目和其问题目前托管在 github 上。如果您发现错误或有功能请求,请使用 github 的问题跟踪器

欢迎提交补丁 :)

许可

本软件使用 GNU LESSER GENERAL PUBLIC LICENSE 版本 3 或(根据您的选择)任何后续版本进行许可。有关更多详细信息,请参阅 COPYING

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解有关 安装包 的更多信息。

源分布

nosedjango-1.1.0.tar.gz (37.4 kB 查看哈希)

上传时间

支持者

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页面