单元测试-有关对库/框架进行单元测试的最佳实践是什么?

语境

我正在努力为我正在设计的库/框架编写一组单元测试.对于上下文,请考虑将我的库看作是一组相关对象的分层结构上的对象层.

基本上,我试图遵循有关单元测试的原则和最佳实践,如some posts here所示,但它们似乎与专门对库或框架进行单元测试有关.

例如,基本测试涉及“创建工件”.还有一个带有“删除工件”的选项.但是,由于单元测试应该是独立的,并且可以在完成后恢复世界的状态,所以这两个测试似乎都有些相关:在测试工件创建时,我们需要在测试结束时通过实际清理状态删除它.这意味着去除伪影本身是经过隐式测试的.同样的道理也适用于测试工件移除:为了设置世界以便测试工件移除是可测试的,我们需要首先创建一个新工件.

当我们需要对相关子工件的创建和删除进行单元测试时,情况变得更加复杂,为此我们需要相应地建立环境.

我倾向于按顺序执行一组相关的单元测试,以便每个单元测试都是离散的(即,仅测试一个对象和一个对象),但是要依靠顺序中的先前测试来逐步建立世界.然后,我的序列如下所示:

[创建工件]-> [创建子工件]-> [删除子工件]-> [删除工件]

按照这一原则,整个库/框架都经过了单元测试,并且在整个测试套件运行结束时恢复了状态.但是,这意味着测试套件中间的任何故障都会“破坏世界”.

有哪些最佳实践和准则可用于调和那些矛盾的需求?

参考文献

What makes a good unit test?

Is it bad form to have unit test calling other unit tests?

最佳答案
按照Glen Beck和co使用的严格的单元测试定义,在您所处的环境中创建单元测试实际上可能不是一个好主意.

对于任何不希望您的工作站使用的库,您肯定且毫无疑问地需要使用一整套用户级API系统测试.那些以完整的客户端代码使用整个系统的方法,而不是孤立地进行.

一旦有了这些,则取决于:

>执行时间(受您的语言和工作性质的影响).
>内部隐藏的复杂性
> API的大小
>库中同时开发的人数
>建立时间

您很可能可以设置一套完整的系统测试,涵盖所有需要涵盖的内容并在几秒钟内执行.您可以通过在最低级别和最复杂的10%的代码上进行少量集中的单元测试来补充这一点,但是完全覆盖单元级别上的所有内容可能会浪费很多精力.

注意:在系统是库的情况下,像Junit这样的单元测试工具非常适合创建这样的完整系统测试.因此,很多人最终将其称为单元测试.只要您不认为给他们起名字来改变他们的工作方式,这是很好的.

进行良好的单元测试的质量不仅不适用,而且很可能有害.

转载注明原文:单元测试-有关对库/框架进行单元测试的最佳实践是什么? - 代码日志