web-dev-qa-db-ja.com

Python、単体テスト-unittest.TestCaseのsetUpにコマンドライン引数を渡します

Python unittestモジュールを使用して記述されたいくつかの単体テストのラッパーとして機能するスクリプトがあります。いくつかのファイルのクリーンアップに加えて、出力ストリームの作成といくつかのコードの生成、それを使用してスイートにテストケースをロードします

_unittest.TestLoader().loadTestsFromTestCase()
_

私はすでにoptparseを使用して、出力の場所、コードを再生成するかどうか、およびクリーンアップを行うかどうかを決定するために使用されるいくつかのコマンドライン引数を引き出しています。また、テストケース内で使用するために、構成変数、つまりエンドポイントURIを渡します。

TestCaseのsetUpメソッドにOptionParserを追加できることはわかっていますが、代わりにsetUpにオプションを渡します。これはloadTestsFromTestCase()を使用して可能ですか?返されたTestSuiteTestCasesを反復できますが、TestCasesで手動でsetUpを呼び出すことはできますか?

**編集**テストを繰り返し、次のように手動でsetUpを呼び出すと、setUpに引数を渡すことができることを指摘したかったのです。

_(options, args) = op.parse_args()
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions)
for test in suite:
    test.setUp(options.soap_uri)
_

ただし、これにはxmlrunnerを使用しており、そのrunメソッドはTestSuiteを引数として使用します。それ自体がsetUpメソッドを実行すると想定しているため、XMLTestRunner内で使用可能なパラメーターが必要になります。

これが理にかなっているといいのですが。

29
sberry

ええと、私は同じことをしたいと思い、この質問を自分でするつもりでした。次のコードは重複しているため、改善したいと思いました。ただし、TestCaseをテストするための引数を送信できます。

import unittest
import helpspot

class TestHelpSpot(unittest.TestCase):
    "A few simple tests for HelpSpot"

    def __init__(self, testname, path, user, pword):
        super(TestHelpSpot, self).__init__(testname)
        self.hs = helpspot.HelpSpot(path, user, pword)

    def test_version(self):
        a = self.hs.version()
        b = self.hs.private_version()
        self.assertEqual(a, b)

    def test_get_with_param(self):
        a = self.hs.filter_get(xFilter=1)

    def test_unknown_method(self):
        self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple)

if __name__ == '__main__':
    import sys
    user = sys.argv[1]
    pword = sys.argv[2]
    path = sys.argv[3]

    test_loader = unittest.TestLoader()
    test_names = test_loader.getTestCaseNames(TestHelpSpot)

    suite = unittest.TestSuite()
    for test_name in test_names:
        suite.addTest(TestHelpSpot(test_name, path, user, pword))

    result = unittest.TextTestRunner().run(suite)
    sys.exit(not result.wasSuccessful())
47
jps
if __name__ == '__main__':
    from optparse import OptionParser
    parser = OptionParser()
    parser.add_option("-z", "--zebra",
                      action="store_true", dest="zebra", default=False,
                      help="run like a zebra")    


    (options, args) = parser.parse_args()

    if options.zebra:
        zebrafy()


    # remove our args because we don't want to send them to unittest
    for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]):
        if x in sys.argv:
            sys.argv.remove(x)


    unittest.main()
7
user3667349

このように引数をsetUpに渡さないことをお勧めします。 setUpはテストの実行時に暗黙的に呼び出されることを意図しているため、このように明示的に呼び出すことはできません。

これに取り組む1つの方法は、環境変数またはグローバルにアクセス可能な「コンテキスト」モジュールの値として設定する必要がある値を設定することです。これにより、テストケースが必要に応じてそれらにアクセスできるようになります。テストの実行に関してはより柔軟なので、環境変数を使用することにします(その後、コマンドライン引数に依存しなくなります)。

4
Gabriel Reid

Initメソッドで属性を定義すると、このようにコンストラクタですべてを単純に渡すことができます。

import unittest
import helpspot

class TestHelpSpot(unittest.TestCase):
    "A few simple tests for HelpSpot"

    def __init__(self, testname, path, user, pword):
        super(TestHelpSpot, self).__init__(testname)
        self.path = path
        self.user = user
        self.pword = pword
....
....
....


if __name__ == '__main__':
    True

    suite = unittest.TestSuite()
    suite.addTest(TestHelpSpot("test_version", path, user, pword))    

    unittest.TextTestRunner().run(suite)
0
user1048839