前言
一个项目如何保证代码质量是开发中非常重要的环节,对于开源项目来说更是如此,因为开源项目要面对的是来自不同水平开发者提交的代码。所以围绕开源做持续集成(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