给python一个“;平台“;图书馆假平台信息?

给python一个“;平台“;图书馆假平台信息?,python,cross-platform,Python,Cross Platform,在脚本开始时,我使用platform.system和platform.release来确定脚本运行在哪个操作系统和版本上(因此它知道它的数据在Mac上的应用程序支持中,在类unix和非Mac unix上的home中,在windows=Vista上的appdata中)。我想测试我的ifs、elifs和elses系列,它们决定了操作系统和版本,但我只能访问Mac 10.6.7、一些未知的Linux版本和Windows 7。有没有一种方法可以提供平台假系统和发布信息,这样我就可以确保XP、Solari

在脚本开始时,我使用
platform.system
platform.release
来确定脚本运行在哪个操作系统和版本上(因此它知道它的数据在Mac上的应用程序支持中,在类unix和非Mac unix上的home中,在windows=Vista上的appdata中)。我想测试我的
if
s、
elif
s和
else
s系列,它们决定了操作系统和版本,但我只能访问Mac 10.6.7、一些未知的Linux版本和Windows 7。有没有一种方法可以提供
平台
假系统和发布信息,这样我就可以确保XP、Solaris等可以在没有安装的情况下正确处理脚本?

您可能想探索
平台
进行测试。或者,您可以直接使用monkey patch
platform
,或者甚至直接使用
sys.modules
来覆盖默认的
platform
模块,但是mock已经设计成自包含的,并且还可以在代码中非常清楚地显示什么是测试工具,什么不是测试工具,这样,您就不会意外地在生产代码中发布测试功能。

您可以创建初始化函数,将这些变量作为参数,以便在测试中很容易欺骗它们

>>> platform.system = lambda: "whatever"
>>> platform.system()
'whatever'

对我来说,用pytest mock直接修补
platform.system
不起作用。不过,一个简单的技巧是在您自己的实用程序函数中抽象此信息的检索(这次您可以使用pytest-mock成功地对其进行修补)

因此,在您的实现模块/类中:

def _get_system() -> str:
    return platform.system().lower()

def _is_windows() -> bool:
    return _get_system() == 'windows'
在您的测试中,这里使用pytest+pytest mock:

def test_win_no_pad_code():
    with patch('module_name._get_system', MagicMock(return_value='windows')):
        assert module_name._is_windows()

这是使用模块的一种方法,但您可以使用类来替代。

我忘了提到我不想虚拟化。好的。是否有地方可以看到给定操作系统的系统/版本信息?Windows 7的版本是“7”,但雪豹的版本是“达尔文内核版本10.7.0:Sat Jan 29 15:17:16 PST 2011;root:xnu-1504.9.37~1/release386”