单元测试包Maven风格约定

ket*_*rin 7 python unit-testing coding-style directory-structure pybuilder

我想用单元测试和包创建一个pybuilder项目.作为一个例子,修改了简单的python应用程序示例,将"helloworld"移动到打包"hello".

我的第一直觉是将包结构与"main"和"unittest"源相匹配:

+---src
   +---main
   |   \---python
   |       \---hello
   |               helloworld.py
   |               __init__.py
   |
   \---unittest
       \---python
           \---hello
                   helloworld_tests.py
                   __init__.py
Run Code Online (Sandbox Code Playgroud)

由于冲突的"hello"包,这不起作用.

BUILD FAILED - 'module' object has no attribute 'helloworld_tests'
Run Code Online (Sandbox Code Playgroud)

我看到pybuilder本身只是跳过单元测试中的顶级pybuilder包,但如果有多个顶级包则不会这样做.

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

\---unittest
    \---python
        \---tests
            |   __init__.py
            \---hello
                    helloworld_tests.py
                    __init__.py
Run Code Online (Sandbox Code Playgroud)

有没有更好的解决方案或已建立的约定如何在包中组织python测试?

And*_*kin 2

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

\n\n

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

\n\n

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

\n\n
src\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 python\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rootPkg\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkgA\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 modA.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pkgB\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0         \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 modB.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 entryPointScript.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 python\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 rootPkg_tests\n            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n            \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pkgA\n            \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n            \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 modA_tests.py\n            \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pkgB\n                \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n                \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 modB_tests.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

这似乎与 PyBuilder 0.11.15 和插件配合得很好unittest(请注意,我偏离了 PyBuilders 约定,并将测试放在test而不是 中unittest,如果您打算使用多个测试框架,您可能不应该这样做)。

\n\n

2)如果只有一个包:像PyBuilder那样做

\n\n

PyBuilder 本身是用 PyBuilder 构建的。这是它的源目录的样子(大大减少,省略不必要的细节):

\n\n
src\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 python\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pybuilder\n\xe2\x94\x82   \xe2\x94\x82    \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core.py\n\xe2\x94\x82   \xe2\x94\x82\xc2\xa0\xc2\xa0 \xc2\xa0\xc2\xa0  \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 plugins\n\xe2\x94\x82   \xe2\x94\x82    \xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0      \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core_plugin.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0      \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 exec_plugin.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scripts\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 pyb\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 unittest\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 python\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cli_tests.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core_tests.py\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 plugins\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 exec_plugin_tests.py\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 python\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 core_plugin_tests.py\n        \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n
\n\n

我不知道有任何约定。如果您对此事有意见,请对下面的评论之一进行投票。

\n