-1

私はプロトタイピングを行っており、argv で eval() を呼び出して値を取得した変数を割り当てた低品質のコードを気にせずに、API キーを含む外部ファイルの値を取得しました。驚いたことに、単体テストがひどくクラッシュしました (どれも実行されませんでした)。

犯人だと思われるコードスニペットは次のとおりです。

from sys import argv
from apikeys import *


def setKey(the_key=DCK):
    global CK
    CK = the_key # Currently used key

if len(argv) == 1:
    print('---Executing script. Enter optional arguments if you wish to use special API keys.---')
    setKey()
elif len(argv) > 1:
    setKey(eval(argv[1]))

TOKEN = rget(DOMAIN+'signin', params={'key':CK}).json['response']['token']
PARAMS = {'signature':TESTSIG, 'token':TOKEN}

# Rest of the code uses unittests which rely on PARAMS.

したがって、キーを含む変数の 1 つを値として渡し、スクリプトをテストすると、次のトレースバックが生成されます。

[gp@imdev1 dv1/tests]# python 2test_api2.py ANDROID_FILMS_KEY
Traceback (most recent call last):
  File "2test_api2.py", line 604, in <module>
    unittest.main()
  File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 97, in __init__
    self.parseArgs(argv)
  File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 152, in parseArgs
    self.createTests()
  File "/usr/lib/python2.6/site-packages/unittest2/main.py", line 161, in createTests
    self.module)
  File "/usr/lib/python2.6/site-packages/unittest2/loader.py", line 148, in loadTestsFromNames
    suites = [self.loadTestsFromName(name, module) for name in names]
  File "/usr/lib/python2.6/site-packages/unittest2/loader.py", line 142, in loadTestsFromName
    raise TypeError("don't know how to make test from: %s" % obj)
TypeError: don't know how to make test from: 9b269ac759211de6b3c8b238bd758ccf

9b269ac759211de6b3c8b238bd758ccf は、基本的に eval(ANDROID_FILMS_KEY) を実行した結果であり、別のスクリプトで setKey 関数を実行すると、API キーが CK に文字列 '9b269ac759211de6b3c8b238bd758ccf' として正しく割り当てられます。

キッカーは次のとおりです: 単体テストが必要なメソッドを含むクラスで CK と PARAMS が使用されている場合、Python は驚くべきことに、単体テストが 9b269ac759211de6b3c8b238bd758ccf を文字列と見なしていないことを伝える奇妙な例外を発生させますか?

4

1 に答える 1

1

unittest2ローダーは、コマンド ラインからのテスト用にロードされるモジュールを制限できるように、検査行います。sys.argv

ここで何が起こるかというと、ローダーが という名前のテスト モジュールを探しているということ9b269ac759211de6b3c8b238bd758ccfです。

sys.argv代わりに、ユニットテストから操作する必要があります。これは、変更できる標準の python リストです。main(args)または、デフォルトで次のように呼び出す関数を作成しsys.argv[1:]ます。

def main(args):
    if not args:
        print('---Executing script. Enter optional arguments if you wish to use special API keys.---')
        setKey()
    else:
        setKey(eval(args[0]))

if __name__ == '__main__':
    import sys
    main(sys.argv[1:])

main()これで、テスト スクリプトに引数を渡すことに依存することなく、さまざまな引数でテストできるようになりました。

于 2012-11-23T14:22:12.037 に答える