前言
一個項目如何保證代碼質量是開發中非常重要的環節,對於開源項目來說更是如此,因爲開源項目要面對的是來自不同水平開發者提交的代碼。所以圍繞開源做持續集成(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