根据工作环境中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)
但由于测试覆盖率和跳过测试的减少,我不太喜欢这个解决方案.我想对两种情况都进行测试.如果有人可以为此提出更好的替代解决方案,将会很有帮助.
我有一个测试,可确保在所需的包不可用时引发特定的(有用的)错误消息。
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不仅仅是为了这个测试。这似乎有点矫枉过正。
是否可以在模块或函数中“隐藏”已安装的包?
如果我的库中有一个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 标签的其他一些问题后,我仍然认为我不明白如何做到这一点,所以我在这里问。