我正在尝试单元测试访问远程服务的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
。
任何人都有一个安全的方法建议我在单元测试运行开始时进行一次性密码输入?谢谢!
答案 0 :(得分: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
访问密码。
答案 1 :(得分: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')
答案 2 :(得分:0)
如果您希望完全自动化测试,建议您将密码存储为environment variable。
=DateFromText(A1)
环境变量是特定于运行时环境的动态值。这允许您在需要时加载私有变量,而无需在代码中保存数据。
这些变量特定于环境,这意味着他们将不与其他用户共享。如果其他人试图在不同的环境中运行您的测试,他们将需要设置自己的密码。
大多数Python开发环境都有自己的方法来设置环境变量(PyCharm,Visual Studio,Eclipse/PyDev)。但是,您可以使用以下内容临时为您的环境设置一个:
import os
password = os.environ["password"]
class test_A(self):
self.assertEqual(password, "secret")
class test_B(self):
self.assertNotEqual(password, "not_a_secret")