2016-05-07 8 views
0

以下のような私のPython unittestスクリプトがあります。テストケースが基本モジュールをfoo_PC_A.pyまたはfoo_PC_B.pyからロードする必要があるかどうかを判断するには、引数 '-a'が必要です。私はshutil.move()を使っていずれかの.pyファイルをfoo.pyにリネームするので、すべてのテストケースモジュール(例:tm1.pytm2.py)は簡単にimport fooになります。これはPythonicではなく回避策のように見えますが。これを行うための良い方法はありますか?または、この問題を根本的に解決するための優れた設計。Pythonランタイムはロードするモジュールを決定します

(run_all_unittest.py)

if sys.argv[1] = '-a': 
    shutil.move('foo_PC_A.py', 'foo.py') 
else: 
    shutil.move('foo_PC_B.py', 'foo.py') 


test_module_list = ['tm1', 'tm2', ...] 
for test_module_name in test_module_list: 
    test_module = __import__(test_module_name) 
    test_suites.append(unittest.TestLoader().loadTestsFromModule(test_module)) 

alltests = unittest.TestSuite(test_suites) 
unittest.TextTestRunner().run(alltests) 

if sys.argv[1] = '-a': 
    shutil.move('foo.py', 'foo_PC_A.py') 
else: 
    shutil.move('foo.py', 'foo_PC_B.py') 

(tm1.py)

from foo import MyTestCase 
... 

(foo_PC_A.py)

import <some module only available on PC A> 

class MyTestCase(unittest.TestCase): 
... 

(foo_PC_B.py)

# since the PC A modules are not available on PC B, 
# just call the pre-built executable via subprocess 
import subprocess 
class MyTestCase(unittest.TestCase): 
... 
    def test_run(self): 
     subprocess.call(...) 

答えて

1

あなたは、モジュールがすでにロードされているという考えにはPythonをだますことができます。ただ、動的モジュールをインポートしてsys.modulesを使用します。任意のモジュールがimport fooまたはfrom foo import ...を実行すると

import sys 
import importlib 

if sys.argv[1] = '-a': 
    sys.modules['foo'] = importlib.import_module('foo_PC_A') 
else: 
    sys.modules['foo'] = importlib.import_module('foo_PC_A') 

、Pythonはそのパスを使用します。

fooがパッケージに移動されている場合、完全なPythonパスがのように、指定しなければならないことに注意してください:

sys.modules['path.to.foo'] = ... 
関連する問題