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

Tan*_*eer 6 python unit-testing environment-variables

没有环境变量,我们知道,调用是: python -munittesttests.unit_test_1

但我需要传递环境变量,因为我需要将一些值插入到我拥有信用的数据库中。我不想将其写入 config/.py 文件中,只想将它们作为环境变量传递。因此,如果我将环境变量传递为:

python -m unittest tests.unit_test_1 $username $password
Run Code Online (Sandbox Code Playgroud)

编辑:

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()
Run Code Online (Sandbox Code Playgroud)

第一个测试通过。然后我得到的错误是:

ModuleNotFoundError: No module named 'username"
ModuleNotFoundError: No module named 'password"
Run Code Online (Sandbox Code Playgroud)

最后我看到了这一点(尽管我只运行了一个测试):

Ran 3 tests in 1.48s
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能只运行所需的测试?

先感谢您。

cri*_*007 5

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

import os
config = {
  "user" : os.environ["username"], 
  "pass": os.environ["password"] 
}
Run Code Online (Sandbox Code Playgroud)

然后更改您的测试代码以模拟/定义配置字典以及导入配置模块的真实方法

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


Mos*_*ted 3

$ export username="user"
$ export password="secret"
$ python -m unittest tests.unit_test_1
Run Code Online (Sandbox Code Playgroud)

然后像你一样在你的代码中访问

os.environ["username"]
Run Code Online (Sandbox Code Playgroud)

或者

$ username="user" password="secret" python -m unittest tests
Run Code Online (Sandbox Code Playgroud)

示例环境访问