GitHubActionsでpipenvのテストをした

[これ](https://github.com/sun-yryr/Rec-adio) に最近プルリクが来て、テスト書かないとな〜って思ったのがきっかけです

# 目次

- unittestを使ってテストコードを書いてみた！
- GitHub Actionsでテストの自動化をしてみた！

# unittestを使ってテストコードを書いてみた！

参考：[https://qiita.com/aomidro/items/3e3449fde924893f18ca](https://qiita.com/aomidro/items/3e3449fde924893f18ca)

書いたコード：[https://github.com/sun-yryr/Rec-adio/blob/feature/test/test/test_func.py](https://github.com/sun-yryr/Rec-adio/blob/feature/test/test/test_func.py)

Pythonには標準モジュールで unittest があります。これを使ってテストコードを書いてみました。

結構運用でカバーしてる部分が多いのでご注意ください

`unittest.TestCase` のサブクラスとして各テストコードを書いていきます

```python
import unittest
import テストするモジュール as f
class TestCalculate(unittest.TestCase):
    def test_add(self):
    	# 足し算のテスト
    	self.assertEqual(f.add(3, 5), 8)
    		
    def test_sub(self):
    	# 引き算のテスト
    	self.assertEqual(f.sub(3, 5), -2)
```

使用可能なassertメソッドは [こちら]([https://docs.python.org/ja/3/library/unittest.html#assert-methods](https://docs.python.org/ja/3/library/unittest.html#assert-methods)) にあります。

テスト用のメソッドは `test` で始まる必要があります。

```python
if __name__ == "__main__":
    unittest.main()
```

mainを呼ぶことでテストが走ります。

複数のファイルに分割してテストコードを書くことがほとんどだと思います。

`python -m unittest discover -v` を実行することで、カレントディレクトリのテストが全部走ります。

## pipenvのscriptsに登録

せっかくpipenvを使っているので、scriptsに登録します。

上記のコマンドはテストコードがあるフォルダで行う必要があるので一工夫加えます。

```shell
[scripts]
test = "bash -c \"cd test ; python -m unittest discover\""
```

テストコードのフォルダに移動する `cd` を先に打つ必要があるので、 `bash -c` で実行してあげます。

```shell
$ pipenv run 
....
----------------------------------------------------------------------
Run 4 tests in 0.386s

OK
```

OKが出れば完成です。

# GitHub Actionsでテストの自動化をしてみた！

テストを作ったら自動化しますよね？

Actions → New workflow → Python application を選びます。

![スクリーンショット 2020-04-11 21.38.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286025/b8c38ddc-ab12-9b4a-954f-943b7a6846dc.png)


テンプレートが使いやすくてすごいいい......

下記のようなテンプレートが適用されたyamlファイルができます。

```yml
    # This workflow will install Python dependencies, run tests and lint with a single version of Python
    # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
    
    name: Python application
    
    on:
      push:
        branches: [ master ]
      pull_request:
        branches: [ master ]
    
    jobs:
      build:
    
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v2
        - name: Set up Python 3.8
          uses: actions/setup-python@v1
          with:
            python-version: 3.8
        - name: Install dependencies
          run: |
            python -m pip install --upgrade pip
            pip install -r requirements.txt
        - name: Lint with flake8
          run: |
            pip install flake8
            # stop the build if there are Python syntax errors or undefined names
            flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
            # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
            flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
        - name: Test with pytest
          run: |
            pip install pytest
            pytest
```

適当に設定していきます。

```yml
    name: Python application
```

名前です、好きな名前にしましょう。

```yml
    on:
      push:
        branches: [ master ]
      pull_request:
        branches: [ master ]
```

どのブランチのどの操作でActionを走らせるかを決めます。大抵そのままで平気です

```yml
    runs-on: ubuntu-latest
```

どのイメージで実行するか、だと思います。（よくわからないのでスキップ）

```yml

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python 3.8
      uses: actions/setup-python@v1
      with:
        python-version: 3.8
```

？

pythonのバージョン指定をしてるくらいしかわからない

```yml
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt 
    - name: Lint with flake8
      run: |
        pip install flake8
        # stop the build if there are Python syntax errors or undefined names
        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
        # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
    - name: Test with pytest
      run: |
        pip install pytest
        pytest
```

name, run で1セット。runで指定したコマンドが走るみたいですね。

設定した物がこう

```yaml
    # This workflow will install Python dependencies, run tests and lint with a single version of Python
    # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions
    
    name: Python application
    
    on:
      push:
        branches: [ master ]
      pull_request:
        branches: [ master, release ]
    
    jobs:
      build:
    
        runs-on: ubuntu-latest
    
        steps:
        - uses: actions/checkout@v2
        - name: Set up Python 3.6
          uses: actions/setup-python@v1
          with:
            python-version: 3.6
        - name: Install Pipenv
          run: |
            python -m pip install --upgrade pip
            pip install pipenv
        - name: Install dependencies
          run: |
            pipenv sync
        - name: Test with unittest
          run: |
            pipenv run test
```

# まとめ

![スクリーンショット 2020-04-11 21.49.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286025/7ba93e23-81bf-633b-8939-329694a0ff97.png)


動いたのでOK！チューニングは別の機会！