6.8 测试策略

在项目中包含测试代码当然很好,但是如何运行这些测试也相当重要。实际上,在许多项目中尽管包含了测试代码,但是测试代码却由于各种原因无法运行。

尽管这个主题并不局限于Python,但是考虑到其重要性,这里还是要强调一下:要对未测试代码零容忍。没有一组合适的单元测试覆盖的代码是不应该被合并的。

广告:个人专属 VPN,独立 IP,流量大,速度快,连接稳定,多机房切换,每月最低仅 10 美元

最低目标是保证每次代码提交都能通过所有测试,最好是能以自动的方式实现。

例如,OpenStack会依赖基于Gerrit(https://code.google.com/p/gerrit/)、Jenkins(http://jenkins-ci.org/)和Zuul(http://ci.openstack.org/zuul/)的一个特定工作流程。每次代码提交都会经过基于Gerrit的代码评审系统,同时Zuul负责通过Jenkins运行一组测试任务。Jenkins会针对各个项目运行单元测试以及各种更高级别的功能测试。这可以保证提交的代码能通过所有测试。由众多开发人员完成的代码评审保证所有被提交的代码都是具有相应的单元测试的。

如果正在使用流行的GitHub托管服务,Travis CI(https://travis-ci.org/)提供了一种在代码的签入(push)、合并(merge)或签出(pull)请求后运行测试的方式。尽管在提交后执行测试有些差强人意,但这仍然是针对回归问题的一种不错的方式。Travis支持所有主要的Python版本,并可以高度定制。一旦通过它们的Web界面在项目中激活了Travis,就可以通过加入一个简单的.travis.yml文件(如示例6.17所示)来完成后续工作。

示例6.17 .travis.yml文件的例子

language: python
python:
  - "2.7"
  - "3.3"

# command to install dependencies
install: "pip install -r requirements.txt --use-mirrors"
# command to run tests
script: nosetests

无论你的代码托管在哪里,都应该尽可能实现软件测试的自动化,进而保证项目不断向前推进而不是引入更多bug而倒退。