nosedjango通过提供Nose生态系统中的所有测试功能,为Django项目增添了神奇的功能。使用多进程、xunit、覆盖率等,甚至可以编写自己的插件,将其钩入NoseDjango插件系统(一个具有插件系统的插件!)
项目描述
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__ 或实际测试期间修改 TestCase 的 fixtures 属性,那么您是一个不道德的人。此外,NoseDjango 不会尊重此更改,而是会尊重在类定义时分配的 fixtures 的值。
插件系统
Nosedjango 的插件系统深受 Nose 自身系统的启发,并为 Django 测试运行过程提供了大量钩子。Nosedjango 插件实际上是 Nose 插件,它们可以访问额外的钩子。要查看可用的钩子,请查看 nosedjango.plugins.base_plugin.Plugin。插件应该扩展该类。
更好的文档有望即将推出,但阅读包含的 file_storage_plugin 和 sqlite_plugin 的源代码,以及 Nose 关于编写插件的文档,应提供线索。解决非常项目特定的测试需求的一个示例是位于 https://github.com/jlward/nosedjango-pstat 的 NoseDjango 插件。
已知问题
多进程测试目前仅适用于内存中的 sqlite。不过这个问题很容易修复,欢迎提交 pull request。
Nosedjango 与 Nose 1.0 及以上版本不兼容,因为 Nose 的多进程模块发生了变化。目前正在进行调查。
贡献
此项目和其问题目前托管在 github 上。如果您发现错误或有功能请求,请使用 github 的问题跟踪器。
欢迎提交补丁 :)
许可
本软件使用 GNU LESSER GENERAL PUBLIC LICENSE 版本 3 或(根据您的选择)任何后续版本进行许可。有关更多详细信息,请参阅 COPYING。
项目详情
nosedjango-1.1.0.tar.gz 的哈希
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 7837b890e11041c846a5d8f20478dd390f1ae958da3f5d6423f1197fcb60238f |
|
MD5 | b648b17b6ea5dc1591a329809d9552ba |
|
BLAKE2b-256 | cf6745d829477b91d14ccea7e825f85b048d94a75b9a930de763933a70ca93ca |