我想用单元测试和包创建一个PyBuilder项目。例如,modifiedsimple python appexample,with“helloworld”moved to package“hello”.
我的第一直觉是将包结构与“main”和“unittest”源匹配:
+---src
+---main
| \---python
| \---hello
| helloworld.py
| __init__.py
|
\---unittest
\---python
\---hello
helloworld_tests.py
__init__.py
这不起作用,因为“hello”包冲突。
BUILD FAILED - 'module' object has no attribute 'helloworld_tests'
我看到pybuilder本身只是跳过UnitTests中的顶级PyBuilder包,但如果有多个顶级包,则不会这样做。
我的第二个猜测是为UnitTests创建额外的顶级包。
\---unittest
\---python
\---tests
| __init__.py
\---hello
helloworld_tests.py
__init__.py
是否有更好的解决方案或已建立的惯例来组织包中的Python测试?
最佳答案
可能这对OP来说并不是什么新鲜事,但我只想收集我能在一个地方找到的所有选项:
1)只需将_tests
附加到顶级包的名称中即可。
在几乎1:1的src/main/python
中,镜像src/test/python
结构的最简单方法是将_tests
添加到顶级包的名称中。例如,如果我只有一个顶级包,那么我可以将相应的rootPkg
添加到rootPkg_tests
子目录中:
src
├── main
│ ├── python
│ │ └── rootPkg
│ │ ├── __init__.py
│ │ ├── pkgA
│ │ │ ├── __init__.py
│ │ │ └── modA.py
│ │ └── pkgB
│ │ ├── __init__.py
│ │ └── modB.py
│ └── scripts
│ └── entryPointScript.py
└── test
└── python
└── rootPkg_tests
├── __init__.py
├── pkgA
│ ├── __init__.py
│ └── modA_tests.py
└── pkgB
├── __init__.py
└── modB_tests.py
这似乎可以很好地与PyBuilder 0.11.15和
test/
插件配合使用(请注意,我已经偏离了PyBuilders约定,将测试放在了unittest
而不是test
中,如果您打算使用多个测试框架,则可能不应该这样做)。2)如果只有一个包:像pybuilder一样吗?
pybuilder本身就是用pybuilder构建的。这就是它的源目录的样子(大大减少了,省略了不必要的细节):
src
├── main
│ ├── python
│ │ └── pybuilder
│ │ ├── __init__.py
│ │ ├── cli.py
│ │ ├── core.py
│ │ └── plugins
│ │ ├── __init__.py
│ │ ├── core_plugin.py
│ │ └── exec_plugin.py
│ └── scripts
│ └── pyb
└── unittest
└── python
├── cli_tests.py
├── core_tests.py
├── plugins
│ ├── exec_plugin_tests.py
│ ├── __init__.py
│ ├── python
│ │ ├── core_plugin_tests.py
│ │ ├── __init__.py
如果我理解正确,那么
unittest
中的树将镜像unittest
中的树,但顶级包的目录将被省略。这就是您在问题中所描述的第一个解决方法。缺点是,如果有多个顶级包,它就不能真正工作。3)增加一个顶层包
这就是您建议的解决方法:在
src
中镜像树,但将所有内容包装在一个额外的pybuilder
包中。这适用于tests
中的许多顶级包,并防止任何包名称冲突。我不知道有什么约定。如果你对这件事有意见,请把下面的一条评论投赞成票。