运行需要环境变量的单元测试

6

没有环境变量的情况下,我们知道调用方式为: python -m unittest tests.unit_test_1

但是我需要传递环境变量,因为我需要将某些值插入到数据库中,这些值的凭据在我的手中。我不想将它们写在配置/.py文件中,只想将它们作为环境变量传递。因此,如果我传递环境变量如下:

python -m unittest tests.unit_test_1 $username $password

编辑:

unit_test_1.py 大致如下:

import unittest
from sys import argv
from os import environ

class database_helper_tests(unittest.TestCase):
    def fetch(this):
        x = connet_to_database(environ["username"], environ["password"])
        data = x.fetch_from_database(this)
        expected_output = ...
        self.assertEqual(expected_output, data)

if __name__ == "__main__":
    os["username"] = argv[1]
    os["password"] = argv[2]
    unittest.main()

第一个测试通过了。然后我收到的错误是:
ModuleNotFoundError: No module named 'username"
ModuleNotFoundError: No module named 'password"

最后,我看到了这个(虽然我只运行了一个测试):

Ran 3 tests in 1.48s

我应该怎么做才能只运行必须的测试?

提前感谢您。


1
unittest命令行界面接受模块、类和方法。你不能像那样传递环境变量。相反,你可以将其包装在一个脚本中,该脚本执行两个操作:导出环境变量,然后调用python -m unittest命令。 - Gino Mempin
2
你的单元测试中为什么不能在 setUpclassSetUp 中设置环境变量? - joshmeranda
是的 @joshmeranda 我被告知不要这样做,因为它们是机密。 - Tanveer
@GinoMempin 那么我该如何从命令行导出它们呢?你能给个例子吗? - Tanveer
你能否编辑一下,提供更多关于你的环境的细节?比如操作系统、Python版本以及需要使用环境变量的样例测试用例。 - Gino Mempin
显示剩余2条评论
2个回答

5

实际上,您的代码不应该依赖于变量来自哪里。例如,定义一个 config.py

import os
config = {
  "user" : os.environ["username"], 
  "pass": os.environ["password"] 
}

那么,请将您的测试代码更改为模拟 / 定义配置字典,实际方法导入配置模块

同样地,您应该模拟数据库方法,这样您就不需要真正进行身份验证,除非您明确尝试测试该功能。


我同意。在这里,我们有一个惯例,即当代码处于活动状态时,我们不会在任何地方明确地暴露我们的秘密,甚至不会在bashrc中。那么我该怎么办呢? - Tanveer
我从未说过你要把你的秘密放在代码中。我是说要模拟数据库方法,这样你就不需要连接到真正需要真实用户信息的数据库。 - OneCricketeer

3
$ export username="user"
$ export password="secret"
$ python -m unittest tests.unit_test_1

然后像之前一样在代码中访问它

os.environ["username"]

或者
$ username="user" password="secret" python -m unittest tests

example env access


谢谢。让我试试看。 - Tanveer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接