unit testing构造函数是否很重要?

我应该unit testing构造函数吗? 说我有这样的构造函数:

IMapinfoWrapper wrapper; public SystemInfo(IMapinfoWrapper mapinfoWrapper) { this.wrapper = mapinfoWrapper; } 

我需要为这个construtor写一个unit testing吗? 我没有任何包装variables的getter,所以我不需要testing。

unit testing是关于testing对象的公共状态,行为和交互。

如果你只是在你的构造函数中设置一个私有字段,那么有什么要testing的呢?

不要打扰unit testing你的简单访问器和增变器。 这太愚蠢了,对任何人都没有帮助。

是。 如果你的构造函数中有逻辑,你应该testing它。 简单地设置属性不是逻辑IMO。 条件,控制stream程等是逻辑。

编辑:你可能应该testing什么时候IMapinfoWrapper为空,如果该依赖是必需的。 如果是这样,那么这是逻辑,你应该有一个testing,捕获你的ArgumentNullException或其他…你的testing是定义如何代码的行为规范。 如果抛出一个ArgumentNullException,那么应该在testing中指定。

问:如果你在构造函数中设置一个成员variables,为什么要设置呢?

答:因为你有一个失败的unit testing,只能通过在构造函数中设置来传递。

如果你使用这个逻辑,你只写代码来使unit testing通过(testing驱动开发),那么你已经有了你的问题的答案。

不可以。其function将由class上所有其他unit testing进行testing。

你绝对应该testing构造函数。 如果你有一个默认的构造函数,你应该testing它可以被调用。 如果后来这个类发生了变化 – 也许它变成了一个单例,或者默认的构造函数被删除而变成了一个需要参数的variables呢? 在这种情况下,testing应该失败以提醒改变(为了满足新的要求,可以修改类或testing)。

默认构造函数的存在是一个需要testing的需求。 即使所有构造函数都设置了将在其他地方进行testing的私有成员,但是应该testing一个有无参数构造函数的事实。

在许多FDApipe理的环境中,更关键的代码必须经过100%testing……包括类的构build。 所以,对于构造函数的testing有时是必要的,而不pipe推理或不testing它们。 此外,使用静态分析工具的公司需要确保类的所有数据成员都已正确初始化,以避免错误,尽pipe代码运行平稳且没有错误。 通常数据成员的初始化是在构造函数中完成的……只是为了思考。

这取决于。

我不会为你给的例子这么简单的东西写一个专门的构造函数testing。

但是,如果你在构造函数中有一个逻辑testing,比如参数validation,那么肯定是的。 尽pipe像原来的海报一样,如果可能的话,我在构造函数中不做任何工作,但通常必须完成参数validation。 在这种情况下,不得不让构造函数做一些工作。 如果构造函数中有逻辑,总是有可能是错误的,所以我把它和其他方法调用一样,并对其进行适当的testing。

除非开发人员确保不能更改状态逻辑,否则还需要testing访问器和增变器。 例如,如果使用Singleton的devise模式,通常使用访问器或属性,并且如果该类未初始化,则由于构造函数是私有的,所以从访问器完成。 在C ++中,可以使它们的函数为常量或静态,其中不能更改类的数据成员。 (注意:即使使用static也是有点冒险的,因为这些variables通常是全局的)。但是,如果没有testing,如果有人不使用预防措施,那么如何保证100%的准确性,使得写入的内容不能成为失败时间? 维护几乎不是万无一失的。

我想这个答案是“是”。

这里有很多代码,可怕的是一个初始化的对象状态,而不是一个空引用 – 通常是在构造函数中没有赋值的时候。

我很高兴有构造函数的testing会在初始化公共成员值发生变化时提醒我。 这是关于防御性testing – 我是务实的,并且更乐意进行testing,并且在显示出没有帮助或有用的时候将其删除。

我testing构造函数,当他们包含逻辑 – 例如validation或条件设置私人状态。 validation错误以构造函数抛出的exception结束。 成功的执行结束于对象的创build,该对象根据在构造函数中设置的状态展现特定的行为。 无论哪种方式,都需要testing。 但构造函数testing是无聊的,因为它们看起来都一样 – 调用构造函数,做一个断言。 testing方法声明通常需要比整个testing逻辑更多的空间…所以我写了一个简单的testing库,帮助编写构造函数的声明性testing: 如何轻松testingC#中构造函数中的validation逻辑

这里是一个例子,我在一个类的构造函数上尝试了七个testing用例:

 [TestMethod] public void Constructor_FullTest() { IDrawingContext context = new Mock<IDrawingContext>().Object; ConstructorTests<Frame> .For(typeof(int), typeof(int), typeof(IDrawingContext)) .Fail(new object[] { -3, 5, context }, typeof(ArgumentException), "Negative length") .Fail(new object[] { 0, 5, context }, typeof(ArgumentException), "Zero length") .Fail(new object[] { 5, -3, context }, typeof(ArgumentException), "Negative width") .Fail(new object[] { 5, 0, context }, typeof(ArgumentException), "Zero width") .Fail(new object[] { 5, 5, null }, typeof(ArgumentNullException), "Null drawing context") .Succeed(new object[] { 1, 1, context }, "Small positive length and width") .Succeed(new object[] { 3, 4, context }, "Larger positive length and width") .Assert(); } 

通过这种方式,我可以在不打字的情况下testing所有相关的构造函数。

我相信100%的覆盖面。 此外,100%的覆盖范围不是简单地通过模拟事物或设置和获取事物来testing简单的交互,而是通过更多的集成/验收testing来检查function。 所以,如果你最终编写了非常好的集成/验收testing,那么你所有的构造函数(以及简单的方法,如setter和getter)都应该被调用。

什么行为的SystemInfo的实例取决于wrapper的价值?

如果任何事情可能出错(例如,空值导致破损),那么我build议编写描述每个这种情况的场景,并用它们来推动适当的unit testing的定义。

如果所有的场景最终都依赖于IMapinfoWrapper的私有实例的状态或行为,那么我build议在这个类上编写unit testing。

除非你正在编写一个编译器,否则不会,因为你只能testing编译器能够生成代码来完成分配,这通常是毫无意义的。

现在,在更平常的情况下,如果你想用包装做别的事情,那么也许有一点。 例如,如果您尝试传递null值,则可以抛出ArgumentNullException,理论上可以进行unit testing。 即使如此,testing的价值也是非常小的。

就我个人而言,我几乎从不明确地testing构造函数。 如果它们足够复杂以至于需要testing,我倾向于觉得代码在臭的一面是有点的。

如果构造函数包含一些逻辑,比如初始化一个类,我想你应该testing这个构造函数。 或者你可以和开发者交谈,把初始化放在构造函数中会降低被测代码的可testing性。

unit testing是关于检查执行的path,通常被称为循环复杂性

如果你没有select的path,没有如果,没有循环,没有GOTO(= P)它不是很有用