6

我正在尝试对访问远程服务的 python 代码进行单元测试。我在 python 2.7 中使用 PyUnit。

在该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

有人对我在单元测试运行开始时输入一次性密码的安全方式有建议吗?谢谢!

4

3 回答 3

4

类定义执行一次。

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

于 2013-06-29T03:27:57.697 回答
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')
于 2017-11-06T20:40:21.837 回答
0

如果您想完全自动化您的测试,我建议您将密码存储为环境变量

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 开发环境都有自己的设置环境变量的方法(PyCharmVisual StudioEclipse/PyDev)。但是,您可以使用以下内容为您的环境临时设置一个:

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

也可以看看:

于 2018-03-16T13:52:17.923 回答