GitLab CIでユニットテストを自動化する

こんにちは。データサイエンスチームのtmtkです。
この記事では、GitLab上で簡単にユニットテストを自動化できるGitLab CIを紹介します。

はじめに

CI(継続的インテグレーション、continuous integration)というものがあります。プログラムの開発効率や品質の向上のため、ビルドやテストを継続的に実行していくことです。具体的にはたとえば、Gitのリポジトリに変更点がpushされるごとに自動的にビルドやテストを実行するように設定します。そうすれば、間違えてビルドを破壊してしまったりテストを通らなくしてしまったりしても、自動的に実行されたテストによってすぐに気付くことができます。
通常、CIの環境を整備するにあたっては、ビルドやテストを実行するサーバを用意する必要があります。ビルドやテストの実行を起動するソフトウェアも必要となります(たとえばJenkinsなど)。
GitLabはGitLab社が開発するオープンソースのGitリポジトリの管理ツールです。Wiki機能、Issue Tracker機能、CI/CD機能などがついています。
GitLabはオープンソースのソフトウェアなので自分でインストール・管理することが可能ですが、GitLab社が管理するGitLabもあり、GitLab.comで利用できます。GitLab.comでは、GitHubと違いプライベートなリポジトリを無料で管理できるところが魅力です。
GitLab CIではCIでのビルドやテストのためにサーバがGitLab.com側によって用意されているため、自分で用意する必要がなく、手軽にCIの設定をできます。
今回は、GitLab.com上でGitLab CIを使うことで簡単にCIが導入できるところを見てみます。Pythonでの例を紹介します。

Gitリポジトリの作成

それでは、実際にGitLab上でユニットテストを自動化します。GitLab.comでアカウントを登録し、ログインしておきます。SSH公開鍵の設定なども済ませておきます。
GitLab.comから、「New Project」をクリックし、プロジェクト作成画面に進みます。

「Project name」欄に「gitlab-ci-test」と入力し、「Create project」をクリックしてプロジェクトを作成します。

ターミナルから

git clone git@gitlab.com:[あなたのGitLab.comでのユーザー名]/gitlab-ci-test.git

と入力して、いま作ったプロジェクトをクローンします。

プログラムの作成

cd gitlab-ci-test

と入力し、いまクローンしたリポジトリに移動します。テスト対象のファイルとして、main.pyを以下の内容で作成し、保存します。

def plus1(x):
    return x + 1

また、ユニットテストを記述するファイルとして、test_main.pyを以下の内容で保存します。

from main import *

def test_plus1():
    assert plus1(1) == 2

これで、与えられた数に1を足して返す関数plus1と、それをテストする関数test_plus1を作ることができました。

GitLab CIの設定

次に、GitLab CIを使うため、GitLab CIの設定ファイルを記述します。GitLab CIの設定ファイルを作るには、リポジトリのルートに.gitlab-ci.ymlというYAMLファイルを作ればいいです。.gitlab-ci.ymlを以下の内容で作成します。

image: python:3-alpine

before_script:
  - pip install pytest pytest-cov

test:
  script:
    - pytest --cov=.

このように記述すると、GitLab CIで、Docker Hubからpythonイメージを取得し、そのイメージ上でpip install pytest pytest-covpytest --cov=.を順に実行します。
以上の手順でmain.pytest_main.py.gitlab-ci.ymlの3つのファイルを作成できたら、GitLab.comにpushします。

git add .
git commit -m "first commit"
git push

すると、GitLab.com上で自動的にテストが実行されます。https://gitlab.com/[あなたのユーザー名]/gitlab-ci-test にアクセスし、左側のメニューから「CI/CD」をクリックします。すると、自動的にテストが実行されている様子がわかります。


もしテストが失敗すると、メールで自動的に通知されます。

Test Coverageの測定

GitLabにTest Coverageを取得させることもできます。取得させるには、GitLab.com上のリポジトリのページにアクセスし、「Settings→CI/CD→General pipelines→Test coverage parsing」と進み、「\d+\%\s*$」と入力して「Save changes」をクリックします。その後、テストを再実行すると、Test CoverageがGitLabから取得できていることがわかります。



なお、Scala + sbt + ScalaTest + sbt-scoverageという構成でテストを自動化する場合は、「Test coverage parsing」にはCoverage was \[\d+\.\d+\%\]と入力するといいようです。.gitlab-ci.ymlなどの設定については、公式のGitLab-examples / scala-sbt-sample-app · GitLabが参考になります。

まとめ

この記事では、GitLab CIを使って簡単にCIを設定できることを見ました。
GitLab.comでのGitLab CIでは、GitLabで用意されているコンピュータ上でビルドやユニットテストを実行できるので、自分でCI用のマシンを準備する必要がなく、とても便利です。
CIが導入されないまま開発が進み、ビルドやテストが破壊され放置されているようなプロジェクトになってしまうと、その状態からCIを導入するのは大変です。CIを早めに導入して、健全な開発体制を維持しましょう。

参考文献

AWS移行支援キャンペーン

あなたにおすすめの記事