2013-06-28 64 views
3

我試圖單元測試訪問遠程服務的python代碼。我使用python 2.7的PyUnit。用戶輸入密碼的Python單元測試

setUpClass方法中,代碼提示用戶輸入服務的密碼。我想保留所有的模塊,所以我爲每個正在測試的類創建了單獨的單元測試類。這些類都訪問相同的遠程服務,並且它們都使用一個超類的setUpClass方法的單個定義。

我的問題是,我不得不重新輸入密碼多次(每個測試課一次)。我很懶。我只想爲所有單元測試輸入一次密碼。我可以通過在單元測試中對密碼進行硬編碼來避免這個問題,但這是一個糟糕的主意。另一種選擇是將所有東西都推到一個來自unittest.TestCase的巨大類中,但我想避免這種路由,因爲我喜歡模塊化。

下面的代碼是如何構成的:

import unittest 
from getpass import getpass 

class TestCommon(unittest.TestCase): 
    @classmethod 
    def setUpClass(cls): 
     pwd = getpass() 

class test_A(TestCommon): 
    # ...individual unit tests for class A 

class test_B(TestCommon): 
    # ...individual unit tests for class B 

在這個例子中,我將不得不輸入密碼兩次:一次爲A類和一次B類。

任何人都有安全的方式建議我在單元測試運行開始時進行一次性密碼輸入嗎?謝謝!

回答

2

類定義被執行一次。

import unittest 
from getpass import getpass 

class TestCommon(unittest.TestCase): 
    pwd = getpass() 

class test_A(TestCommon): 
    def test_a(self): 
     self.assertEqual(self.pwd, 'secret') 

class test_B(TestCommon): 
    def test_b(self): 
     reversed_pwd = self.pwd[::-1] 
     self.assertEqual(reversed_pwd, 'terces') 

的密碼是通過self.pwdTestCommon.pwd訪問。

+0

當我運行命令'python -m unittest discover'時,我得到兩次提示輸入密碼的提示。是否因爲我在超類中定義了setUpClass()?我應該像你的示例代碼重寫它嗎? – RobotNerd

+0

@RobotNerd,你如何訪問子類中的密碼? – falsetru

+0

@RobotNerd,如果您在子類中以「self.pwd」或「TestCommon.pwd」的形式訪問密碼,則只需重寫TestCommon部分即可。 – falsetru

0

在您的setUpClass()函數中,您可以將密碼保存爲self的屬性,然後使每個測試成爲您的TestCommon類的一部分。

import unittest 
from getpass import getpass 

class TestCommon(unittest.TestCase): 
    @classmethod 
    def setUpClass(self): 
     self.pwd = getpass() 

    def test_A(self): 
     self.assertEqual(self.pwd, 'TEST A') 

    def test_B(self): 
     self.assertEqual(self.pwd, 'TEST B') 
+0

我認爲'TestCommon'的每個子類都會調用'setUpClass()',所以這仍然會強制我多次輸入密碼。 – RobotNerd