如何使用 pytest 模拟 os.environ?

Nan*_*nna 3 python unit-testing mocking pytest

我需要在使用 pytest 框架编写的单元测试中模拟 os.environ 。

这是我要测试的代码的虚拟版本,位于getters.py

import os

username = os.environ['MY_USER']
password = os.environ['MY_PASS']

def get_data(...):

    access_token = request_access_token(username, password)
    ...
    return data
Run Code Online (Sandbox Code Playgroud)

这是单元测试的示例test_getters.py

import pytest
import src.getters

class TestGetData(object):


    def test_something(self):

        data = src.getters.get_data(...)

        assert ...
Run Code Online (Sandbox Code Playgroud)

测试收集失败并出现以下错误:

=========================== short test summary info ============================
ERROR tests/test_getters.py - KeyError: 'MY_USER'
!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!
=============================== 1 error in 0.68s ===============================
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我希望能够在整个测试类中模拟一次。

我可以使用某种装饰器吗?或者其他一些推荐的嘲笑 os.environ 的方法?

Avi*_*niv 5

Monkeypatchingmonkeypatch.setenv()的使用:

文件:

修改环境变量以进行测试,例如在缺少环境变量的情况下测试程序行为,或为已知变量设置多个值。Monkeypatch.setenv() 和 Monkeypatch.delenv() 可用于这些补丁。

代码:

import pytest
import src.getters

class TestGetData(object):


    def test_something(self):
        monkeypatch.setenv('MY_USER', 'Nanna')
        monkeypatch.setenv('MY_PASS', 'P@ssw0rd')
        data = src.getters.get_data(...)

        assert ...
Run Code Online (Sandbox Code Playgroud)

  • 如果从函数“get_data”内部访问 os.environ['MY_USER'] ,则此方法有效,但如果它首先在全局变量中定义,并从函数访问该全局变量,则此解决方案不起作用。还有其他解决办法吗? (3认同)