8

我想创建一个带有单元测试和包的 pybuilder 项目。例如,修改了简单的 python 应用程序示例,将“helloworld”移动到包“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本身只是跳过了单元测试中的顶级 pybuilder 包,但如果有多个顶级包则不会这样做。

我的第二个猜测是为单元测试创​​建额外的顶级包。

\---unittest
    \---python
        \---tests
            |   __init__.py
            \---hello
                    helloworld_tests.py
                    __init__.py

是否有更好的解决方案或既定惯例如何在包中组织 python 测试?

4

1 回答 1

2

对于 OP 来说可能没有什么新东西,但我只是想在一个地方收集我能想到的所有选项:

1)只需附加_tests到顶级包的名称

src/main/pythonsrc/test/python几乎 1:1中镜像结构的最简单方法是简单地附加_tests到顶级包的名称。例如,如果我只有一个顶级包rootPkg,那么我可以添加对应rootPkg_teststest/子目录:

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

如果我理解正确的话,in 中的树unittest反映了 中的树,但省略src了顶级包的目录。pybuilder这就是您在问题中描述的第一个解决方法。缺点是如果有多个顶级包,它就不起作用了。

3)添加一个额外tests的顶级包

这就是您提出的解决方法:将树镜像到 中main,但将所有内容包装在附加的tests-package 中。这适用于许多顶级包,/src/main/python并防止任何包名冲突。


我不知道有任何约定。如果您对此事有意见,请支持以下评论之一。

于 2018-04-13T17:46:41.207 回答