11 KiB
title | localeTitle |
---|---|
Creating a Project with Django | 使用Django创建项目 |
既然我们知道如何创建虚拟环境并使用pip,我们就可以开始构建我们的项目了。在本文中,我们将创建我们的第一个Django项目,编写测试,并启动我们的开发服务器。
创建虚拟环境
首先,让我们为这个项目创建一个新的虚拟环境。 (如果您还没有,请通过在终端中键入deactivate
来deactivate
以前的virtualenv)。有关虚拟环境以及如何使用它们的更多信息,请访问此页面 。
导航到您想要Django项目的目录,并在终端中键入以下内容:
mkvirtualenv taskplanner --python=/usr/bin/python3
如果它看起来与上面的路径不同,您可能必须更改Python路径。
现在,命令行shell应如下所示,表明您处于虚拟环境中。
(taskplanner)<a href='https://sites.google.com/a/chromium.org/chromedriver/downloads' target='_blank' rel='nofollow'>munsterberg@Lenovo ~/workspace] $
如果它看起来不像那样,只需输入:
workon taskplanner
我们现在可以安装Django了:
pip install Django
创建我们的Django项目
安装Django后,我们可以创建我们的项目:
django-admin.py startproject taskplanner
接下来,键入以下内容导航到我们的新项目:
cd taskplanner
在我们做任何事情之前,让我们使用virtualenvwrapper将此目录设置为我们的工作目录:
setvirtualenvproject
旁注 :有关virtualenvwrapper命令的列表,请在终端中键入virtualenvwrapper
。
现在,当我们处于虚拟环境中时,我们可以输入cdproject
直接导航到我们的工作目录。
您的项目目录应如下所示:
taskplanner // our main working directory
|--- manage.py // similar to the django-admin script, you will see this used a
// lot throughout our project
|--- taskplanner
|--- __init__.py // this just tells python to treat this directory as a package
|--- settings.py // main configuration file for our project
|--- urls.py // we will use this to configure urls
|--- wsgi.py // this is used for deploying our project to a production server
功能测试
测试驱动开发是开发软件中广泛使用的最佳实践。基本上,我们希望首先编写一个必然会失败的测试,然后编写尽可能少的代码来通过该测试。使用Django,我们的目标是在整个开发过程中编写功能测试(也称为集成测试,端到端测试等)和单元测试。不要出汗,测试并不像看起来那么困难!
但首先,我们需要创建一个专门用于测试的新虚拟环境。在终端中打开一个新选项卡,导航到您的任务计划项目目录并键入:
mkvirtualenv taskplanner_test --python=/usr/bin/python3
现在,您应该在终端中打开2个选项卡,一个位于(taskplanner)虚拟环境中,另一个位于(taskplanner_test)虚拟环境中。
如果在我们的新测试环境(taskplanner_test)中键入pip freeze
,您将看不到任何内容。这是因为我们还没有在新环境中安装任何东西。
所以让我们先将Django安装到我们的测试环境中(taskplanner_test):
pip install Django
要创建我们的功能测试,我们需要一些东西。首先,我们需要在我们的机器上安装Firefox Web浏览器。如果您没有Firefox,请立即安装。
旁注 :您可以使用Chrome进行集成测试,但是您必须在此处下载驱动程序并遵循此堆栈溢出问题 。在运行集成测试时,Firefox的性能始终优于chrome,这是一个非常重要的考虑因素,因为与单元测试相比,集成测试非常慢。
这是因为集成测试正在测试整个系统,而不是“单元”(小组件)。在现实世界中,有时最好避免集成测试,因为创建它们需要很长的开发时间,运行时间慢,模糊错误以及您及时发现的其他原因。
但是,在开发真实世界的应用程序时,它们仍然值得我们考虑,尽管性能下降,但在可靠性方面仍然非常有用。
接下来,我们需要安装一个名为Selenium的软件包。这个包将为我们提供一个WebDriver,以便我们可以使用我们的测试来控制浏览器。 Selenium通常用于自动化您的浏览器。
pip install selenium
现在我们已经安装了,我们需要一个目录来创建我们的测试:
mkdir functional_tests
在taskplanner
目录中,您现在应该看到以下内容:
taskplanner
|-- functional_tests
|--- manage.py
|--- taskplanner
...
我们现在需要在functional_tests
文件夹中创建一些文件。我们将创建一个__init__.py
文件(这将告诉python将functional_tests
视为一个包),以及一个test_all_users.py
文件来包含我们的测试。
我们现在就这样做:
touch functional_tests/__init__.py
touch functional_tests/test_all_users.py
旁注 : __init__.py
几乎总是一个空文件。有关它的用途的更多信息,请参阅此stackoverflow答案。
我们终于可以开始编写第一个功能测试!功能测试用于在我们的Web应用程序中测试功能块。使用Python的TDD将功能测试描述为“应用程序如何从用户的角度运行”。
那么让我们在文本编辑器中打开test_all_users.py
文件。首先,我们想要导入selenium的webdriver,为了使这更容易,Django提供了一些名为StaticLiveServerTestCase的实时测试。我们现在导入这两个:
from selenium import webdriver
from django.contrib.staticfiles.testing import StaticLiveServerTestCase
由于我们是从用户角度进行测试,因此我们将这些测试命名为NewVisitorTest。添加以下内容:
class NewVisitorTest(StaticLiveServerTestCase):
def setUp(self):
self.browser = webdriver.Firefox()
self.browser.implicitly_wait(2)
def tearDown(self):
self.browser.quit()
首先,我们创建一个名为NewVisitorTest的StaticLiveServerTestCase类,它将包含我们要为新访问者运行的测试。然后,我们有两个名为setUp和tearDown的方法。我们运行测试时初始化setUp方法。因此,对于我们运行的每个测试,我们打开Firefox并等待2秒钟以加载页面。 tearDown在每次测试完成后运行,此方法在每次测试后为我们关闭浏览器。
现在我们可以编写第一个测试,让Firefox自动打开和关闭。我们现在在tearDown方法下面编写我们的测试。
def test_home_title(self):
self.browser.get('http://localhost:8000')
self.assertIn('Welcome to Django', self.browser.title)
我们第一次测试,多么令人兴奋让我们来看看吧。我们要创建的每个测试都必须以'test'开头。例如,如果我想为我的css创建一个测试,我会调用方法test_h2_css
。所以在这里,我们将测试命名为test_home_title
。这是非常不言自明的,这正是我们对测试的要求。该方法首先将Firefox引入URL http://localhost:8000
,然后检查“欢迎使用Django”是否在html head标签中。
我们现在运行此测试,看看会发生什么:
python manage.py test functional_tests
首先,我们究竟在这里输入什么? manage.py脚本为我们提供了一个名为'test'的东西,我们将使用它来运行我们所有的测试。这里我们在我们使用__init__.py
文件创建的functional_tests
包上运行它。
运行此之后,您应该在终端中看到以下内容:
F
======================================================================
FAIL: test_home_title (functional_tests.test_all_users.NewVisitorTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/username/url/to/project/taskplanner/functional_tests/test_all_users.py", line 15, in test_home_title
self.assertIn('Welcome to Django', self.browser.title)
AssertionError: 'Welcome to Django' not found in 'Problem loading page'
----------------------------------------------------------------------
Ran 1 test in 4.524s
FAILED (failures=1)
所以它失败了,但它给了我们一些方便的建议。首先是AssertionError。 “问题加载页面”中未找到“欢迎使用Django”。这意味着http://localhost:8000
的标题是“问题加载页面”。如果您导航到该网址,您将看到该网页不可用。
让我们尝试运行我们的Django服务器以通过测试。切换回taskplanner
虚拟环境中的终端选项卡并运行我们的服务器。
python manage.py runserver
您应该看到如下内容:
Performing system checks...
System check identified no issues (0 silenced).
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
March 06, 2016 - 20:53:38
Django version 1.9.4, using settings 'taskplanner.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
不要担心未应用的迁移消息。
现在我们在http://localhost:8000
运行了一个服务器,让我们再次运行我们的测试。
返回taskplanner_test
虚拟环境中的另一个终端选项卡,再次运行以下命令:
python manage.py test functional_tests
您应该看到以下内容。
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 1 test in 4.033s
OK
Destroying test database for alias 'default'...
我们做了什么
我们第一次通过测试!
我们在本文中已经介绍了很多内容。我们创建了我们的第一个项目,为开发和测试目的设置虚拟环境,编写了我们的第一个功能测试,并通过编写失败的测试,然后使其通过,遵循测试驱动的开发过程。
使用入门模板
使用django入门模板启动项目,可以节省大量时间。这些项目使用最佳实践,以便在项目增长后节省您的麻烦。 一些比较受欢迎的项目是