10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pipenvとtoxを組み合わせて、ライブラリのユニットテストを記述する

Last updated at Posted at 2018-12-02

この記事はLIFULLその2 Advent Calendar 2018の1日目の記事です。

普段からPipenvを使ってPythonでアプリケーション開発をしているのですが、Pythonパッケージを社内用に提供する必要があり、その際に以下のような疑問が生まれていました。

  • Pipenvはバージョン固定するためのツールで、テストは複数のPythonバージョンで行いたい
  • 依存ライブラリの記述にsetup.pyとPipfileって結局どう使い分ければいいの?開発時だけに必要なライブラリもPipenv(Pipfile)で記述したいんだけど…

結論からいうと、公式ドキュメントで紹介されている手順に従って、以下のように行うと良いようです。

  • 開発用ライブラリはPipenvを使って管理しよう
  • toxを使って複数バージョンのテストを管理しよう(また、もう一つ紹介されているTravis CIも紹介されています)

実際にプロジェクトを作ってテストする

実際に、Python2.7とPython3.6でテストしてみました。この2バージョンを利用したのは、私の環境で既に動いているからで、実際には複数バージョンのインストールと指定が必要です。

また、今回使用したコードは以下に置いてあります。

この前の記事は"test"以下にテストコードを置きましたが、今回はpipenvのドキュメントに合わせて"tests"の下に置きました。Pythonではプロジェクトの標準的なディレクトリ構成が厳密には決められていないようです。

$ tree
.
├── MANIFEST
├── Pipfile
├── Pipfile.lock
├── README.md
├── setup.py
├── src
│   ├── __init__.py
│   └── script.py
├── tests
│   ├── __init__.py
│   └── test_script.py
└── tox.ini

toxは、実際にそれぞれのバージョンで仮想環境を作って、その中でpytestのコードを実行してくれます。

setup.py
# !/usr/bin/env python

from distutils.core import setup


setup(name='sample',
      version='0.1',
      description='sample',
      author='sample',
      author_email='sample@sample.sample',
      url='',
      packages=['src'],
      )

.tox以下のディレクトリに大量のライブラリができるので、テスト実行前に.gitignoreには.toxを記述しておきましょう。VS Codeのgit機能が悲鳴を挙げてました。

tox.iniはpipenvの公式のサンプルを元に記述しています。ついでにflake8で規約チェックもします。

[tox]
envlist = flake8-py3, py27, py36

[testenv]
deps = pipenv
commands=
    pipenv install --dev
    pipenv run py.test tests

[testenv:flake8-py3]
basepython = python3.6
commands =
    pipenv install --dev
    pipenv run flake8 --version
    pipenv run flake8 setup.py docs project test

これでtoxコマンドでテストを実行することができます。

$ tox
(中略)
_______________________________________________________________________ summary _______________________________________________________________________
  flake8-py3: commands succeeded
  py27: commands succeeded
  py36: commands succeeded
  congratulations :)

まとめ

今後は、以下のようにPythonによる開発とユニットテストを行っていこうと思います。

  • アプリケーション開発ではpipenvで管理して、一つのPythonバージョンでテストを実行
  • ライブラリ開発では更にtoxを利用して複数バージョンのテストを回す

今回の例では存在しないのですが、実際にライブラリの開発では依存ライブラリをsetup.pyとPipfileの両方に記述することになります。今後、より良いライブラリの依存関係の管理方法が現れることを期待したいです。

参考記事

Pipenv公式ドキュメント Pipfile vs setup.py

※日本語訳

PipenvでPythonの依存関係の管理は楽になったか?

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?