ちょっと話題の記事

インフラエンジニアのためのCodeCommitで覚えるユニットテスト

私のようなインフラエンジニアの中にはPythonに興味があるかたが多いように感じています。 本記事では、Code Commitに絡めてPythonのユニットテストに関係する2点を紹介し、ユニットテストやCode Commitの利用イメージをお伝えします。 1. Pythonでプログラムを作成、テストし、オリジンにpushする流れ 1. 機能追加してプルリクエストする流れ
2018.05.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

私のようなインフラエンジニアの中にはPythonに興味があるかたが多いように感じています。 本記事では、CodeCommitに絡めてPythonのユニットテストに関係する2点を紹介し、ユニットテストやCodeCommitの利用イメージをお伝えします。

  1. Pythonでプログラムを作成、テストし、オリジンにpushする流れ
  2. 機能追加してプルリクエストする流れ

電卓プログラムの作成

足し算機能を持つ電卓プログラムを作成します。 作成したプログラムをテストし、オリジンにpushします。

CodeCommitでリポジトリを作成

リポジトリの作成

CodeCommitのコンソールに接続し、リポジトリを作成します。 リポジトリ名はpython-calculatorとしました。

リポジトリのクローン

リポジトリを作成すると、git cloneする手順が表示されます。 大きく以下の手順になります。

  1. IAMユーザーに公開鍵を登録
  2. SSH 設定ファイルにCodeCommitへの接続情報を記載
  3. ローカルにクローンを作成する

クローンに成功すると、ローカルにpython-calculatorディレクトリが作成されます。

電卓プログラムの作成

足し算の関数を作成し、calc.pyとして保存します。

def plus(x,y):
    return x + y

足し算関数のユニットテスト

足し算関数のテストを行います。 testsディレクトリにテストファイル(test_calc.py)を配置します。 __pycache__は自動で作成されます。

$ tree
.
├── __pycache__
│   └── calc.cpython-35.pyc
├── calc.py
└── tests
    ├── __pycache__
    │   └── test_calc.cpython-35.pyc
    └── test_calc.py

3 directories, 4 files
$

test_calc.pyは以下のようにします。 assertEqualは第1引数と第2引数がイコールになるか確認します。 テストプログラムでは、calc.pyのplus関数に引数3と5を与えて、8になるか確認します。 ユニットテストフレームワークの詳細は公式ドキュメントをご覧ください。

import unittest
import calc

class TestCalc(unittest.TestCase):
    def test_plus(self):
        self.assertEqual(calc.plus(3,5), 8)

ユニットテストを実行すると、"OK"になります。

$ python3 -m unittest tests.test_calc
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
$

「self.assertEqual(calc.plus(3,5), 8)」を「self.assertEqual(calc.plus(2,7), 10)」に変更して、テストを実行します。 2+7は9なので、テストに失敗します。

$ python3 -m unittest tests.test_calc
F
======================================================================
FAIL: test_plus (tests.test_calc.TestCalc)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/tests/test_calc.py", line 6, in test_plus
    self.assertEqual(calc.plus(2,7), 10)
AssertionError: 9 != 10

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)
$

オリジンへのpush

オリジンにpushしましょう。

git add ./*
git commit -m "initial commit"
git push origin master

CodeCommitコンソールに反映されていれば、成功です。

電卓プログラムへの機能追加

作成した電卓プログラムには、足し算の機能しかありません。 引き算の機能を追加、テストし、プルリクエストします。

devブランチの作成

開発用のdevブランチを作成します。

$ git checkout -b dev
Switched to a new branch 'dev'
$ git branch
* dev
  master
$

引き算関数の追加

calc.pyに引き算関数(minus)を追加します。

def plus(x,y):
    return x + y

def minus(x,y):
    return x - y

引き算関数のユニットテスト

引き算関数をテストします。 test_minus関数をtest_calc.pyに追加します。 10引く3をminus関数で実行し、7になるかをテストします。

import unittest
import calc

class TestCalc(unittest.TestCase):
    def test_plus(self):
        self.assertEqual(calc.plus(3,5), 8)
    def test_minus(self):
        self.assertEqual(calc.minus(10,3), 7)

ユニットテストを実行すると、OKになります。

$ python3 -m unittest tests.test_calc
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$

プルリクエストの作成

devブランチをオリジンにpushします。

git add ./*
git commit -m "add minus function"
git push origin dev

CodeCommitコンソールに反映されます。

プルリクエストの作成

プルリクエストの作成を選択します。

devとmasterを比較します。 コンフリクトがなく、マージ可能なことがわかります。

変更内容が表示されます。 minus関数が追加されていることがわかります。

タイトル、説明を記載してプルリクエストを作成します。

プルリクエストのマージ

プルリクエストをマージします。

引き算機能(minus関数)がmasterに反映されました。

さいごに

CodeCommitに絡めてPythonのユニットテストを紹介しました。 電卓プログラムに足し算の関数を作成して、ユニットテストを行いました。 テストに合格したプログラムはCodeCommitにpushしました。

devブランチを作成し、引き算の関数を追加しました。 引き算についてもユニットテストを行い、合格したプログラムをプルリクエストしました。 CodeCommitコンソールから、devとmasterの差分を確認し、マージしました。

本記事がCodeCommitやユニットテストの理解に役立てば幸いです。

参考