如何衡量静态测试的覆盖率?

时间:2020-05-10 18:37:45

标签: testing code-coverage d template-meta-programming

因此,DLang(有效地)内置了代码覆盖范围。这很酷。

我的问题是,我做了很多元编程。我倾向于按static assert s来测试模板:

template CompileTimeFoo(size_t i)
{
    enum CompileTimeFoo = i+3;
}

unittest
{
    static assert(CompileTimeFoo!5 == 8);
}

不幸的是(显然),在进行具有覆盖率的测试时,CompileTimeFoo的正文将不被视为“命中”或“可命中”行。

现在,让我们考虑稍微复杂一些的模板:

enum IdentifierLength(alias X) = __traits(identifier, X).length;

void foo(){}

static assert(IdentifierLength!foo == 3);

在这种情况下,仍然没有“匹配”,但是只有一个可匹配的行(定义了foo)。因此,我的覆盖率降至0%(在此示例中)。如果您看一下this submodule of my pet project并在codecov上进行了介绍,您将看到这种确切的情况-我已经准备了一个不错的测试套件,但看起来整个模块都是荒地,因为是0%(或接近)。

免责声明:我想将测试保留在不同的源集中。这是一个问题,但是我不喜欢将测试与生产代码混合。我不完全知道如果将foo包装在version(unittest){...}中会发生什么,但是我希望(由于此代码将被推送到编译器),它不会有太大变化。

再次:我要做理解为什么会这样。我想知道是否有一些解决方法?具体来说:有没有一种方法可以计算在编译期间仅被调用的对象的覆盖率?

当我进行混合操作时,为了覆盖范围,我可以修改测试,只是通过在运行时比较字符串来测试代码生成的事物,但是:1.这很丑陋,并且2.它不涉及上述情况。

0 个答案:

没有答案