前言
一个项目如何保证代码质量是开发中非常重要的环节,对于开源项目来说更是如此,因为开源项目要面对的是来自不同水平开发者提交的代码。所以围绕开源做持续集成(Continuous Integration)变得越来越重要,而目前使用最广泛的免费CI工具当数Travis CI
我们可以在github中常见到这些图标,就是集成测试的效果
点链接,还可以看成集成测试的过程
Travis CI能做的最主要工作是自动运行项目的单元测试并生成报告。进入项目的Travis CI页面,可以看到最新版本的测试情况,默认设置下,每次对项目进行Push时,都会触发Travis CI运行一次测试,测试环境包括各种版本的不同情况。Travis CI同时提供了一个项目状态图标,可以放置在项目主页告知用户当前的测试情况.
测试工具
unittest单元测试
nose将测试用例聚合和进行回归测试
coverage确定代码覆盖率
PyLint扫描代码
关于测试
例如django中每个子类必须要有测试
- from django.test import TestCase
- class SimpleTest(TestCase):
- def test_basic_addition(self):
- """
- Tests that 1 + 1 always equals 2.
- """
- self.assertEqual(1+1,2)
- python manage.py test <app_name>
每个view必须要有测试
- class BlogViewsTest(TestCase):
- def test_index(self):
- response =self.client.get(reverse('index'))
- self.assertEqual(response.status_code,200)
fixtures使用
- Fixtures 是一种新的提供初始化数据的方法,并且被Django的测试框架用来处理单元测试的测试数据。
- 不同于SQL文件的是,使用fixture你可以提供一个被 Django的serialization系统所能识别的序列化文件,
- 它会被读取并自动转换成对应的model,然后保存进你的数据库
- 你需要创建一个fixture文件(使用manage.py的dumpdata命令更简单),确保文件名为"initial_data",后缀名可以是json, xml, yaml, python其一。
- 把这个文件放到你的app目录下的fixtures目录里,它就会在执行syncdb的时候创建完你的数据表后自动读取并插入数据。
- 如果你有更多fixtures文件或者你没有在执行syncdb的时候提供fixture的话,你也可以使用manage.py的loaddata命令手工加载fixture
- Fixtures 适用于少量的初始化数据,因为它使用Django的序列化功能,所以不依赖于特定的数据库。
- 它执行起来没有SQL快,因为要创建对象。另外,这个功能可以 在你切换数据库平台的时候使用,
- 比如我要把系统从Mysql切换到PostgreSQL,就可以使用fixtures来导入转出数据
- python manage.py dumpdata app_name>app_name/fixtures/file.json
- class BlogViewsTest(TestCase):
- fixtures =['test_data.json']
- def test_index(self):
- response =self.client.get(reverse('index'))
- self.assertEqual(response.status_code,200)
使用
注册账号见https://travis-ci.org/
过程很简单,用github账号授权就行
- 1.使用github账号登录
- 2.指定repo
- 3.编写.travis.yml
- 4.push code
一个简单的.travis.yml的配置文档
- language: python
- python:
- - "2.6"
- - "2.7"
- env:
- - DJANGO=1.4
- - DJANGO=1.5
- - DJANGO=1.6.0
- install:
- - pip install -r requirements.txt --use-mirrors
- script:
- - python manage.py test
- notifications:
- recipients:
- - wengcc@ihep.ac.cn
- on_success: change
- on_failure: always
- irc:
- channels:
- - "irc.freenode.org#cloudsafe"
- on_success: change
- on_failure: always
在github中添加travis.io集成
- .. image:: https://api.travis-ci.org/wcc526/cloudsafe.png?branch=master
- :target: http://travis-ci.org/wcc526/cloudsafe
- .. image:: https://drone.io/github.com/wcc526/cloudsafe/status.png
- :target: https://drone.io/github.com/wcc526/cloudsafe/latest
- 最终效果如图
不明白的,可以参看我这个项目 https://github.com/wcc526/cloudsafe