我想用单元测试和包创建一个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中的许多顶级包,并防止任何包名称冲突。
我不知道有什么约定。如果你对这件事有意见,请把下面的一条评论投赞成票。

08-05 03:14