Python单元测试去哪儿了?

时间:2020-03-05 18:52:55  来源:igfitidea点击:

如果我们正在编写库或者应用程序,则单元测试文件会放在哪里?

将测试文件与主应用程序代码分开是很好的选择,但是将它们放在应用程序根目录内的" tests"子目录中是很尴尬的,因为这样会使导入要测试的模块更加困难。

这里有最佳实践吗?

解决方案

回答

我认为没有公认的"最佳实践"。

我将测试放在应用程序代码之外的另一个目录中。然后,在运行所有测试之前,在测试运行器脚本(也执行其他操作)中,将主应用程序目录添加到sys.path中(允许我们从任何位置导入模块)。这样,我发布时就不必从主代码中删除测试目录,从而节省了时间和精力(即使是很小的数目)。

回答

一种常见的做法是将tests目录放置在与模块/软件包相同的父目录中。因此,如果模块名为foo.py,则目录布局如下所示:

parent_dir/
  foo.py
  tests/

当然,没有一种方法可以做到这一点。我们也可以创建一个tests子目录,并使用绝对导入来导入模块。

无论我们在哪里进行测试,我都建议我们使用鼻子进行测试。鼻子会在目录中搜索测试。这样,我们可以在组织上最有意义的地方进行测试。

回答

我最近开始用Python编程,所以我还没有真正找到最佳实践的机会。

但是,我编写了一个模块,可以查找并运行所有测试。

app/
 appfile.py
test/
 appfileTest.py

所以我有:

回答

我必须查看进展到更大项目时的进展情况。

from .. import foo

我使用tests /目录,然后使用相对导入来导入主要应用程序模块。因此,在MyApp / tests / foo.py中,可能有:

回答

导入MyApp.foo模块。

在C#中,我通常将测试分为一个单独的程序集。

回答

到目前为止,在Python中,我倾向于编写doctests(该测试位于函数的文档字符串中),或者将其放在模块底部的if if name==" __main __"`块中。

对于文件" module.py",遵循Pythonic命名约定,单元测试通常应称为" test_module.py"。

  • 与" module.py"位于同一目录。
  • ../ tests / test_module.py中(与代码目录处于同一级别)。
  • tests / test_module.py(代码目录下的一级)中。

有几个普遍接受的地方放置test_module.py

回答

我更喜欢#1,因为它可以轻松找到和导入测试。无论我们使用哪种构建系统,都可以轻松配置为运行以test_开头的文件。实际上,用于测试发现的默认" unittest"模式是" test * .py"。

回答

当编写一个名为" foo"的程序包时,我会将单元测试放入一个单独的程序包" foo_test"中。这样,模块和子程序包将与SUT程序包模块具有相同的名称。例如。在foo_test.x.y中可以找到模块foo.x.y的测试。然后,每个测试包的__init__.py文件都包含一个AllTests套件,其中包括该包的所有测试套件。 setuptools提供了一种方便的方法来指定主要的测试包,因此在" python setup.py开发"之后,我们可以仅使用" python setup.py test"或者" python setup.py test -s foo_test.x.SomeTestSuite"只是一个特定的套件。

>>> import module
>>> module.method('test')
'testresult'

如果测试很简单,只需将它们放在docstring中-大多数用于Python的测试框架都可以使用它:

回答

对于其他涉及更多的测试,我会将其放在../ tests / test_module.py或者tests / test_module.py中。

if __name__ == '__main__':
   do tests...

正如杰里米·坎特雷尔(Jeremy Cantrell)所述,我也倾向于将单元测试放在文件本身中,尽管我倾向于不将测试功能放在主体中,而是将所有内容放在

堵塞。最后,将文档添加到文件中作为"示例代码",以说明如何使用要测试的python文件。

if __name__ == '__main__':
   import tests.thisModule
   tests.thisModule.runtests

我应该补充一点,我倾向于编写非常紧凑的模块/类。如果模块需要大量测试,则可以将它们放在另一个测试中,但是即使如此,我仍然要添加:

回答

这使任何阅读源代码的人都知道在哪里可以找到测试代码。

我们用

app / src / code.py

app / testing / code_test.py

app / docs / ..

回答

在每个测试文件中,我们在sys.path中插入" ../src/"。这不是最好的解决方案,但可以。我认为,如果有人想出了java中的maven之类的东西,无论我们从事什么项目,都能为我们提供可以正常工作的标准约定,那就太好了。

  • 使用setuptools。然后我们可以将test_suite ='tests.runalltests.suite'传递到setup()中,并可以简单地运行测试:python setup.py test
  • 运行测试时设置PYTHONPATH:PYTHONPATH =。 python tests / runalltests.py

我更喜欢顶级测试目录。这确实意味着进口变得更加困难。为此,我有两个解决方案:

  • http://svn.osafoundation.org/m2crypto/trunk/setup.py
  • http://svn.osafoundation.org/m2crypto/trunk/tests/alltests.py

M2Crypto中的代码如何支持这些东西:

回答

如果我们希望通过鼻子测试运行测试,则可能需要做一些不同的事情。

回答

在编写Pythoscope(http://pythoscope.org)时,我们遇到了同样的问题,该问题为Python程序生成了单元测试。在选择目录之前,我们对python列表中的测试人员进行了调查,结果有很多不同的见解。最后,我们选择将" tests"目录放置在与源代码相同的目录中。在该目录中,我们为父目录中的每个模块生成一个测试文件。

我该怎么做...

project/
    src/
        code.py
    tests/
    setup.py

资料夹结构:

setup.py develop

Setup.py指向src /作为包含我的项目模块的位置,然后运行:

setup.py tests

它将我的项目添加到站点程序包中,指向我的工作副本。要运行测试,我使用:

段落数量不匹配