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