2016-05-07 40 views
0

我有我的Python單元測試腳本,如下所示。它需要一個參數「-a」來確定測試用例是否應該從foo_PC_A.pyfoo_PC_B.py加載基本模塊。我使用shutil.move()將.py文件重命名爲foo.py,因此所有的測試用例模塊(例如tm1.py,tm2.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 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') 

當任何模塊運行import foofrom foo import ...,Python將使用該路徑。

注意,如果foo移動到一個包,完整的Python路徑必須,如規定:

sys.modules['path.to.foo'] = ...