2013-06-28 2 views
3

원격 서비스에 액세스하는 Python 코드 테스트 단원을 테스트하려고합니다. Python 2.7에서 PyUnit을 사용하고 있습니다.사용자 입력 암호로 Python 유닛 테스트

setUpClass 메서드에서 코드는 사용자에게 서비스의 암호를 입력하라는 메시지를 표시합니다. 모든 것을 모듈화하고 싶기 때문에 테스트 할 각 클래스에 대해 별도의 단위 테스트 클래스를 만들었습니다. 이러한 클래스는 모두 동일한 원격 서비스에 액세스하며 모두 수퍼 클래스에 대한 setUpClass 메서드의 단일 정의를 사용합니다.

제 문제는 암호를 여러 번 다시 입력해야한다는 것입니다 (모든 테스트 클래스마다 한 번씩). 내가 게으른. 모든 단위 테스트에 대해 한 번만 비밀번호를 입력하고 싶습니다. 유닛 테스트에서 비밀번호를 하드 코딩하여이 문제를 피할 수는 있지만, 그건 끔찍한 생각입니다. 다른 옵션은 모든것을 unittest.TestCase에서 파생 된 하나의 거대한 클래스로 밀어 넣는 것입니다.하지만 모듈화를 좋아하기 때문에 그 경로를 피하기를 원합니다.

여기에 코드가 구조화되는 방법은 다음과 같습니다 번 클래스 A과 한 번 클래스 B을 위해 :

이 예에서
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 

, 내가 두 번 암호를 입력해야합니다.

단원 테스트를 시작할 때 일회용 암호 입력을 안전하게 할 수있는 방법에 대한 조언이 있으십니까? 감사!

답변

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.pwd 또는 TestCommon.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

'setUpClass()'가'TestCommon'의 모든 서브 클래스에 대해 호출된다고 생각합니다. 그래서 이것은 여전히 ​​여러 번 암호를 입력해야합니다. – RobotNerd