2013-03-11 193 views
12

我希望將我的應用程序的文件放在/ Files文件夾下,而將測試單元放在/ UnitTests中,這樣我就可以清楚地分開應用程序和測試。Python單元測試:在另一個模塊中運行測試

爲了能夠使用與mainApp.py相同的模塊路由,我在根文件夾中創建了一個testController.py。

mainApp.py 
testController.py 
Files 
    |__init__.py 
    |Controllers 
    | blabla.py 
    | ... 
UnitTests 
    |__init__.py 
    |test_something.py 

因此,如果test_something.py我想測試一個功能,那就是在/Files/Controllers/blabla.py,我嘗試以下方法:

import unittest 
import Files.Controllers.blabla as blabla 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(blabla.some_function()) 


if __name__ == '__main__': 
    unittest.main() 


然後從文件testController.py,我執行下面的代碼:

import TestUnits.test_something as my_test 
my_test.unittest.main() 

,輸出沒有故障,但沒有測試執行

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 
[Finished in 0.3s] 


我曾嘗試使用沒有依賴性的測試,如果爲「主要」工程執行,而是從外部調用時,輸出相同:

import unittest 


def tested_unit(): 
    return True 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(tested_unit()) 


if __name__ == '__main__': 
    unittest.main() 

問題:我如何得到這個工作?

回答

4

在test_something.py,這樣做:

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(TestMyUnit, 'test')) 
    return suite 

在testController.py,這樣做:

from TestUnits import test_something 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(test_something.suite()) 
    return suite 

if __name__ == '__main__': 
    unittest.main(defaultTest='suite') 
+0

這是一個小有點冗長,但它的工作原理,謝謝。 – bgusach 2013-03-11 12:25:54

15

的方法unittest.main()着眼於所有的類unittest.TestCase生成在上下文中呈現。 所以你只需要在你的testController.py文件中導入你的測試類並在這個文件的上下文中調用unittest.main()。

所以,你的文件testController.py應該簡單地看是這樣的:

import unittest  
from UnitTests.test_something import * 
unittest.main() 
+0

謝謝,但它不起作用。結果是一樣的:它不執行測試。 – bgusach 2013-03-11 12:25:23

+0

好吧,我的壞。您必須從test_something文件導入所有測試用例。嘗試從UnitTests.test_something import TestMyUnit(或*),它應該工作! – rparent 2013-03-11 15:20:48

+0

它的工作原理,謝謝。 – bgusach 2013-03-11 15:28:37

0

有使用subprocess.call()來運行測試,等等的變通方法:

import subprocess 

args = ["python", "test_something.py"] 
subprocess.call(args) 
相關問題