TDD中的关键一步是编写模拟用户行为的测试, 在构建网站时这就意味着需要和用户一样操作浏览器来测试网站功能, 通常情况下通过selenium操作firefox等浏览器就可以达到这样的目的. 然而我目前的开发环境基于windows 10的POSIX子系统, 该系统并没有GUI界面, 因此需要使用纯字符界面的方法完成测试. 在早先做爬虫项目时使用的PhantomJS是可以达到这个目的的, PhantomJS是一个JS引擎, 相当于一个无界面的浏览器, 使用了Webkit内核, 因此其行为和常用浏览器一致. 使用Selenium可以操作PhantomJS.
不过我在搭建起这个测试环境后Selenium提示已经不再支持PhantomJS了, 转而支持Headless Firefox或Headless Chrome, 查阅资料后发现这两个Headless浏览器不过就是Firefox和Chrome的无界面版本. 以Firefox为例, 在Ubuntu中只要简单的保证系统中安装有Firefox, 在Python虚拟环境中通过conda或pip安装selenium, 另外使用Python导入selenium需要具备一个称为geckodriver的软件才能操作Firefox. Geckodriver是一个单文件的可执行文件, 下载解压后将其路径加入PATH即可, 最后通过一个稍微特殊的语法就可以操作Headless firefox了.
from selenium import webdriver
firefox_options = webdriver.FirefoxOptions()
firefox_options.set_headless()
browser = webdriver.Firefox(firefox_options=firefox_options)
browser.get("http://www.baidu.com")
assert '百度' in browser.title
最后, 使用无界面浏览器除了可以运行在一些无界面系统上之外, 其速度也比有界面浏览器要快, 在测试时, 无论基于什么系统, 从效率上看使用无界面浏览器总是一个相对更好的选择.