添加返回对象内部状态的函数以进行单元测试,而不是让测试类成为朋友,是否更好?- 特别是,当除了单元测试之外的功能没有用处时。

有帮助吗?

解决方案

95% 的时间单元测试应该只测试类的公开暴露的表面。如果您正在幕后测试某些内容,那就是测试实现细节,这本质上是脆弱的,因为您应该能够轻松更改实现并仍然让测试工作。它不仅脆弱,而且您还可能会尝试测试在计划的使用场景中实际上不可能的东西,这是浪费时间。

如果你想添加的访问器的目的只是为了测试函数是否达到了预期的效果,那么你的类设计可能会违反另一个原则,即类状态机的类应该始终明确它所处的状态,如果这会影响人们与班级互动时发生的事情。在这种情况下,提供这些只读访问器是正确的。如果它不影响类的行为,请参阅我之前有关实现细节的内容。

正如您正确地说的那样,用未使用的东西弄乱班级的公共表面也是不可取的,因为其本身的原因。

如果我 在您的情况下在访问器和好友之间进行选择,我会选择好友,仅仅是因为 拥有您的测试并可以在紧要关头更改它。您可能不拥有小丑找到使用额外访问器的方法的代码,然后您就会陷入困境。

其他提示

我将不同意接受的答案,而是建议使用朋友班。

您正在测试的州的一部分可能是针对班级实施的;您正在测试其他代码通常不知道或关心的详细信息,并且不应依靠。公共登录机功能使这些实现详细信息是班级接口的一部分。如果您正在测试的内部状态不是预期接口的一部分,则不应通过公共功能可见。从纯粹的角度来看,您会陷入两个错误的答案之间,因为从技术上讲,朋友课程也是公共界面的一部分。在我看来,这个问题变成了,哪种选择不太可能导致越来越多的编码选择?使用一组依赖实现的公共访问器功能将无意间鼓励该类的实现依赖性概念模型,从而导致对类的实现依赖性使用。适当命名和记录的单个朋友课程不太可能被滥用。

总的来说,尽管我强烈同意建议访问功能而不是直接访问会员变量的建议,但我不同意这种最佳实践适用于实现依赖性内部状态的单位测试。合理的中间立场是使用 私人的 您的单位测试对那些状态的访问函数将关心,并受到足够的纪律处分,可以在单元测试中使用访问器功能。只是我的观点。

使用朋友课程进行单元测试是一个完全合法的,可以维护封装。您不应仅修改公共界面,以使类更具测试。这样想。如果您购买了第三方FTP库,并且您正在尝试使用它,并且它的公共界面会弄乱一堆您甚至不需要仅仅因为单位测试而不需要知道的方法!即使修改受保护的界面以补偿单位测试也很不好。如果我从某些课程中继承,我不必担心哪些方法对我有用,哪些方法仅由于单位测试而在那里!!!使用朋友课程进行单元测试可帮助您维护简单,易于使用的类界面;它有助于保留封装和抽象!!!

我听说过这样的论点:使用朋友类进行单元测试是不好的,因为正在测试的类不应与其测试类“紧密耦合”,并且不应“知道”有关其测试类的任何内容。我不买这个。这是一条添加到全班顶部的一行:

朋友类myclasstest;

现在,您可以以任何方式测试您的课程!

现在,我确实同意,除非有必要,否则您不应使用朋友班。如果您可以测试需要测试而不成为朋友,请务必这样做。但是,如果生活变得困难并使用朋友课程使生活再次轻松,请使用它!

我建议使用访问者,而不是允许通过公共成员或朋友课程访问。

我认为使用朋友课程实际上不会带来任何好处,并且有可能使您的生活变得更糟。如果您的代码将长时间待一段时间,则很有可能以您预期的方式使用它。访问功能现在仅用于测试,但是谁知道将来会发生什么?使用访问者而不是提供对变量的直接访问可以使您更加灵活性,并且成本非常低。

另一个论点是,使用登录者而不是公共成员是一个好习惯。养成良好的习惯是作为程序员的重要技能。

如何使内部状态“受到保护”?然后使用派生类别进行Unitest。

我认为,如果这样做有意义,则需要通过向其用户提供配件并提高可测试性,从而可以通过向其用户提供配件来区分。我也不是为了进行测试目的的唯一目的而成为朋友的忠实拥护者,因为这在我不愿意拥有的地方引入了紧密的耦合。

如果唯一使用登录器是为测试案例检查课程内部状态的一种方法,那么公开公开暴露它们通常是没有意义的。它还可以将您可能希望以后更改的实施细节绑定到,但是由于其他人正在使用所述访问者,因此发现自己不能更改。

我首选的解决方案是提供 受保护 访问器功能可以与班级用户清楚地通信,这些功能不是公共接口的一部分。然后,您的测试将创建原始的最小派生类,其中包含用于父函数的呼叫存根,但也可以使配件公开,因此您可以在测试用例中使用它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top