Python测试驱动开发:使用Django、Selenium和JavaScript进行Web编程(第2版)
上QQ阅读APP看书,第一时间看更新

1.1 遵从测试山羊的教诲,没有测试什么也别做

在Python测试社区中,测试山羊是TDD的非官方吉祥物。测试山羊对不同的人有不同的意义。对我来说,它是我脑海中的一个声音,告诉我要一直走在测试这条正确的道路上,就像卡通片中浮现在肩膀上的天使或魔鬼一样,只是没那么咄咄逼人。我希望借由这本书,让测试山羊也扎根于你的脑海中。

虽然还不太确定要做什么,但我们已经决定要开发一个网站。Web开发的第一步通常是安装和配置Web框架。下载这个,安装那个,配置那个,运行这个脚本……但是,使用TDD时要转换思维方式。做测试驱动开发时,你的心里要一直记着测试山羊,像山羊一样专注,咩咩地叫着:“先测试,先测试!”

在TDD的过程中,第一步始终一样:编写测试

首先要编写测试,然后运行,看是否和预期一样失败,只有失败了才能继续下一步——编写应用程序。请模仿山羊的声调复述这个过程。我就是这么做的。

山羊的另一个特点是一次只迈一步。因此,不管山壁多么陡峭,它们都不会跌落。看看图1-1里的这只山羊!

图1-1:山羊比你想象的要机敏(来源:Flickr用户Caitlin Stewart)

我们会碎步向前。使用流行的Python Web框架Django开发这个应用。

首先,要检查是否安装了Django,并且能够正常运行。检查的方法是,在本地电脑中能否启动Django的开发服务器,并在浏览器中查看能否打开网页。使用浏览器自动化工具Selenium完成这个任务。

在你想保存项目代码的地方新建一个Python文件,命名为functional_tests.py,并输入以下代码。如果你喜欢一边输入代码一边像山羊那样轻声念叨,或许会有所帮助:

functional_tests.py

from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://localhost:8000')
assert 'Django' in browser.title

这是我们编写的第一个功能测试(Functional Test,FT)。后面我会深入说明什么是功能测试,以及它和单元测试的区别。现在,只要能理解这段代码做了什么就行。

· 启动一个-Selenium webdriver,打开一个真正的Firefox浏览器窗口。

·在这个浏览器中打开我们期望本地电脑伺服的网页。

· 检查(做一个测试断言)这个网页的标题中是否包含单词“Django”。

我们尝试运行一下:

$ python functional_tests.py
  File ".../selenium/webdriver/remote/webdriver.py", line 268, in get
    self.execute(Command.GET, {'url': url})
  File ".../selenium/webdriver/remote/webdriver.py", line 256, in execute
    self.error_handler.check_response(response)
  File ".../selenium/webdriver/remote/errorhandler.py", line 194, in
check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Reached error page: abo
ut:neterror?e=connectionFailure&u=http%3A//localhost%3A8000/[...]

你应该会看到弹出了一个浏览器窗口,尝试打开localhost:8000,然后显示“无法连接”错误页面。这时回到终端,你会看到一个显眼的错误消息,说Selenium遇到了一个错误页面。接着,你会看到Firefox窗口停留在桌面上,等待你关闭。这可能会让你生气,我们稍后会修正这个问题。

如果看到关于导入Selenium的错误,或者让你查找“geckodriver”错误,或许你应该往前翻,看一下“准备工作和应具备的知识”。

现在,得到了一个失败测试。这意味着,我们可以开始开发应用了。

别了,罗马数字

很多介绍TDD的文章都喜欢以罗马数字为例,闹了笑话,甚至我一开始也是这么写的。如果你好奇,可以查看我在GitHub的页面,地址是https://github.com/hjwp/

以罗马数字为例有好也有坏。把问题简化,合理地限制在某一范围内,让你能很好地解说TDD。

但问题是不切实际。因此我才决定要从零开始开发一个真实的Web应用,以此为例介绍TDD。这是一个简单的Web应用,我希望你能把从中学到的知识运用到下一个真实的项目中。