Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 为什么rdmd不能运行所有的单元测试?_Unit Testing_D_Dmd - Fatal编程技术网

Unit testing 为什么rdmd不能运行所有的单元测试?

Unit testing 为什么rdmd不能运行所有的单元测试?,unit-testing,d,dmd,Unit Testing,D,Dmd,不幸的是,我似乎无法在一个最小的工作示例中重现这种行为,因此这可能太模糊了。但是,我至少可以说明什么不是导致这种行为的原因 我有一个D模块,包含几个带有单元测试的类,其结构类似于: import std.stdio; class c1{ int c1func(int blah){ return blah; } unittest{ writeln("Testing c1 func."); stdout

不幸的是,我似乎无法在一个最小的工作示例中重现这种行为,因此这可能太模糊了。但是,我至少可以说明什么不是导致这种行为的原因

我有一个D模块,包含几个带有单元测试的类,其结构类似于:

import std.stdio;

class c1{
        int c1func(int blah){ return blah; }
        unittest{
                writeln("Testing c1 func.");
                stdout.flush();
        }
}

class c2(T:c3) : c1{
        private static int c2func(int blah){ return blah; }
        unittest{
                writeln("Testing c2 func.");
                stdout.flush();
        }

        int c2fun2(int blah){
                T tmp = new T();
                return tmp.c3fun(blah);
        }
}

class c3{
        abstract int c3fun(int blah);
}

class c4 : c3{
        override int c3fun(int blah){ return blah; }
}

unittest{
        writeln("Testing class c1.");
        stdout.flush();
        c1 myc2 = new c2!(c4)();
}
我的期望是,一个形式的调用:

rdmd --main -unittest tmp.d
将产生产出

Testing c1 func.
Testing class c1.
Testing c2 func.
确实如此(c2 func的单元测试直到实例化时才运行)

然而,在我类似但较长的D模块中,没有运行与模板类c2对应的单元测试(我在其他单元测试中使用了与此处相同的打印语句)

这有点令人担忧,因为事实上,我依赖这些其他单元测试的正确性已经有一段时间了。此外,rdmd很高兴地发现单元测试代码中的语法错误,尽管从未运行过上述代码

因此,我可以排除以下情况:

  • rdmd正在读取单元测试
  • rdmd实际上是针对文件的最新版本运行的
  • rdmd显然很乐意为模板类的实现运行单元测试,即使它们的参数是抽象类的特殊化,只要这些模板类是实际实例化的
  • 我的模板类中的函数(类似于示例代码中的c2)实际上是在底部的主单元测试块期间被调用的,因此模板类已经被实例化了
  • rdmd本身没有问题,因为使用dmd和相同的标志进行编译也无法运行这些单元测试

你知道这里会出什么问题吗?如果可以的话,我会提供一个MWE,但我写的每一个版本似乎都很好用

这似乎是由rdmd命令单元测试的方式导致的,这与我预期的方式不同

RDMD似乎不是在实例化时调用实例化模板类的单元测试,而是在实例化类的单元测试完成后立即调用

这里有一个MWE:

import std.stdio;

class c1{
        int c1func(int blah){ return blah; }
        unittest{
                writeln("Testing c1 func.");
                stdout.flush();
        }
}

class c2(T:c3) : c1{
        private static int c2func(int blah){ return blah; }
        unittest{
                writeln("Testing c2 func.");
                stdout.flush();
        }

        int c2fun2(int blah){
                T tmp = new T();
                return tmp.c3fun(blah);
        }
}

class c3{
        abstract int c3fun(int blah);
}

class c4 : c3{
        override int c3fun(int blah){ return blah; }
}

unittest{
        writeln("Testing class c1.");
        stdout.flush();
        c1 myc2 = new c2!(c4)();
        assert(1==0);
}
在这种情况下,底部的单元测试将失败(因为assert(1==0)),因此模板类的单元测试永远不会运行

当将模板类与单元测试一起使用时,这会带来一个主要问题。如果您的模板类以某种方式被破坏,导致实例化它的单元测试失败,那么它自己的单元测试永远不会运行。在静默失败的情况下(模板类中的bug在我的代码中触发了静默退出),这将表现为模板类的测试从未运行

摘要:DMD通常只按单元测试出现的顺序运行单元测试。但是,由于模板类在没有完成模板的情况下是不存在的,因此模板类中的单元测试不会按照它们出现的顺序运行。相反,它们(按顺序)在模板类实例化的第一个单元测试之后立即运行


解决方法:在模板类的正下方添加一个单独的单元测试,该类仅使用所有要测试的类型对其进行实例化,这将导致单元测试以正确的顺序运行。然而,一个似乎更好的策略是在实例化发生的测试块之前运行那些单元测试

编译器按照词法顺序运行unittest。然而,当unittest位于模板内时,它将成为实例化的一部分。。。从词汇上讲,实例化出现在最后,因此C2的unittest运行在最后。我自己也一直忘记这一点。相关:未在自己的模块中实例化的非抽象类不会为其方法运行unittests。解决方法与此类似。