- 第1部:tox でテストの自動化、Github Actionsを使ってプッシュと同時にGithub上でテストを実行
- 第2部:Issue の課題を解決し、Pull Requestとつなげてマージと同時にテストを行う
- 次回以降:フォーク元の Issue を解決し Pull Request を建ててマージしてもらう
memo:4月の勉強会で fork したものをそのまま使いたい方は、📌 マークが付いているところだけを更新すればよいと思います。
- fork
- https://github.com/fin-py/connpass-client/fork でフォークする
- forkしたリポジトリで
Settings
->Actions
->General
のページでWorkflow permissions
へ移動 Read and write permissions
とAllow Github Actions to create and approve pull requests
を選択してSave
- 📌 フォークしたレポジトリは、Issue機能がデフォルトでOFFになっています。
Settings > General > Features
で、Issues
に✔を入れてONにしてください
- 詳細は前回資料の 環境構築を見てください。
- ローカル開発環境構築
# フォークした自分のレポジトリを git clone git clone [email protected]:YOUR-GITHUB-ACCOUNT/connpass-client.git cd connpass-client python -m venv .venv source .venv/bin/activate pip install -U pip pip install . pytest tox coverage pytest-cov "genbadge[coverage]" # 📌
source .venv/bin/activate
: Windowsの方は仮想環境: Python環境構築ガイド 仮想環境への切り替え - python.jpを参照してください。
-
tox.ini 新規作成
touch tox.ini
-
Pythonのバージョンを確認
python -V
-
tox 記述
tox.ini
[tox] envlist = py38 isolated_build = True [testenv] deps = pytest faker commands = pytest
- tox: python のための仮想環境管理およびテストツール。バージョン管理、依存関係の解決、テスト実行、スタイルチェック、静的解析、カバレッジ測定などのタスクを実行する。異なる環境でもOK。CIプラットフォームの一部としてよく用いられる。
envlist = py38
: 先に確認したPythonのバージョンを指定isolated_build = True
: ビルド用の仮想環境を作成してその中でビルドする。ビルドの再現性を確保。deps =
: テストを実行するために必要な依存パッケージを指定。これらのパッケージがテスト環境でインストールされるcommands = pytest
: テストを実行するコマンド
-
tox 実行
- tox でテストが実行できることを確認
tox py39: install_deps> python -I -m pip install faker pytest .pkg: install_requires> python -I -m pip install poetry-core ... tests/test_sample.py . [100%]
-
.github/workflows
新規作成mkdir -p .github/workflows
-
workflow yaml file 新規作成
touch .github/workflows/tox-demo.yml
-
ワークフローを記述
name: tox demo on: push: branches: [ main ] pull_request: branches: [ main ] jobs: test: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 # tox で指定したpythonに合わせる - name: Install tox run: pip install tox - name: Run tox run: tox
-
add / commit / push する
-
Github のレポジトリにいって、Actions を確認
第1部の内容を利用して、例えば以下のような開発環境を整えることができます。
- バグや機能強化などのIssueを建てる
- その Issue の Branch を作成
- Branch を fetch してローカルで課題を解決して、テストを行う
- Branch を Push
- Pull Requestを作成するタイミングでGithub Actionsを使ってテストを行う
- BranchをMainにマージ
- 練習用Issueを作成
- 練習Issue
タイトル:test for get method 内容:ConnpassClient().get(event_id="266898") で得ることができる辞書のキーは、 ['results_start', 'results_returned', 'results_available', 'events'] であることを確認するテストを書く
- 練習Issue
- 作成した Issue で、
Development
>Create a branch
Branch name
とRepository destination
を確認して、Checkout locally
のままCreate Brance
Checkout in your local repository
に従ってローカルにブランチをフェッチする
- 先程作ったブランチで作業
tests/test_sample.py
def test_data_keys(): data = ConnpassClient().get(event_id="266898") res = set(data.keys()) assert res == set( ["results_start", "results_returned", "results_available", "events"] )
- ローカルで tox を実行してテストを確認
- add / commit / push
- 【確認】main ブランチにプッシュしたわけではないので、GAでテストは走らない
- レポジトリの
Pull requests
に行く Compare & pull request
で、Pull Request を作成。- デフォルトではマージ先が fin-py/connpass-client になっているので、自分のレポジトリに変更
- 適当なメッセージを書いて、
Create pull request
- 無事プルリクエストが終わるとIssueもCloseしていることを確認
- 現在の
tox-demo.yml
では mainブランチにPushする、もしくはプルリクエストするタイミングだけでテストが走る設定になっています。これを、Pushしたときは常にテストが走る設定に変更してください。- ヒント: ブランチを指定しなければ全てのPushでワークフローが実行されます
- 第2部の内容を以下のテストでおさらいしましょう。
内容: ConnpassClient().get(event_id="266898") で得ることができる辞書の `results_returned` キーの値は、`events` の配列データ数と一致することを確認するテストを書く
def test_results_returned(): an_event_data = ConnpassClient().get(event_id="266898") assert an_event_data["results_returned"] == len(an_event_data["events"])
(次回以降の予定なのでまだ未完成です)
upsteam
として fork 元のリポジトリ( https://github.com/fin-py/connpass-client/fork )を登録
- 現在のブランチを確認
git branch -a * main remotes/origin/HEAD -> origin/main remotes/origin/coverage remotes/origin/main
- 現在の remote レポジトリの確認
git remote -v origin [email protected]:YOUR-NAME/connpass-client.git (fetch) origin [email protected]:YOUR-NAME/connpass-client.git (push)
upstream
という名前で fork 元(fin-py / connpass-client)を登録【確認】 ssh じゃない人はgit remote add upstream [email protected]:fin-py/connpass-client.git
https://github.com/shinsei-taro-test/connpass-client.git
??- remote レポジトリの確認
git remote -v origin [email protected]:YOUR-NAME/connpass-client.git (fetch) origin [email protected]:YOUR-NAME/connpass-client.git (push) upstream [email protected]:fin-py/connpass-client.git (fetch) upstream [email protected]:fin-py/connpass-client.git (push)
- fetch upstream
git fetch upstream remote: Enumerating objects: 4, done. remote: Counting objects: 100% (2/2), done. remote: Total 4 (delta 2), reused 2 (delta 2), pack-reused 2 Unpacking objects: 100% (4/4), 844 bytes | 844.00 KiB/s, done. From github.com:fin-py/connpass-client * [new branch] coverage -> upstream/coverage * [new branch] dev_test -> upstream/dev_test * [new branch] main -> upstream/main
- ブランチを確認
git branch -a * main remotes/origin/HEAD -> origin/main remotes/origin/main remotes/upstream/coverage remotes/upstream/dev_test remotes/upstream/main
- main ブランチに、upstream/main をマージ 📌
git checkout main git merge upstream/main
複数バージョン でテストしたい場合
https://docs.github.com/ja/actions/automating-builds-and-tests/building-and-testing-python
@drillan さんありがとうございます!