Модульный тест Python с вводимым пользователем паролем

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

В методе 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.

У кого-нибудь есть совет о безопасном способе ввода одноразового пароля прямо в начале запуска модульного теста? Спасибо!


person RobotNerd    schedule 28.06.2013    source источник
comment
Получая доступ к удаленной службе из ваших модульных тестов, вы фактически тестируете эту службу вместе со своими классами. Почему бы вам не высмеять удаленный сервис?   -  person otterrisk    schedule 27.08.2019


Ответы (3)


Определение класса выполняется один раз.

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.

person falsetru    schedule 29.06.2013
comment
Когда я запускаю команду python -m unittest discover, мне дважды предлагается ввести пароль. Это потому, что я определяю setUpClass () в суперклассе? Стоит ли переписать его, как ваш пример кода? - person RobotNerd; 29.06.2013
comment
@RobotNerd, как получить доступ к паролю в подклассах? - person falsetru; 29.06.2013
comment
@RobotNerd, Если вы обращаетесь к паролю в подклассах как self.pwd или TestCommon.pwd, переписывайте только часть TestCommon. - person falsetru; 29.06.2013

В своей 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')
person Stevoisiak    schedule 06.11.2017
comment
Я думаю, что setUpClass() вызывается для каждого подкласса TestCommon, так что это все равно заставит меня вводить пароль несколько раз. - person RobotNerd; 07.11.2017

Если вы хотите полностью автоматизировать свои тесты, я рекомендую хранить свой пароль в виде переменной среды.

import os
password = os.environ["password"]

class test_A(self):
    self.assertEqual(password, "secret")

class test_B(self):
    self.assertNotEqual(password, "not_a_secret")

Переменные среды - это динамические значения, специфичные для вашей среды выполнения. Это позволяет при необходимости загружать частные переменные без необходимости сохранять данные в коде.

Эти переменные зависят от среды, то есть не передаются другим пользователям. Если кто-то другой попытается запустить ваш тест в другой среде, ему потребуется установить свой собственный пароль.

Большинство сред разработки Python имеют свои собственные методы для установки переменных среды (PyCharm, Visual Studio, Eclipse / PyDev). Однако вы можете временно установить его для своей среды, выполнив следующие действия:

import os
os.environ["password"] = "my_secret_password"

Смотрите также:

person Stevoisiak    schedule 16.03.2018