Skip to content

Commit 7806e4e

Browse files
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 からリポジトリを作成します。 + +![](https://i.gyazo.com/0fc42d6a6bf5bb120bffdfe22c25ff0a.png) + +あとは、作成したリポジトリをローカルに 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 +``` + +![](https://i.gyazo.com/e6489ed012126c9d96d08e1621844b57.png) + +コンソールに結果が出るので、無事通ったらあとは `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

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

articles/92b3a92536fb17.md

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

0 commit comments

Comments
 (0)