ゼロから始める(た) Travis CI

Travis CIって?

Travis CIを使うと、GitHubにコードをプッシュするだけで自動的にコードのテストを行ってくれる。
さらにテスト結果がメールで届いたりする。
SignUpからテストの実行まで,一通り行ったので手順をメモっておく。

このページを読むと…

Travis CIを使って、プログラムの簡単なテストが出来るようになる。

前提知識

“ゼロから"と言っても、やはり多少の準備は必要

  1. GitHubのアカウントを持っている
  2. git commit,git push等ができる
  3. シェルの基本的なコマンドの意味がわかる (echo hoge > hoge.txt とか)

逆に言えば、これぐらいの知識でも使いはじめることはできるということ

準備編

練習用のリポジトリを作ろう

GitHubの自分のページに、練習用のリポジトリを作成しよう。
practice_Travis_CIでもなんでもOK。

Travis CIに登録しよう

Travis CIのページにアクセスし、Sign Up ボタンを押す。
GitHubのアカウントとパスワードを入力するだけで登録完了。

リポジトリTravis CIに登録しよう

Travis CIのページの左側に、[My Repositories]ボタンがあるのでクリックすると、自分のリポジトリ一覧が見れる。
f:id:katorinax:20170328155620p:plain
リポジトリ名の左側にチェックスイッチがあるので、テストしたいリポジトリのスイッチをONにしておく。


これで準備完了。

実践編

実際にテストを行うには最低でも以下の4つのファイルが必要になる。

  1. テスト対象となるプログラム
  2. テスト内容について記述してある.yml(やむる)ファイル .travis.yml*1
  3. .travis.ymlによって呼び出される、テストを実行するシェルスクリプト
  4. プログラムの望ましい出力結果が記述してあるリファレンスファイル

スイッチオンにしたリポジトリに更新をgit pushすると、.travis.ymlファイルにある記述に従って、自動的にテストが実行される。

それぞれ実際に作成してみる

1 テスト対象のプログラム(target.py)

何でもいい。今回は0~10までの値を標準出力に書き出すpythonプログラム、target.pyにした。

#!/usr/bin/env python
#coding:utf-8
#0から10まで標準出力する

for i in range(11):
    print i

2 .travis.yml

テスト内容について記述してある.ymlファイル。

script:
    sh -e ./test.sh

意味

  • カレントディレクトリにある test.shを-eオプションで実行してね*2

3 テスト用のシェルスクリプト(test.sh)

#!/bin/sh

python target.py > result
diff result ref
echo $?

意味

  • プログラムtarget.pyを実行して、結果をresultってファイルに書き込んでね
  • resultとリファレンス用のファイルrefの内容を、diffコマンドで比較してね(一致すると終了ステータスは0になる)
  • 終了ステータスを吐いてね

4 リファレンス用ファイル(ref)

プログラムの望ましい実行結果が書いてあるファイル
中身

0
1
2
3
4
5
6
7
8
9
10

こんだけ*3

テスト実行

先述の4つのファイル(target.py, .travis.yml, test.sh, ref)を作成し、git add -> git commit -> git push すればOK。
今後はリポジトリの内容を更新してgit pushするたびに勝手にテストが実行される。
結果はTravis CIのページで確認できる。メールで報告も来る。

テスト結果

成功すると(するんだけど)こんな感じ
f:id:katorinax:20170328162625p:plain

target.pyかrefを適当に書き換えると、テスト失敗が帰ってくる。こんな感じ
f:id:katorinax:20170328163006p:plain

もっと

これ↓とか詳しい
knowledge.sakura.ad.jp

おしまい。

*1:このファイルは必ずリポジトリのルートディレクトリに置いておく

*2:-eオプションをつけると実行時エラーが出た時点で処理を中断する

*3:もちろん追加できる内容は他にいくらでもある。これはあくまでも最低限の内容