Unit testing 将单元测试保存在D中的单独文件中

Unit testing 将单元测试保存在D中的单独文件中,unit-testing,testing,d,Unit Testing,Testing,D,我想测试用D编写的代码。我正在使用DUB来构建项目(但到目前为止,配置相当基本:只有名称和dunitdependency) 我在许多项目中看到单元测试放在实际代码的旁边(例如) 虽然这对于小模块和简单测试来说是可以的,但是如果我真的想测试我的代码呢 在Java(和其他JVM语言)中,约定正好相反——将测试保存在单独的文件中(通常镜像测试单元的打包) 是否可以为D中的单元测试创建单独的文件? 我希望有一个经典的设置: dub.json /source/mylib/app.d /tests/myli

我想测试用D编写的代码。我正在使用DUB来构建项目(但到目前为止,配置相当基本:只有名称和
dunit
dependency)

我在许多项目中看到单元测试放在实际代码的旁边(例如)

虽然这对于小模块和简单测试来说是可以的,但是如果我真的想测试我的代码呢

在Java(和其他JVM语言)中,约定正好相反——将测试保存在单独的文件中(通常镜像测试单元的打包)

是否可以为D中的单元测试创建单独的文件?

我希望有一个经典的设置:

dub.json
/source/mylib/app.d
/tests/mylib/app_tests.d

由于文件
app_tests
(与其他文件unter
tests
)与DUB集成,因此只有在
--unittests
等过程中才编译/运行。

请记住,Java没有模块(但是当项目Jigsaw最终合并时,Java 9中的模块会发生变化),也没有内置的单元测试。如果是这样的话,情况可能会有所不同。我们将单元测试与要进行单元测试的代码片段保持在尽可能接近的位置,有几个正当的理由。最明显的是地方性。为了分析编写单元测试的方法,您必须在测试包和Java类所在的常规包之间切换多少次?:)


为了回答你的问题,我认为没有理由不能在单独的模块中进行单元测试。试一试,如果我是你,我会这么做。

没有什么能阻止你在一个文件中使用
unittest
块测试另一个模块的代码。您可以在
unittest
块中放入任何可以放入正常函数的内容。但是,除非被测试模块中有
unittest
块,否则您将无法访问被测试模块的任何私有成员。访问修饰符的正常限制适用


D社区中有一些人不喜欢将他们的单元测试放在正在测试的内容旁边,并选择将测试放在单独的文件中,但D的单元测试设施的设计理念是,您可以将测试放在他们正在测试的功能旁边。当您忘记对函数进行单元测试时,这会使情况变得更加明显,并使一起修改代码和测试变得更加容易。这是D的标准库所做的,而且,大多数D程序员都会选择这样做。嗯,这样维护更好,如果你认为这样会使模块太大,那么你可能会使模块太大,或者你对模块的大小过于挑剔。但很明显,这是主观的,这取决于你是否想把你的测试和他们正在测试的测试放在同一个模块中。您只需记住,如果它们是分开的,则它们无法访问正在测试的模块的任何私有成员。

我不知道约定,但我最近遇到了这样一种DUB解决方案:

{
    "name": "sample",
    "description": "sample app",

    "configurations": [
        {
            "name": "application",
            "targetType": "executable",
        },
        {
            "name": "unittest",
            "targetType": "executable",
            "targetPath" : "tests",
            "buildOptions": ["unittests"],
            "excludedSourceFiles": ["source/app.d"],
            "sourcePaths": ["tests/"],
            "importPaths": ["tests/"],
            "dependencies": {
                "dunit": ">=1.0.9"
            }
        }
    ]
}
我在书里找到了这个想法。现在,如果您运行
dub
,将构建应用程序,如果您运行
dub test
,将运行单元测试(位于
tests/

这不是完美的,我仍然没有解决所有的问题,但可以满足我的简单需求

其中一个问题是,独立的单元测试模块无法访问源中的私有元素(尽管它们可以访问包和公共元素)


我不完全确定这种配置是否有一些我不知道的副作用。也许有更有经验的人会验证这种方法。

我希望将测试分开,以使模块文件保持较小。然后,我甚至可以有10个文件来测试单个模块(具有分离测试目的,比如极端值、边缘情况和常规输入)。我还想知道如果测试在单独的文件中,是否可以测试
private
部件。当然,我不知道如何告诉没有最好文档记录的DUB去做我描述的事情。如果你真的想把测试放在不同的文件中,就把它们放在同一个目录/包中。IIRC同一软件包中的所有模块都具有更高的访问权限。也许您希望将测试数据保存在单独的文件中(可能与其他模块共享),并将测试代码保存在模块本身中?