如果你正在编写一个库或应用程序,那么单元测试文件应该放在哪里?

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

这里是否存在最佳实践?


当前回答

When writing a package called "foo", I will put unit tests into a separate package "foo_test". Modules and subpackages will then have the same name as the SUT package module. E.g. tests for a module foo.x.y are found in foo_test.x.y. The __init__.py files of each testing package then contain an AllTests suite that includes all test suites of the package. setuptools provides a convenient way to specify the main testing package, so that after "python setup.py develop" you can just use "python setup.py test" or "python setup.py test -s foo_test.x.SomeTestSuite" to the just a specific suite.

其他回答

我最近开始用Python编程,所以我还没有机会找到最佳实践。 但是,我已经写了一个模块,它可以找到所有的测试并运行它们。

所以,我有:

app/
 appfile.py
test/
 appfileTest.py

当我进入更大的项目时,我得看看情况如何。

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

parent_dir/
  foo.py
  tests/

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

无论您在哪里进行测试,我都建议您使用nose来运行它们。Nose在您的目录中搜索测试。这样,您就可以把测试放在组织上最有意义的地方。

我是怎么做的…

文件夹结构:

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

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

setup.py develop

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

setup.py tests

使用我配置的任何测试运行程序。

我将测试放在与测试代码(CUT)相同的目录中。在项目中,我可以用我的插件调整pytest,对于foo.py,我使用foo.pt进行测试,这使得编辑特定的模块及其测试非常容易:vi foo.*。

在不能这样做的地方,我使用foo_ut.py或类似的方法。你仍然可以使用vi foo*,尽管它也会捕获foobar.py和foobar_ut.py(如果它们存在的话)。

在这两种情况下,我调整测试发现过程来找到这些。

这将测试放在目录列表中代码的旁边,使测试明显地存在于那里,并使打开测试尽可能容易,当它们位于单独的文件中时。(对于从命令行开始的编辑器,如上所述;对于GUI系统,单击代码文件和相邻的(或非常接近相邻的)测试文件。

正如其他人所指出的,这也使得重构和提取代码以供在其他地方使用变得更容易。

I really dislike the idea of putting tests in a completely different directory tree; why make it harder than necessary for developers to open up the tests when they're opening the file with the CUT? It's not like the vast majority of developers are so keen on writing or tweaking tests that they'll ignore any barrier to doing that, instead of using the barrier as an excuse. (Quite the opposite, in my experience; even when you make it as easy as possible I know many developers who can't be bothered to write tests.)

在c#中,我通常将测试分离到单独的程序集中。

在Python中——到目前为止——我倾向于编写doctests,其中测试位于函数的文档字符串中,或者将它们放在模块底部的if __name__ == "__main__"块中。