相关疑难解决方法(0)

如何在python包中编写可选依赖项的unittests?

根据工作环境中pandas包的可用性,方法返回两个不同的输出:

  • 一pandas.DataFrame,如果大熊猫可用
  • 否则是一个numpy.recarray对象.

我该如何为这堂课写单元测试?

我能想到的一个解决方案是为两种情况编写测试(有和没有安装pandas)并相应地跳过测试,如下所示:

try:
    import pandas
    HAVE_PANDAS = True
except ImportError:
    HAVE_PANDAS = False

import unittest

class TestClass(unittest.TestCase):
    @unittest.skipUnless(HAVE_PANDAS, "requires pandas")
    def tests_using_pandas(self):
        # do something
    @unittest.skipUnless(not HAVE_PANDAS, "doesn't require pandas")
    def tests_without_pandas(self):
        # do something
Run Code Online (Sandbox Code Playgroud)

但由于测试覆盖率和跳过测试的减少,我不太喜欢这个解决方案.我想对两种情况都进行测试.如果有人可以为此提出更好的替代解决方案,将会很有帮助.

python python-unittest

9
推荐指数
2
解决办法
645
查看次数

使 Python 测试认为已安装的软件包不可用

我有一个测试,可确保在所需的包不可用时引发特定的(有用的)错误消息。

def foo(caller):
    try:
        import pkg
    except ImportError:
        raise ImportError(f'Install "pkg" to use {caller}')
    pkg.bar()

with pytest.raises(ImportError, match='Install "pkg" to use test_function'):
   foo('test_function')
Run Code Online (Sandbox Code Playgroud)

然而,pkg 是一般可用,其他的测试依赖于它。目前,我设置了一个额外的虚拟环境,而 pkg不仅仅是为了这个测试。这似乎有点矫枉过正。

是否可以在模块或函数中“隐藏”已安装的包?

python pytest

7
推荐指数
1
解决办法
237
查看次数

如何在pytest中使用monkeypatch或mock删除库?

如果我的库中有一个contrib附加程序,其中包含依赖项(例如requests),我希望用户必须安装该附加程序才能访问 CLI API,但我在 CI 测试期间安装了 contrib 附加程序,我如何使用pytest来MonkeyPatch删除测试期间的依赖关系以确保我的检测正确?

例如,如果contrib额外的内容会另外安装requests,那么我希望用户必须这样做

$ python -m pip install mylib[contrib]
Run Code Online (Sandbox Code Playgroud)

然后能够在命令行上使用 CLI API,如下所示

$ mylib contrib myfunction
Run Code Online (Sandbox Code Playgroud)

wheremyfunction使用requests依赖项

$ python -m pip install mylib[contrib]
Run Code Online (Sandbox Code Playgroud)

我如何在测试中模拟或猴子补丁 ,以便我可以确保用户正确地收到警告以及如果他们这样做requestspytestModuleNotFoundError

$ python -m pip install mylib
$ mylib contrib myfunction
Run Code Online (Sandbox Code Playgroud)

?在阅读了有关 pytest 标签的其他一些问题后,我仍然认为我不明白如何做到这一点,所以我在这里问。

python monkeypatching pytest pytest-mock

6
推荐指数
1
解决办法
1484
查看次数