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

Par*_*bay 7 testing unit-testing d

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

我在很多项目中都看到,单元测试放在实际代码旁边(例如http://wiki.dlang.org/Unittest#Placement).

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

在Java(和其他JVM语言)中,惯例恰恰相反 - 将测试保存在单独的文件中(通常反映测试中的单元包装).

是否有可能在D中为单元测试提供单独的文件?

我很想拥有一个经典的设置:

dub.json
/source/mylib/app.d
/tests/mylib/app_tests.d
Run Code Online (Sandbox Code Playgroud)

与DUB集成的文件app_tests(与其他文件一样tests) - 仅在--unittests等等期间编译/运行

eme*_*esx 8

我不知道约定,但我最近遇到了这样的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"
            }
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我在DUB来源中找到了这个想法.现在,如果你运行dub应用程序将被构建,如果你运行dub test单元测试(放入tests/)将运行.

这不是完美的,我仍然没有完成所有工作,但我的工作符合我的简单需求.

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

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


Jon*_*vis 6

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

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