测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前编写自动化测试。
这个过程很简单:
为什么要用TDD?
使用TDD,你将学会把你的代码拆分成符合逻辑的,简单易懂的片段,这有助于确保代码的正确性。
这一点非常重要,因为做到下面这些事情是非常困难的:
TDD帮助我们定位问题。它不能保证你的代码完全没有错误;然而,你可以写出更好的代码,从而能更好地理解理解代码。这本身有助于消除错误,并且至少,你可以更容易的定位错误。
TTD实际上也是一种行业标准。
说的够多了。让我们来看看代码吧。
在这个教程里,我们将创建一个存储用户联系人的app。
请注意: 这篇教程假设你运行在一个基于Unix的环境里 - 例如, Mac OSX, Linux, 或者在Windows下的Linux VM。 我将使用Sublime 2作为文本编辑器。并且,确保你已经完成了官方的Django教程并且基本了解Python语言. 此外,在这个第一篇post里,我们不会涉及到Django1.6提供的新工具。这篇文章将为之后的post打好基础来处理不同形式的测试。
第一个测试
在开始做一些事情之前,我们需要首先创建一个测试。为了这个测试,我们需要让Django正确安装。为此我们将使用一个函数测试——这在下面会详细解释。
创建一个新目录存放你的项目:
$ mkdir Django-tdd $ cd django-tdd
再建立一个目录存放函数测试
$ mkdir ft $ cd ft
创建一个新文件 "tests.py"并加入以下代码:
from selenium import webdriver browser = webdriver.Firefox()browser.get('http://localhost:8000/')body = browser.find_element_by_tag_name('body')assert 'Django' in body.text browser.quit()
现在运行测试:
$ Python tests.py
确认安装selenium(译注:自动化测试软件)时是使用 installed -pip安装的
你将看到 FireFox弹出来试图打开 :8000/。在你的终端上面你会看到:
Traceback (most recent call last):File "tests.py", line 7, in <module>assert 'Django' in body.textAssertionError
祝贺!你完成了第一个失效测试。
现在我们写足够的代码来让它通过,这些代码量约相当于设置一个 Django 开发环境。
设置Django
1. 激活一个virtualenv:
$ cd .. $ virtualenv --no-site-packages env $ source env/bin/activate
2. 安装Django并且建立一个项目
$ pip install django==1.6.1$ django-admin.py startproject contacts
你当前的项目结构应该是下面这个样子:
复制代码 代码如下:
├── contacts
│ ├── contacts
│ │ ├── __init__.py
│ │ ├── settings.py
│ │ ├── urls.py
│ │ └── wsgi.py
│ └── manage.py
└── ft
└── tests.py
3. 安装 Selenium:
pip install selenium==2.39.0
4. 运行server
$ cd contacts $ python manage.py runserver
5. 接着,打开一个新终端窗口,定位到"ft"文件夹下,再运行一次测试:
$ python tests.py
你将看到FireFox又一次窗口导航到了:8000/。这次应该没有错误了。你刚刚已经通过了你的第一个测试!现在,让我们完成环境设置。
6. 版本控制,首先添加一个".gitignore"并且在里面添加下面的代码:
复制代码 代码如下:
.Pythonenv
bin
lib
include.DS_Store.pyc
现在来创建一个Git仓库然后提交吧
$ git init $ git add .$ git commit -am "initial"
7. 项目建完了,现在我们回头讨论一下功能测试吧。
功能测试
我们通过用 Selenium 来进行第一次测试。这样的测试会使我们使用web浏览器就像我们是最终用户一样,来看看应用程序实际上是怎么运行的。因为这些测试是遵循最终用户的行为习惯——也可以说是用户用例——这个包含了对一系列产品特点进行测试,而不仅仅对单一功能进行测试——这种更适合单元测试。有一点非常需要注意的是,当这部分测试代码你还没开始写,那么你必须先从功能测试开始。由于我们基本上是测试Django的代码,所以功能测试是一个正确的方法去做的。