Python
Django
Jenkins

DjangoでつくったものをJenkinsでCIするまで

More than 3 years have passed since last update.

Djangoでテストを書いて、テストレポート・カバレッジレポートを出力し、Jenkinsにテスト結果を出力するまでのメモ
以下の記事を参考にさせてもらいました。
Django でのテスト

前提

BitbacketとJenkinsを連携済み。
ローカル環境からBitbacketへpushすると、自動でJenkinsのビルドが走り、テストが実行されるようになっている状態。
これらの環境構築については以下のブログを参照のこと。

Bitbucketのprivate repositoryとJenkinsの連携について

Djangoでのテスト環境の構築

モジュールのインストール

pipでdjango-noseとcoverageをインストール。
以前、unittest-xml-reportingを使って同じような環境を作ったことがあったけど、django-noseの方が色々すんなりいった気がする。

$ pip install django-nose coverage

テスト用settingsファイルの設定

テスト用のsettingsファイルにテスト用の設定を記述。

# settings_test.py

# -*- coding:utf-8 -*-
from mysite.settings import *
import os

TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
#カバレッジレポート(html)を出力するフォルダを指定
COVERAGE_REPORT_HTML_OUTPUT_DIR = '.cover'

# テスト実行時の引数の設定(noseの引数)
NOSE_ARGS = [
    '--with-xunit',
    '--with-coverage',
    '--cover-xml',
    '--cover-html',
    '--cover-package=app', #テストを行うapp名を指定
]

#テスト用のB環境の設定(settings.pyのDB環境と分けている)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'test.db'),
    }
}

テスト実行

テストコードをapp配下に作成(app/tests.py)して、以下のようにsettings_testを設定ファイルに指定してテストを実行する。

$ python manage.py test app --settings=mysite.settings_test

mysite/coverにカバレッジレポート(html)が出力され、mysite直下にnosetests.xml、coverage.xmlが出力されていれば成功。
これでJenkinsでCIする準備完了。

Jenkinsでテストレポートを表示

対象プロジェクトの設定画面にて、テストレポートの出力設定を行う。

テストを実行するコマンドを記述

ビルドのシェルの実行を選択し、シェルスクリプトテキストエリアに以下のようなテストを実行するコマンドを記述する。
Jenkinsのビルドが実行された際に、記述したコマンドが実行される。

# virtualenvを実行(あらかじめ任意の場所に環境を構築しておく)
source /var/www/django/mysite/venv/bin/activate
# テストを実行
python manage.py test app --settings=mysite.settings_test

テストレポート(xmlファイル)の指定

ビルド後の処理のCobertura XMLレポートパターン、JUnit結果の集計にそれぞれ出力されたxmlファイル名を入力する。
今回はmysite直下にxmlを出力しているので、そのままファイル名を入力すればよい。
スクリーンショット 2014-11-11 1.15.54.png

以上の設定を行うことにより、ビルド実行時にJenkinsにテストレポートが表示されるようになった。

スクリーンショット 2014-11-11 1.29.31.png