2013-06-28 6 views
3

Я пытаюсь выполнить модульный код python, который обращается к удаленной службе. Я использую PyUnit с python 2.7.Испытание модуля Python с введенным пользователем паролем

В методе setUpClass код предлагает ввести пароль для этой услуги. Я хочу сохранить все модульные, поэтому я создал отдельные тестовые классы для каждого тестируемого класса. Эти классы имеют доступ к одной и той же удаленной службе, и все они используют одно определение метода setUpClass fom super class.

Моя проблема заключается в том, что я должен повторно вводить пароль несколько раз (один раз для каждого тестового класса). Мне лень. Я только хочу ввести пароль один раз для всех модульных тестов. Я мог бы избежать проблемы путем жесткого кодирования пароля в модульном тесте, но это ужасная идея. Другой вариант состоит в том, чтобы перетащить все в один массивный класс, полученный из 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.pwd или TestCommon.pwd.

+0

Когда я запускаю команду 'python -m unittest discovery', я дважды запрашиваю пароль. Это потому, что я определяю 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