Commit 7806e4e
committed
[from now] 2022/06/14 09:04:27
diff --git a/articles/92b3a92536fb17.md b/articles/92b3a92536fb17.md
new file mode 100644
index 0000000..3c798b1
--- /dev/null
+++ b/articles/92b3a92536fb17.md
@@ -0,0 +1,132 @@
+---
+title: "Docker + Pytest でアルゴ式のローカル実行環境をしっかり目に作ってみた"
+emoji: "🐢"
+type: "tech" # tech: 技術記事 / idea: アイデア
+topics: ["python", "アルゴ式", "Docker"]
+published: false
+---
+
+[アルゴ式](https://algo-method.com/after_login)はアルゴリズムの勉強にめちゃくちゃ良いですよね。
+
+自分も最近アルゴ式を始めたのですが、サイト上のエディターでのコーディングや、テストの実行が少しストレスでした。それを改善するために、手軽にローカルで実行できる環境を作ってみたので紹介です。
+
+# 作ったもの
+
+以下 Tweet の動画のようにコマンド 1 つで、問題文とテストケースの取得、テストの実行ができる環境を Docker で作ってみました。
+
+https://twitter.com/KawamataRyo/status/1536007164334055424
+
+コードは GitHub Template として公開しています。
+
+https://github.com/kawamataryo/algo-method-local-template
+
+# 使い方
+
+## GitHub Template からのリポジトリ作成
+
+[こちらのリンク](https://github.com/kawamataryo/algo-method-local-template/generate)にアクセスして、Template からリポジトリを作成します。
+
+
+
+あとは、作成したリポジトリをローカルに Clone します。
+
+## 問題文の取得
+
+[アルゴ式](https://algo-method.com/after_login) の解きたい問題にアクセスして、URL から問題の ID を取得します。
+
+https://algo-method.com/tasks/303
+
+上記の問題の場合は URL `https://algo-method.com/tasks/303` の末尾の `303` が ID になります。
+
+あとは、以下コマンドを実行するだけです。
+
+```bash
+make get_question No=303
+```
+
+すると、`questions/303` 配下に `main.py` と `case.json` が生成されます。
+
+```py:questions/303/main.py
+"""
+https://algo-method.com/tasks/303
+
+### 問題文
+カメのアルルは $N$ 個のマスを使って遊んでいます。それぞれのマスには数字が $1$ つずつ書かれており、マス $i$ には $A_i$ が書かれています。$(0 \leq i \leq N-1)$
+アルルはマス $0$ からスタートし、以下のルールに従いながらマス $N-1$ を目指します。
+...
+"""
+
+print("Hello Algor-Method!")
+```
+
+```json:questions/303/case.json
+[
+ [
+ "3\n2 4 7\n",
+ "11\n"
+ ],
+ [
+ "8\n3 1 4 1 5 9 2 6\n",
+ "18\n"
+ ]
+]
+```
+
+`main.py` が解答の記載場所になります。そのまま実装コードを記載してください。
+
+## テストの実行
+
+実装ができたら、テストを実行してみましょう。
+以下コマンドで [Pytest](https://docs.pytest.org/en/7.1.x) が実行されます。
+
+```bash
+make run_test No=330
+```
+
+
+
+コンソールに結果が出るので、無事通ったらあとは `main.py` の実装をアルゴ式の Web エディターに貼り付けて解答すれば OK です。
+
+:::message
+解答部分も自動化できたら良いなーと思っていますが、まだできていません 🙈
+:::
+
+# 実装のポイント
+
+## 問題文、テストケースのスクレイピング
+
+問題文とテストケースの取得は [Beautiful Soup](https://www.crummy.com/software/BeautifulSoup/bs4/doc/) で問題文の Web ページをスクレイピングし、その結果から正規表現で抽出しています。
+
+https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/get_question/get_question.py#L1-L66
+
+:::message
+変更に弱いので、アルゴ式が API を公開してくれたらそちらに移したいです..
+また、こちらの実装 [@TakeshiP](https://twitter.com/takeaship) さんのこちらの PR を参考にさせて頂きました。感謝🙏
+online-judge-tools/api-client#152
+:::
+
+## 標準入出力のテスト
+
+標準入出力のテストは main.py の内容をそのままテストするために少し工夫しています。
+まず、run_test のコマンド実行時に、引数で指定された問題 ID の case.json と main.py の内容をロードしています。
+そして、そのロード結果を Pytest の実行時の引数に渡しています。
+
+https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/run_test/run_test.py#L1-L22
+
+渡した引数は、Pytest の addoption で fixture 経由で参照できるようにしています。
+
+https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/run_test/conftest.py#L1-L17
+
+あとは、その値を元に標準入出力のテストを実行します。
+main.py の内容を eval で実行し、case.json の内容で検証しています。
+
+https://github.com/kawamataryo/algo-method-local-template/blob/main/scripts/run_test/test_main.py#L1-L11
+
+標準入出力のテストについては以下記事でもまとめています。
+
+https://zenn.dev/ryo_kawamata/articles/41873296559da1
+
+# おわりに
+
+これで環境が整ったので、あとは問題をときまくってアルゴリズム力を鍛えるのみ!頑張りますね。
+また、使ってみてなにか不具合あれば、気軽に [Issue](https://github.com/kawamataryo/algo-method-local-template/issues) や [Twitter](https://twitter.com/KawamataRyo) で教えてください。1 parent 8c28d70 commit 7806e4e
1 file changed
+132
-0
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
0 commit comments