Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 使用单元测试的实用重构_Unit Testing_Refactoring_Legacy Code - Fatal编程技术网

Unit testing 使用单元测试的实用重构

Unit testing 使用单元测试的实用重构,unit-testing,refactoring,legacy-code,Unit Testing,Refactoring,Legacy Code,刚刚阅读了的前四章,我开始了我的第一次重构,几乎立即遇到了一个障碍。它源于这样一个需求,即在开始重构之前,应该对遗留代码进行单元测试。这使您能够确保重构没有改变原始代码所做的事情(只改变了它是如何做的) 所以我的第一个问题是:如何在遗留代码中对方法进行单元测试?我如何将一个单元测试放在一个500行(如果我幸运的话)方法周围,而这个方法不只是完成一项任务?在我看来,我必须重构我的遗留代码,使其能够进行单元测试 有没有人有过使用单元测试进行重构的经验?如果有的话,你有什么实际的例子可以和我分享吗 我

刚刚阅读了的前四章,我开始了我的第一次重构,几乎立即遇到了一个障碍。它源于这样一个需求,即在开始重构之前,应该对遗留代码进行单元测试。这使您能够确保重构没有改变原始代码所做的事情(只改变了它是如何做的)

所以我的第一个问题是:如何在遗留代码中对方法进行单元测试?我如何将一个单元测试放在一个500行(如果我幸运的话)方法周围,而这个方法不只是完成一项任务?在我看来,我必须重构我的遗留代码,使其能够进行单元测试

有没有人有过使用单元测试进行重构的经验?如果有的话,你有什么实际的例子可以和我分享吗

我的第二个问题有点难以解释。下面是一个示例:我想重构一个遗留方法,该方法从数据库记录填充对象。我不需要编写一个单元测试来比较使用旧方法检索的对象和使用重构方法检索的对象吗?否则,我怎么知道我的重构方法会产生与旧方法相同的结果?如果这是真的,那么我在源代码中保留旧的不推荐的方法多长时间?在我测试了一些不同的记录后,我是否就可以重击它?或者,我是否需要将其保留一段时间,以防在重构代码中遇到错误


最后,由于一些人提出了问题……遗留代码最初是用VB6编写的,然后移植到VB.NET,只需对架构进行最小的更改。

这确实是尝试重新安装遗留代码的关键问题之一。你能把问题领域分解成更细粒度的东西吗?除了对JDK/Win32/.netframeworkjars/DLLs/assemblies进行系统调用之外,这个500多行方法还进行其他调用吗?也就是说,在这个500多行的庞然大物中是否有更多的细粒度函数调用可以进行单元测试?

根据我的经验,我不会为遗留代码中的特定方法编写测试,而是为它提供的整体功能编写测试。这些可能与现有的方法紧密相关,也可能与现有的方法不紧密相关。

理论符合实际的好例子。单元测试旨在测试单个操作,许多模式纯粹主义者坚持这样做,因此我们有可爱的干净代码和测试。然而,在真实的(混乱的)世界中,代码(特别是遗留代码)做了很多事情,并且没有测试。这需要一定量的重构来清理混乱

我的方法是使用单元测试工具构建测试,在单个测试中测试很多东西。在一个测试中,我可能会检查数据库连接是否打开,更改大量数据,并在数据库上进行前/后检查。我不可避免地发现自己正在编写帮助器类来进行检查,而且通常情况下,这些帮助器可以添加到代码库中,因为它们封装了紧急行为/逻辑/需求。我不是说我有一个巨大的测试,我的意思是,很多测试都在做一些纯粹主义者称之为集成测试的工作——这样的事情还存在吗?我还发现,创建一个测试模板,然后从中创建许多测试,以检查边界条件、复杂的处理等是很有用的


顺便问一下,我们谈论的是哪种语言环境?有些语言比其他语言更适合重构。

在系统的任何级别编写测试(如果可以),如果这意味着运行数据库等,那就这样吧。您将需要编写更多的代码来断言代码当前正在做什么,因为一个500行以上的方法可能包含很多行为。至于新旧代码的比较,如果您针对旧代码编写测试,测试通过,并且涵盖了它所做的一切,那么当您针对新代码运行测试时,您就是在有效地针对新代码检查旧代码。
我这样做是为了测试一个复杂的sql触发器,我想重构它,这是一个痛苦的过程,需要时间,但一个月后,当我们发现该领域的另一个问题时,它值得依赖于测试。

有关如何重构遗留代码的说明,您可能需要阅读这本书。还有一个简短的PDF版本可用。

根据我的经验,这是处理遗留代码时的现实情况。Esko提到的这本书(与Legacy一起工作…)是一部优秀的作品,它描述了各种方法,可以将您带到那里

我在单元测试本身中也看到了类似的问题,它已经发展成为系统/功能测试。为遗留或现有代码开发测试最重要的事情是定义术语“单元”。它甚至可以是“从数据库读取”等功能单元。识别关键功能单元并维护增加价值的测试

另外,Joel S.和Martin F.最近就TDD/单元测试进行了讨论。我的看法是,定义单元并关注它是很重要的!URL:,和

以下的书:包含几个章节,其中有一些关于如何在开发单元测试方面处理遗留代码的有趣想法


我觉得这很有帮助

事实上,有更多的粒度函数,但是我如何在不首先重构遗留代码以提取更粒度的方法的情况下对它们进行单元测试呢?这是64000美元的问题。有时候,答案是妥协。您希望努力实现完美的重构,但有时您必须在改进遗留代码的同时编写您可以编写的单元测试。至少这是我的经历。我经常发现自己在这样一场纯粹的讨论中,站在务实的角度主张妥协。也许我只是在变老,不再有能力领导纯粹主义者了@更重要的是,对重构有意义的唯一单元测试是对内部结构依赖性最小的端到端功能单元测试。同时,没有人谈论它。我的猜测是有一个非常小的重构正在进行:existi