web-dev-qa-db-ja.com

Python SeleniumでTestNGのような機能を実現する方法、または1つのテストスイートに複数の単体テストを追加する方法は?

この2つのノーズテストExampleTest1.pyとExampleTest2.pyがあるとします。

 ExampleTest1.py
 class ExampleTest1(TestBase):
            """
            """

        def testExampleTest1(self):
            -----
            -----

    if __name__ == "__main__":
        import nose
        nose.run()

---------------
ExampleTest2.py
class ExampleTest2(TestBase):
        """
        """

        def testExampleTest2(self):
            -----
            -----

    if __name__ == "__main__":
        import nose
        nose.run()

今、私は単一のスイートからそのような何百ものテストファイルを実行したいと思います。

私は以下のtestng.xmlのようなTestNG機能のようなものを探しています。ここで1つずつ実行する必要があるすべてのテストファイルを追加できます

 <suite name="Suite1">
      <test name="ExampleTest1">
        <classes>
           <class name="ExampleTest1" />          
        </classes>
      </test>  
      <test name="ExampleTest2">
        <classes>
           <class name="ExampleTest2" />          
        </classes>
      </test>  
    </suite> 

Testng.xmlのような機能がPythonで利用できない場合、テストスイートを作成し、そこにすべての私のpythonテストを含めるための他の代替手段は何ですか?ありがとう

5
Shoaib Akhtar

テストスイートを構築する理由は複数ある可能性があるため、いくつかのオプションを紹介します。

ディレクトリからテストを実行するだけ

mytestsdirがあるとしましょう:

mytests/
├── test_something_else.py
└── test_thing.py

そのディレクトリからすべてのテストを実行するのは簡単です。

$> nosetests mytests/

たとえば、煙、ユニット、統合テストをさまざまなdirに配置しても、「すべてのテスト」を実行できます。

$> nosetests functional/ unit/ other/

タグによるテストの実行

鼻には 属性セレクタプラグイン があります。このようなテストで:

import unittest

from nose.plugins.attrib import attr


class Thing1Test(unittest.TestCase):

    @attr(platform=("windows", "linux"))
    def test_me(self):
        self.assertNotEqual(1, 0 - 1)

    @attr(platform=("linux", ))
    def test_me_also(self):
        self.assertFalse(2 == 1)

特定のタグを持つテストを実行できるようになります。

$> nosetests -a platform=linux tests/

$> nosetests -a platform=windows tests/

手動で構築されたテストスイートの実行

最後に、nose.mainsuite引数をサポートします。渡された場合、 検出は行われません 。ここでは、テストスイートを手動で作成し、Noseで実行する方法の基本的な例を示します。

#!/usr/bin/env python

import unittest

import nose


def get_cases():
    from test_thing import Thing1Test
    return [Thing1Test]


def get_suite(cases):
    suite = unittest.TestSuite()
    for case in cases:
        tests = unittest.defaultTestLoader.loadTestsFromTestCase(case)
        suite.addTests(tests)
    return suite


if __name__ == "__main__":
    nose.main(suite=get_suite(get_cases()))

ご覧のとおり、nose.mainは通常のunittestテストスイートを取得し、get_suiteによって構築および返されます。 get_cases関数は、選択したテストケースが「ロード」される場所です(上記の例では、ケースクラスがインポートされたばかりです)。

本当にXMLが必要な場合、get_casesは、解析したXMLファイルから取得したモジュール(__import__またはimportlib.import_moduleを介してインポート)から取得したケースクラスを返す場所です。そして、nose.main呼び出しの近くで、argparseを使用してXMLファイルへのパスを取得できます。

5
paka