用户输入密码的Python单元测试

用户输入密码的Python单元测试,python,unit-testing,python-2.7,python-unittest,Python,Unit Testing,Python 2.7,Python Unittest,我试图对访问远程服务的python代码进行单元测试。我将PyUnit与Python2.7结合使用 在setUpClass方法中,代码提示用户输入服务的密码。我想让所有东西都模块化,所以我为每个被测试的类创建了单独的单元测试类。这些类都访问同一个远程服务,并且它们都使用超级类的setUpClass方法的单个定义 我的问题是我必须多次重新输入密码(每个测试类一次)。我很懒。我只想为所有单元测试输入一次密码。我可以通过在单元测试中硬编码密码来避免这个问题,但这是一个糟糕的想法。另一种选择是将所有内容都

我试图对访问远程服务的python代码进行单元测试。我将PyUnit与Python2.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
在本例中,我必须输入两次密码:一次用于class
A
,一次用于class
B


有人建议我在单元测试运行开始时一次性输入密码吗?谢谢

类定义执行一次

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
访问。在
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')

如果要完全自动化测试,我建议将密码存储为。

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开发环境都有自己的方法来设置环境变量(,)。但是,您可以通过以下方式为您的环境临时设置一个:

import os
os.environ["password"] = "my_secret_password"
另见:

当我运行命令
python-m unittest discover
时,两次提示我输入密码。是因为我在超类中定义了setUpClass()吗?我应该像你的示例代码一样重写它吗?@RobotNerd,你如何访问子类中的密码?@RobotNerd,如果你访问子类中的密码作为
self.pwd
TestCommon.pwd
,只重写TestCommon部分。我认为
setUpClass()
是为
TestCommon
的每个子类调用的,因此,这仍然会迫使我多次输入密码。相关:通过从单元测试访问远程服务,您可以实际测试该服务以及您的类。你为什么不模仿远程服务呢?