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测试?
对于OP来说可能没什么新鲜的,但我只是想把我能想到的所有选项收集在一个地方:
\n\n1)只需附加_tests到顶级包的名称
src/main/python镜像几乎1:1结构的最简单方法src/test/python是简单地附加_tests到顶级包的名称。例如,如果我只有一个顶级包rootPkg,那么我可以将相应的添加rootPkg_tests到test/子目录中:
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\nRun Code Online (Sandbox Code Playgroud)\n\n这似乎与 PyBuilder 0.11.15 和插件配合得很好unittest(请注意,我偏离了 PyBuilders 约定,并将测试放在test而不是 中unittest,如果您打算使用多个测试框架,您可能不应该这样做)。
2)如果只有一个包:像PyBuilder那样做
\n\nPyBuilder 本身是用 PyBuilder 构建的。这是它的源目录的样子(大大减少,省略不必要的细节):
\n\nsrc\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\nRun Code Online (Sandbox Code Playgroud)\n\n如果我理解正确的话, 中 的树unittest镜像 中 的树,但省略了src顶级包的目录。pybuilder这就是您在问题中所描述的第一个解决方法。缺点是如果有多个顶级包,它就不起作用了。
3) 添加一个额外的tests顶级包
这就是您提出的解决方法:将树镜像到main,但将所有内容包装在附加的tests-package 中。这适用于许多顶级包/src/main/python并防止任何包名称冲突。
我不知道有任何约定。如果您对此事有意见,请对下面的评论之一进行投票。
\n