按文件名加载 python 脚本源进行测试
Loading a python script source by filename for testing
我想为名为 foo-bar
的 python 3.7+ script 创建一个测试(这是文件名,它没有 .py
扩展名):
#!/usr/bin/env python
def foo(bar):
return bar + 42
if __name__ == '__main__':
print(foo(1))
如何单独通过路径加载这个文件,以便测试foo()
方法?测试不应触发 if main
条件。
UPDATE 请注意,这与 executing
测试文件(即 exec('foo-bar')
)无关,而是 loading/importing 作为a module/resource,允许测试代码在其上执行foo()
。
我认为,您可以做的是临时创建扩展名为. py 并在导入后将其删除
您可以使用 importlib 中的函数直接从脚本文件加载此模块,无需 .py
扩展名。
要使其正常工作,您需要明确使用加载程序,在这种情况下 SourceFileLoader 将正常工作。
from importlib.machinery import SourceFileLoader
foo_bar = SourceFileLoader('foo_bar', './foo-bar').load_module()
此时,您可以使用模块内部的函数:
result = foo_bar.foo(1)
assert result == 43
我想为名为 foo-bar
的 python 3.7+ script 创建一个测试(这是文件名,它没有 .py
扩展名):
#!/usr/bin/env python
def foo(bar):
return bar + 42
if __name__ == '__main__':
print(foo(1))
如何单独通过路径加载这个文件,以便测试foo()
方法?测试不应触发 if main
条件。
UPDATE 请注意,这与 executing
测试文件(即 exec('foo-bar')
)无关,而是 loading/importing 作为a module/resource,允许测试代码在其上执行foo()
。
我认为,您可以做的是临时创建扩展名为. py 并在导入后将其删除
您可以使用 importlib 中的函数直接从脚本文件加载此模块,无需 .py
扩展名。
要使其正常工作,您需要明确使用加载程序,在这种情况下 SourceFileLoader 将正常工作。
from importlib.machinery import SourceFileLoader
foo_bar = SourceFileLoader('foo_bar', './foo-bar').load_module()
此时,您可以使用模块内部的函数:
result = foo_bar.foo(1)
assert result == 43