我编写了一个要通过pip安装的模块,其目录结构如下:
bin/myapp
src/mymodule
src/mymodule/__init__.py
src/mymodule/config.py
src/mymodule/file1.py
src/mymodule/file2.py
tests/func/
tests/unit/file1/test_func1.py
tests/unit/file1/test_func2.py
tests/unit/file2/test_func1.py
setup.py
setup.cfg
setup.py包含:
scripts=['bin/myapp'],
myapp导入mymodule,它是“包装器”脚本,可根据需要执行模块代码。例如myapp包含:
import mymodule
def main(config_file):
mymodule.read_config(config_file)
...
mymodule.do_something_else
...
if __name__ == '__main__':
...
main(config_file)
我想在'func /'(func / test_myapp.py)下编写一个测试,该测试将设置目录结构,然后执行“ myapp”,该调用我的模块进行端到端测试(我需要模拟一些功能,因为它们确实会调用测试计算机上不存在的实际可执行文件。
但是我似乎找不到一篇很好的文章来告诉我如何导入“ bin / myapp”以便可以对其进行测试。
感谢您的帮助。
P.S。该代码示例必须与2.7和3.x兼容,因此都被标记了。
答案 0 :(得分:2)
与其在bin/myapp
中放置逻辑,不如在mymodule/cli.py
中放置一个或多个函数,并使用一个入口点:https://packaging.python.org/specifications/entry-points/
您将最小化编写的样板,并且该逻辑将在您的测试中以及对于安装该软件包的其他任何人中都是可导入的-在某些情况下,直接调用该函数可能比shell调用更方便。其他客户的显式控制。
您的确切测试问题也在此处解决:http://python-packaging.readthedocs.io/en/latest/command-line-scripts.html#the-console-scripts-entry-point
答案 1 :(得分:1)
一种执行此操作的方法可能是subprocess
测试中的垃圾箱,然后在垃圾箱执行完后测试每个预期的项目。就像在test_func1.py
类似
import subprocess
def test1():
stdout = subprocess.check_output(['bin/myapp'])
assert os.listdir('./newfolder') == ['blah1', 'blah2']
assert stdout == '''some expected output'''
具有接近集成测试的好处,但实际上具有接近集成测试的缺点,因此可能需要在测试后进行清理。
或者您可以:
def test1():
from myapp import main
assert main()