Pythonでsetup.pyを使ってテストする場合のフォルダ構成

少し分からなかったので、備忘録として書いておく。

pythonでsrcとtestフォルダを分けていた場合、上手くテストが出来なかったので、色々調べてみた。

フォルダ構成

私が作ったフォルダは下記のような構成。

./Sample
   |--/src    ・・・実行用スクリプト
   |
   |--/test   ・・・テストスクリプト
   |
   |--setup.py

setup.pyはJavaでいうと、build.xmlやpom.xmlみたいなもの。

python setup.py test

とコマンドを打つと、テストを実行してくれます。

setup.pyを使った簡単なテスト例

まず、フォルダ・ソース構成は下記の通り

./Sample
   |--/src
   |    |--__init__.py
   |    |--sample.py
   |--/test
   |    |--sample_test.py
   |--setup.py
__init__.py
from sample import *

__init__.pyはこれだけOK。

sample.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Calc:
  def add(self, x, y):
    return x+y

凄く簡単な例です。
説明は省略。

sample_test.py
#!/usr/bin/env python
# -*- coding:utf-8
import unittest
from sample import Calc

class TestSample(unittest.TestCase):
  def test_sample(self):
    calc = Calc()
    self.assertEqual(15, calc.add(10, 5))

def suite():
  suite = unittest.TestSuite()
  suite.addTests(unittest.makeSuite(TestSample))
  return suite

これもunittestの簡単な例です。
TestCaseを継承したクラスを作成し、テストケースを作成しています。
suite()メソッドでテストケースをTestSuiteに追加しています。

setup.py
from setuptools import setup, find_packages
import sys
sys.path.append('./src')
sys.path.append('./test')

setup(
    name = "Sample",
    version = "0.1",
    packages = find_packages(),
    test_suite = 'sample_test.suite'
)


重要なのは、2つのフォルダをパスに追加するところ。

import sys
sys.path.append('./src')
sys.path.append('./test')

これがないと"No module named sample_test"と出てしまい、テストが実行できません。

そして、test_suiteの指定。

test_suite = 'sample_test.suite'

ここでTestSuiteを設定してやります。

テストの実行

この構成でテストを実行してみると、テストが実行されているのが分かります。

C:\Sample>python setup.py test
running test
running egg_info
writing Sample.egg-info\PKG-INFO
writing top-level names to Sample.egg-info\top_level.txt
writing dependency_links to Sample.egg-info\dependency_links.txt
reading manifest file 'Sample.egg-info\SOURCES.txt'
writing manifest file 'Sample.egg-info\SOURCES.txt'
running build_ext
test_sample (sample_test.TestSample) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

ファイル一式

試す人がいるか分からないけど、一応Dropboxに上げておきます。
setuppy.zip