Python プログラミング Anaconda3でのpytestの警告を回避、iPad Proの a-Shell で pytest 始めてみました

 今日も見にきてくださってありがとうございます。石川さんです。梅雨入りしてジメジメが続きますね。

 さて、先日翔泳社の『テスト駆動Python』という書籍を購入しまして、さ〜て、やりますか、と張り切っていたのですが、1章の1ページ目からうまく動かず。実行はできたのですけど、何故か警告が出力されてしまうのですよね。ぼくの環境は、Windows 10 & Anaconda3です。

(base) C:\work\pytest\ch1>pytest test_one.py
================================================= test session starts =================================================
platform win32 -- Python 3.8.8, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: C:\work\pytest\ch1
plugins: anyio-2.2.0
collected 1 item

test_one.py .                                                                                                    [100%]

================================================== warnings summary ===================================================
..\..\..\ProgramData\Anaconda3\lib\site-packages\pyreadline\py3k_compat.py:8
  C:\ProgramData\Anaconda3\lib\site-packages\pyreadline\py3k_compat.py:8: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working
    return isinstance(x, collections.Callable)

-- Docs: https://docs.pytest.org/en/stable/warnings.html
============================================ 1 passed, 1 warning in 0.08s =============================================

(base) C:\work\pytest\ch1>
警告が出力される

 なるほど、Anaconda3のpyreadlineモジュールで警告ですね。これは問題だと言われているファイル、py3k_compat.pyの8行目、「return isinstance(x, collections.Callable)」のところの「collections.Callable」を「collections.abc.Callable」に修正することで回避できました。そういえば、ちょっと前にもこちらの記事でpyreadlineのモジュール、修正していましたね。警告が出なくなってスッキリしたのですが、ふと、最近購入した、iPad Proでもできるんじゃないかな、と、やってみました。

実行環境のセットアップ

 iPad Proでのpythonというと、大体は「Pythonista 3」か、jupyter notebook系だと「Juno」「Carnets」がおすすめされることがほとんどだと思います。でも、今回使ったのは、「a-Shell」というアプリで、iOSで簡単なUnixコマンドが使えるシェルです。ここから「python」や「ipython 」を実行することができます。App Storeの検索で「a-Shell」を入力してぐるぐるのアイコンを探してインストールします。

a-Shellのアイコン

 インストールできたら、実行します。黒いコマンドラインがフルスクリーンで登場します。pytestを実行してみましたが、コマンドが存在しない(command not found)、と、エラーになります。pytestを使えるようにするためには、インストールが必要ですね。pipコマンド「pip install pytest」で簡単に実行できるようになりました。

$ pytest
pytest: command not found
$ pip install pytest
Defaulting to user installation because normal site-packages is not writeable
Collecting pytest
  Downloading pytest-6.2.4-py3-none-any.whl (280 kB)
     |████████████████████████████████| 280 kB 4.0 MB/s 
Requirement already satisfied: packaging in /private/var/containers/Bundle/Application/10B03820-2240-4A08-AA93-CE205988D553/a-Shell.app/Library/lib/python3.9/site-packages (from pytest) (20.9)
Requirement already satisfied: attrs>=19.2.0 in /private/var/containers/Bundle/Application/10B03820-2240-4A08-AA93-CE205988D553/a-Shell.app/Library/lib/
python3.9/site-packages (from pytest) (20.3.0)
Requirement already satisfied: toml in /private/var/containers/Bundle/Application/10B03820-2240-4A08-AA93-CE205988D553/a-Shell.app/Library/lib/python3.9/site-packages (from pytest) (0.10.2)
Collecting py>=1.8.2
  Downloading py-1.10.0-py2.py3-none-any.whl (97 kB)
     |████████████████████████████████| 97 kB 10.5 MB/s 
Collecting iniconfig
  Downloading iniconfig-1.1.1-py2.py3-none-any.whl (5.0 kB)
Collecting pluggy<1.0.0a1,>=0.12
  Downloading pluggy-0.13.1-py2.py3-none-any.whl (18 kB)
Requirement already satisfied: pyparsing>=2.0.2 in /private/var/containers/Bundle/Application/10B03820-2240-4A08-AA93-CE205988D553/a-Shell.app/Library/lib/python3.9/site-packages (from packaging->pytest) (2.4.7)
Installing collected packages: py, pluggy, iniconfig, pytest
Successfully installed iniconfig-1.1.1 pluggy-0.13.1 py-1.10.0 pytest-6.2.4

実行してみます

  書籍の内容を元に、test_one.pyファイルを作成して、以下の通り実行できました。

$ pytest test_one.py
================================================================= test session starts ==================================================================
platform darwin -- Python 3.9.2+, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /private/var/mobile/Containers/Data/Application/117A9320-8100-4E66-A829-2B31D0457140/Documents/work/pytest/ch1
collected 1 item                                                                                                                                       
test_one.py .                                                                                                                                    [100%]
================================================================== 1 passed in 0.01s ===================================================================
$ 
実行結果

はい、見事に成功しましたね。pytestでテスト対象として自動的に実行されるためには、

  • ファイル名が test_*.py または、*_test.py という名前であること
  • 関数名やメソッド名は、test_* という名前であること
  • クラス名は Test* という名前であること

ということのようです。最初、テスト関数名を「est_passing」と「t」を欠落して作ってしまっていました。その欠落が原因で実行されなかったのですが、「t」の欠落に気づくまでは、警告があると実行できないのか〜、と勘違いしてしばらくウロウロしちゃいました。無事、解決できてよかったです。

お気に入り

 最近は、iPad Pro がお気に入りで、色々と遊んでいます。手書きの性能がとっても良いのが特にお気に入りで、近頃は手帳の替わりにノートアプリの「Goodnotes5」を使うようになりました。手書きのいいところと、電子のいいところの両方が享受できていて、大満足です。
 で、せっかく持ち歩けるのだから、pythonを使ったプログラミングもできないかなぁ、と、色々と検索してたどり着いたのが、今回紹介した「a-Shell」です。ただ、こちら tkinter が使えないので、しばらくは使い道がないなぁ、と思っていたのですが、GUIを利用しない今回のようなケースであれば活用できるはずだ、と、今回張り切って記事にしてみました。

まとめ

 Anaconda3 で pytest を実行するときにでた警告の修正と、iPad Proで pythonを使って pytest を実行する方法について記載しました。これでしばらくは気軽に pytest で遊ぶことができそうです。
 ちなみに、今回の記事は、iPad Pro を使って書いてみました。って、どこ見てもそんなこと分かりませんね。失礼しました!