[Python]cramテストをsetup.pyから実行させる

最近利用した Python ライブラリでは cram を使ってテストがかかれてあり、setup.py からテスト実行できるようになっていた。ミニマムな実現方法をメモ。

cram とは

URL : https://bitheap.org/cram/

一言でいえばコマンドラインの実行結果をテストする機能テストツール

サイトから引用すると

Cram is a functional testing framework for command line applications based on Mercurial’s unified test format.
Cram tests look like snippets of interactive shell sessions. Cram runs each command and compares the command output in the test with the command’s actual output.

引用部にあるように大きめのプロジェクトだと Mercurial が採用している模様。

公式のドキュメント以外には以下のドキュメントも参考になる

setup.py の修正

本題の cram テスト向け setup.py の修正。
setup.py に pytest 向けコマンドを追加するチュートリアルがある

pytest : Integration with setuptools/distribute test commands
http://pytest.org/latest/goodpractises.html#integration-with-setuptools-distribute-test-commands

これを cram 向けに書き換えればよい。で、書き換えたのが以下。

import sys
from setuptools import setup
from setuptools.command.test import test as TestCommand

class CramTest(TestCommand):
    def finalize_options(self):
        TestCommand.finalize_options(self)
        self.test_args = []
        self.test_suite = True

    def run_tests(self):
        import cram
        sys.exit(cram.main(['tests.t']))

setup(
      tests_require=['cram'],
      cmdclass={'test': CramTest})

この例では test オプションで run_tests メソッドがよびだされ cram テストファイル tests.t を実行する。

setup.py(distutils) のコマンド拡張は次の URL も参考になる

stackoverflow : Custom distutils commands
http://stackoverflow.com/questions/1710839/custom-distutils-commands

テスト実行

作成した setup.py で実際に cram テストを実行する

テストの用意

ファイル tests.t にテストケースを書く。

test echo:

  $ echo foo
  foo

test expr:

  $ expr 1 + 1
  10

cram のインストール

Python で書かれているため pip でインストールするのが楽。

$ pip install cram

cram からテスト実行

$ cram tests.t
!
--- tests.t
+++ tests.t.err
@@ -6,4 +6,4 @@
 test expr:

   $ expr 1 + 1
-  10
+  2

# Ran 1 tests, 0 skipped, 1 failed.

このテストを setup.py から呼び出す。

setup.py からテスト実行

追加した test オプションはヘルプにも追加される。

$ python setup.py  --help-command
...
Extra commands:
...
  test              run unit tests after in-place build
...

テストを実行

$ python setup.py test
running test
running egg_info
...
running build_ext
!
--- tests.t
+++ tests.t.err
@@ -6,4 +6,4 @@
 test expr:

   $ expr 1 + 1
-  10
+  2

# Ran 1 tests, 0 skipped, 1 failed.

ということで、テスト実行成功。

Advertisements
Tagged with: , ,
Posted in python

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 6 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 6 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 6 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 1 year ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: