github actions を使って、pythonのpytest、flake8などの試しⅡ

# はじめに
共有いただいた下記の記事はうまく行かないパータンを見つけた。補足として、対応方法を共有させていただきました。

https://qiita.com/Guan21/items/c5b2ca69710763638ee2

# Target
- 以下のディレクトリ構成で、github actionsで、「ubuntu環境」と「Docker仮想環境」それぞれの自動テストが無事に実行できること。

### ディレクトリ構成

~~~bash.sh
├── .github
│   └── workflows
│       ├── pipenv.yml
│       ├── pytest.yml
│       └── pythonPipenv.yml
├── source
│   ├── modules
│   │   ├── tests
│   │   │   └── test_util.py
│   │   └── util.py
│   ├── static
│   │   └── style.css
│   ├── templates
│   │   ├── error.html
│   │   ├── index.html
│   │   └── template.html
│   ├── logger.py
│   ├── manage.py
│   ├── Pipfile
│   └── test.py
├── .gitattributes
├── docker-compose.yml
├── Dockerfile
├── localenv
└── README.md

~~~

共通のテストファイルは[前回より](https://qiita.com/Guan21/items/c5b2ca69710763638ee2#%E5%85%B1%E9%80%9A%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB)、ちょっと変更しました。

~~~test_util.py
from modules import util


def test_sample1():
    """add test """
    assert True


def test_count_num():

    paramter = 3
    result = 3

    assert result == util.count_number(paramter)

~~~

~~~util.py
def count_number(num):
    return num

~~~

# github Actionsを実行する

実行用なymlファイルは前回の記事まで、ご参考してください。

[Docker仮想環境のymlファイル](https://qiita.com/Guan21/items/c5b2ca69710763638ee2#docker%E4%BB%AE%E6%83%B3%E7%92%B0%E5%A2%83)、[ubuntu 環境 pytestのymlファイル](https://qiita.com/Guan21/items/c5b2ca69710763638ee2#ubuntu-pytest)、[ubuntu 環境 pipenvのymlファイル](https://qiita.com/Guan21/items/c5b2ca69710763638ee2#ubuntu-pipenv)

<font color="red">**実行した結果はすべて失敗した～～～**</font>
悲しいけど、直さなきゃ。。
まず、エラーメッセージを確認しましょう。

~~~bash.sh

============================= test session starts ==============================
platform linux -- Python 3.10.6, pytest-7.1.3, pluggy-1.0.0 -- /home/runner/.local/share/virtualenvs/python_pipenv_test-ulorymQ-/bin/python
cachedir: .pytest_cache
rootdir: /home/runner/work/python_pipenv_test/python_pipenv_test
collecting ... collected 0 items / 1 error

==================================== ERRORS ====================================
______________ ERROR collecting source/modules/tests/test_util.py ______________
ImportError while importing test module '/home/runner/work/python_pipenv_test/python_pipenv_test/source/modules/tests/test_util.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/opt/hostedtoolcache/Python/3.10.6/x64/lib/python3.10/importlib/__init__.py:126: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
source/modules/tests/test_util.py:1: in <module>
    from modules import util
E   ModuleNotFoundError: No module named 'modules'
=========================== short test summary info ============================
ERROR source/modules/tests/test_util.py
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
=============================== 1 error in 0.07s ===============================
~~~

実行エラーはほぼ同じ内容でした。「No module named 'modules'」モジュールが見つかりませんね。ごめんなさい。。。
各ファイルは以下のように、修正して動作を再確認しました。

## Docker仮想環境


~~~ docker-compose.yml

    environment:
      ...
      - PYTHONPATH=/service/flask_app
~~~~

？？？なぜ、docker-compose.ymlファイルを修正しなければならないでしょうか。
Pythonコマンドの実行ディレクトリが違うから、モジュールエラーが出ます。
我々は自動テストはDockerの仮想環境に実行するため、ここのファイル修正しなければなりません。

~~~bash.sh
Run docker-compose exec -T flask_app pipenv run test
============================= test session starts ==============================
platform linux -- Python 3.10.7, pytest-7.1.3, pluggy-1.0.0
rootdir: /service/flask_app
collected 2 items

modules/tests/test_util.py ..                                            [100%]

============================== 2 passed in 0.01s ===============================
~~~

<font color="purple">**Yes**</font> 無事に成功できました。


## ubuntu 環境
### ubuntu pytest

~~~pytest.yml
    - name: Analysing the code with pylint
      env: 
        PYTHONPATH: /home/runner/work/python_pipenv_test/python_pipenv_test/source
      run: |
        ls -l
        flake8 source/
        pytest -vs
~~~

#### 実行結果

~~~bash.sh
============================= test session starts ==============================
platform linux -- Python 3.10.6, pytest-7.1.3, pluggy-1.0.0 -- /opt/hostedtoolcache/Python/3.10.6/x64/bin/python
cachedir: .pytest_cache
rootdir: /home/runner/work/python_pipenv_test/python_pipenv_test
collecting ... collected 2 items

source/modules/tests/test_util.py::test_sample1 PASSED
source/modules/tests/test_util.py::test_count_num PASSED

============================== 2 passed in 0.01s ===============================
~~~
<font color="purple">**Yes**</font> 無事に成功できました。

###  ubuntu pipenv
~~~pythonPipenv.yml
    - name: Add path
      run: echo "$HOME/.local/share/virtualenvs/python_pipenv_test-ulorymQ-/bin" >> $GITHUB_PATH
    - name: Analysing the code with pylint again
      env: 
        PYTHONPATH: /home/runner/work/python_pipenv_test/python_pipenv_test/source
      run: |
~~~

#### 実行結果

~~~bash.sh
============================= test session starts ==============================
platform linux -- Python 3.10.6, pytest-7.1.3, pluggy-1.0.0 -- /home/runner/.local/share/virtualenvs/python_pipenv_test-ulorymQ-/bin/python
cachedir: .pytest_cache
rootdir: /home/runner/work/python_pipenv_test/python_pipenv_test
collecting ... collected 2 items

source/modules/tests/test_util.py::test_sample1 PASSED
source/modules/tests/test_util.py::test_count_num PASSED

============================== 2 passed in 0.01s ===============================
~~~
<font color="purple">**Yes**</font> 無事に成功できました。

# まとめ
- [前回のシミュレーション](https://qiita.com/Guan21/items/c5b2ca69710763638ee2#%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)で、Docker仮想環境、ubuntu pytestとubuntu pipenvのメリットとデメリットを書きました。追加します。
### Docker仮想環境
##### メリット
- エンハンスが強い、つまり、テスト環境の修正が発生する際に、dockerfileなどを修正すればOK



### ubuntu pytest
##### デメリット
- エンハンスはdockerより、弱くて、テスト環境の修正が発生する際に、dockerfileとgithub actionsの実行ファイルを修正しなければなりません。


### ubuntu pipenv
##### デメリット
- エンハンスはdockerより、弱くて、テスト環境の修正が発生する際に、dockerfileとgithub actionsの実行ファイルを修正しなければなりません。<font color="purple">**ただ**</font>、pythonのパッケージインストールを関わる部分は「ubuntu pytest」より強いです。