85

python setup.py testに相当するものを実行する方法を見つけようとしていますpython -m unittest discover。run_tests.py スクリプトを使用したくありません。また、外部テスト ツール (noseや などpy.test) も使用したくありません。ソリューションが python 2.7 でのみ機能する場合は問題ありません。

では、config のand/orフィールドにsetup.py何かを追加する必要があると思いますが、正しく機能する組み合わせが見つからないようです:test_suitetest_loader

config = {
    'name': name,
    'version': version,
    'url': url,
    'test_suite': '???',
    'test_loader': '???',
}

unittestこれはpython 2.7に組み込まれているだけで可能ですか?

参考までに、私のプロジェクト構造は次のようになります。

project/
  package/
    __init__.py
    module.py
  tests/
    __init__.py
    test_module.py
  run_tests.py <- I want to delete this
  setup.py

更新:これは可能unittest2ですが、のみを使用して同等のものを見つけたいunittest

https://pypi.python.org/pypi/unittest2から

unittest2 には、非常に基本的な setuptools と互換性のあるテスト コレクターが含まれています。setup.py で test_suite = 'unittest2.collector' を指定します。これにより、setup.py を含むディレクトリのデフォルト パラメータを使用してテスト ディスカバリが開始されるため、例として最も役立つでしょう (unittest2/collector.py を参照)。

今のところ、私は というスクリプトを使用しているだけですrun_tests.pyが、python setup.py test.

これが私run_tests.pyが削除したいと思っているものです:

import unittest

if __name__ == '__main__':

    # use the default shared TestLoader instance
    test_loader = unittest.defaultTestLoader

    # use the basic test runner that outputs to sys.stderr
    test_runner = unittest.TextTestRunner()

    # automatically discover all tests in the current dir of the form test*.py
    # NOTE: only works for python 2.7 and later
    test_suite = test_loader.discover('.')

    # run the test suite
    test_runner.run(test_suite)
4

7 に答える 7

46

py27+ または py32+ を使用する場合、解決策は非常に簡単です。

test_suite="tests",
于 2014-02-12T11:13:28.683 に答える
41

Setuptoolsを使用したパッケージの構築と配布から(強調鉱山):

テストスイート

unittest.TestCase サブクラス (またはそれらの 1 つ以上を含むパッケージまたはモジュール、またはそのようなサブクラスのメソッド) を指定する文字列、または 引数なしで呼び出すことができ、 unittest.TestSuite を返す関数を指定する文字列。

したがって、setup.pyTestSuite を返す関数を追加します。

import unittest
def my_test_suite():
    test_loader = unittest.TestLoader()
    test_suite = test_loader.discover('tests', pattern='test_*.py')
    return test_suite

次に、setup次のようにコマンドを指定します。

setup(
    ...
    test_suite='setup.my_test_suite',
    ...
)
于 2016-05-04T16:42:52.583 に答える
6

考えられる解決策の 1 つは、 and /のtestコマンドを単純に拡張することです。これは完全なクルージュのようで、私が好むよりもはるかに複雑ですが、実行時にパッケージ内のすべてのテストを正しく検出して実行するようです。誰かがよりエレガントなソリューションを提供してくれることを期待して、これを私の質問への回答として選択するのを保留しています:)distutilssetuptoolsdistributepython setup.py test

( https://docs.pytest.org/en/latest/goodpractices.html#integrating-with-setuptools-python-setup-py-test-pytest-runnerに触発されました)

setup.py

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

def discover_and_run_tests():
    import os
    import sys
    import unittest

    # get setup.py directory
    setup_file = sys.modules['__main__'].__file__
    setup_dir = os.path.abspath(os.path.dirname(setup_file))

    # use the default shared TestLoader instance
    test_loader = unittest.defaultTestLoader

    # use the basic test runner that outputs to sys.stderr
    test_runner = unittest.TextTestRunner()

    # automatically discover all tests
    # NOTE: only works for python 2.7 and later
    test_suite = test_loader.discover(setup_dir)

    # run the test suite
    test_runner.run(test_suite)

try:
    from setuptools.command.test import test

    class DiscoverTest(test):

        def finalize_options(self):
            test.finalize_options(self)
            self.test_args = []
            self.test_suite = True

        def run_tests(self):
            discover_and_run_tests()

except ImportError:
    from distutils.core import Command

    class DiscoverTest(Command):
        user_options = []

        def initialize_options(self):
                pass

        def finalize_options(self):
            pass

        def run(self):
            discover_and_run_tests()

config = {
    'name': 'name',
    'version': 'version',
    'url': 'http://example.com',
    'cmdclass': {'test': DiscoverTest},
}

setup(**config)
于 2013-06-08T21:59:17.017 に答える
3

http://hg.python.org/unittest2/file/2b6411b9a838/unittest2/collector.pyに少し触発された、理想的ではない別のソリューション

TestSuite発見されたテストを返すモジュールを追加します。次に、そのモジュールを呼び出すようにセットアップを構成します。

project/
  package/
    __init__.py
    module.py
  tests/
    __init__.py
    test_module.py
  discover_tests.py
  setup.py

ここにありdiscover_tests.pyます:

import os
import sys
import unittest

def additional_tests():
    setup_file = sys.modules['__main__'].__file__
    setup_dir = os.path.abspath(os.path.dirname(setup_file))
    return unittest.defaultTestLoader.discover(setup_dir)

そして、ここにありますsetup.py

try:
    from setuptools import setup
except ImportError:
    from distutils.core import setup

config = {
    'name': 'name',
    'version': 'version',
    'url': 'http://example.com',
    'test_suite': 'discover_tests',
}

setup(**config)
于 2013-06-08T22:16:20.760 に答える