有没有办法检查Django版本的特性弃用情况?
随着Django的新版本发布,一些功能会被淘汰。有没有办法检查一下现有项目的代码,比如在GitHub上?
有没有工具可以做到这一点?通过测试用例能检测到这些问题吗?
是否也可以对Python的版本进行类似的检查?
我想一个方法是使用tox运行特定版本的Django或Python,然后检查是否有错误。
我希望能找到一种更优雅或直接的方法,比如能直接提示——“注意,这个功能已经被淘汰”,就像在Java这种强类型语言中可以做到的那样。
如果有人想要开发这样一个工具,应该从哪里开始呢?
2 个回答
这是我如何让tox在我的一个项目中运行Django 1.6、1.7和1.8,并显示弃用警告的方法:
[tox]
envlist = {py27,py34}-{django16,django17,django18}
[testenv]
basepython =
py27: python2.7
py34: python3.4
deps =
django16: Django>=1.6,<1.7
django17: Django>=1.7,<1.8
django18: Django>=1.8,<1.9
commands =
python -Wmodule ./manage.py test
-Wmodule
这个参数让Python在模块中第一次出现弃用警告时输出这个警告,这对我来说已经足够了。我能够处理那些使用了from django.core.cache import get_cache
的地方,因为这个在Django 1.9中就会被去掉。
如果-Wmodule
输出的警告太多,你可能想要更有选择性。Python的文档里有关于如何使用这个参数的详细说明,可以查看这里。我故意没有使用-Werror
,因为这样不仅会让单个测试失败,还会导致我的测试套件无法执行任何测试,因为这个套件使用了弃用的功能。
我觉得这个问题应该在你项目的单元测试中处理。
如果你的测试代码使用了在未来版本的Django中会被淘汰的功能,你会收到一些警告。如果你直接使用了一个已经淘汰了这个功能的Django版本,那当然会出现异常和测试失败的情况。
你可以告诉Python解释器把警告当作异常来处理,这样测试就会失败。
这里有一些说明,可以把同样的技巧应用到流行的nosetests测试框架中。
如果你已经知道(从Django文档中)你写的某些代码会根据运行的Django版本而需要更改(比如你在发布一个可重用的Django应用),我建议使用一种特性检测的方法,使用try ... except
。
举个例子,我想有条件地使用Django >= 1.6的新特性transaction.atomic
。
正如你预料的那样,我会用Tox来对不同版本的Django运行测试。