我想用单元测试和包创建一个pybuilder项目。例如,修改后的simple python app示例,将“helloworld”移至包装“hello”。
我的第一直觉是将包结构与“main”和“unittest”来源相匹配:
BUILD FAILED - 'module' object has no attribute 'helloworld_tests'
由于冲突的“hello”包,这不起作用。
\---unittest
\---python
\---tests
| __init__.py
\---hello
helloworld_tests.py
__init__.py
我看到pybuilder本身只是跳过单元测试中的顶级pybuilder包,但如果有多个顶级包则不会这样做。
我的第二个猜测是为单元测试创建额外的顶级包。
{{1}}
有没有更好的解决方案或已建立的约定如何在包中组织python测试?
答案 0 :(得分:1)
OP可能没有什么新东西,但我只是想在一个地方收集所有可以选择的选项:
1)只需将_tests
附加到顶级软件包的名称
在src/main/python
几乎1:1中镜像src/test/python
的结构的最简单方法是,只需将_tests
附加到顶级包的名称即可。例如,如果我只有一个顶级包rootPkg
,那么我可以将相应的rootPkg_tests
添加到test/
子目录中:
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和unittest
插件(请注意我偏离了PyBuilders约定,并将测试放在test
而不是unittest
中,你可能如果您打算使用多个测试框架,则不应该这样做。)
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
中的树会镜像src
中的树,但会忽略顶级包pybuilder
的目录。这就是您在问题中描述的第一个解决方法。缺点是,如果有多个顶级软件包,它就无法正常工作。
3)添加一个tests
顶级软件包
这就是你提出的解决方法:镜像main
中的树,但将所有内容包装在另一个tests
包中。这适用于/src/main/python
中的许多顶级包,可防止任何包名冲突。
我不知道任何惯例。如果您对此事有意见,请提出以下评论之一。