代码之家  ›  专栏  ›  技术社区  ›  Chris Bloom

是否值得尝试为世界上耦合最紧密的站点编写测试?

  •  30
  • Chris Bloom  · 技术社区  · 15 年前

    想象一下,你90%的工作只是在一个非常庞大、非常破碎的网站上对问题进行分类。想象一下,这个网站是用你见过的最紧密耦合、最不连贯的PHP代码编写的,这种代码可以将原始开发人员添加到“一目了然”的列表中。假设这个web应用程序由4个完全不同的部分(1个是商业的,2个是“重新调整用途”的,1个是定制的)和一堆虚拟的管道胶带和垫片组成。想象一下,它包含的编程实践类型中,网站的主要组件实际上依赖于不能正常工作的东西,而修复这些损坏的东西通常会破坏其他东西。想象一下,你从太多的不好的经历中知道,改变网站一个看似无害的部分,比如把一个“名字”字段分成两个独立的“第一”和“最后一个”字段,会使网站瘫痪,需要数小时的回滚、合并和修补。想象一下,多年来一直恳求客户放弃代码,重新开始,但却遭遇了企业级的绝望和手忙脚乱。然后想象一下,如果你得到了尽快/紧急通知单来实现新功能,在任何其他网站上都需要4个小时,但是你对这个网站更了解,所以你可以报40个小时,然后按这个数字计算,然后付80个小时的账单,但这没关系,因为客户已经习惯了他们的网站。

    以下是一些你也应该想象的事情:

    • 现在根本没有测试
    • 谷歌有不同层次的登录。有些客户实际上有3个不同的帐户在网站的不同部分
    • 当我说“最缺乏凝聚力”时,我的意思是有些东西是有组织的,就像MVC,但它不是真正的MVC。在某些情况下,可能需要几个小时才能找到uria是如何映射到文件B的
    • 用户界面写得像“咄咄逼人”和“不可访问”是当时的流行语

    自从你们中的许多人提起这件事以来:我一直在寻找机会重新写作。和我一起工作的营销人员知道他们的代码是垃圾,他们知道这是他们最初合作的“最低出价”公司的错。作为一个承包商,我可能已经越界了,我指出他们花了一大笔钱在我身上为这个网站提供临终关怀服务,而且通过从头开始重新开发,他们会很快看到投资回报。我也说过,我拒绝按原样重写网站,因为它并没有真正做到他们希望它做的事情。计划是重写BDD风格,但让所有的关键球员都在一个地方是很困难的,我仍然不确定他们是否知道他们需要什么。无论如何,我完全期待这是一个非常大的项目。

    13 回复  |  直到 15 年前
        1
  •  12
  •   CaffGeek    15 年前

    也许还有那本书” Working effectively with Legacy Code “值得一读吗?

    编辑

    我也建议你看 this presentation from Uncle Bob 其中涉及到这个场景,以及如何使用“渐进式加宽”将坏代码基转换为好代码基

    从找到任何自包含的函数开始。函数只引用传入的参数。将它们移动并组织到辅助类中。这可能只是暂时的,因为很多人以后会在不同的类中结束,但这将有助于识别一些重复的代码,并开始组织工作。然后,看看它们是如何使用的,根据这些用途编写测试。拍拍自己的后背。现在,您已经开始使代码具有可维护性。

    InfoQ发布了另一篇文章 How To Do Large Scale Refactoring 特别是这类东西,还有一篇更古老的文章叫做 Refactor or Rewrite? 还有一些技术,比如 Mikado Method 当你必须意识到你不可能总是在一步中做出你想要的行动,你必须采取其他行动来建立和实现你的目标。

        2
  •  11
  •   Josh K    15 年前

    绝对不是。

    如果你说多个事物依赖于其他事物 不起作用

    就我个人而言,我会说放弃它,重新开始。四个小时的功能需要80分钟?我希望这是夸大其词。你一定有头痛。

    我会从一个非常坚定的建议开始重新编写代码库。有些时候必须告诉那些手足无措的客户直截了当的事实。还有多少开发者会在基础不健全的情况下工作?做一些漂亮的成本/收益图表。

    . 不要忽视这一点。我是说我不会试图在现有的代码库上编写测试。

        3
  •  7
  •   Skilldrick    15 年前

    试试看

    在站点的一小部分(我知道您无法完全隔离任何部分,但您仍然可以针对部分)尝试一下。

    给自己定一个时间预算 (这取决于您确定什么是负担得起的/值得的),然后进行一些测试和重构。如果不成功,退后。如果有,继续。

        4
  •  6
  •   David Culp    15 年前

    首先,如果你的客户习惯于你的估价是实际需要的一半,那就修正你的估价吧!客户对评估结果不满意是件好事,但关键是你要让你的评估更符合实际需要的努力。如果没有这些,哪位客户会同意进行重大的重构,更不用说重写了。因此,获取一些正确估计的历史记录,然后着手重做项目。

    如果这和我一直在处理的类似,那么它的顺序是将一个方法拉到一个helper类中,然后将它修补回现有的代码中,这似乎不值得——但每次您必须再次接触系统的这一部分时,它确实会得到回报。就像他们说的那样——“离开它比你发现的更好”,你会发现它在你每次回到它的时候都会变得更好。测试是最好的方法让它比你发现的更好。

    但是,说真的,在客户对你处理返工的能力完全有信心之前,要让他们对你的估计的准确性有信心。

        5
  •  5
  •   ircmaxell    15 年前

    现在,要意识到这可能不是一个微不足道的任务。为了编写测试,您需要修改代码使之可测试。为了修改代码,您需要进行测试。所以你陷入了一个依赖循环。。。

    然而,看看潜在的好处。这会告诉你它是否值得。

    记住,你不需要100%的保险来获得收益。每次测试都会增加意义。。。

        6
  •  3
  •   Dean J    15 年前

    你不能废了它。客户不会让你这么做的,而且这可能不是最好的途径。

    因此,与其报价40小时,而不是一个本应花费数分钟的修复。。。引用60。客户觉得还可以。用40来修复,用20来重构。。。并对重构的内容编写测试。如果60到100,那么花费120;80修复,40重构/测试。

    及时改进你的正常估计,或者找新的工作;现在的情况,听起来,会让你讨厌我们的领域。

        7
  •  2
  •   Pekka    15 年前

    完全 ,你必须从头开始重写系统的某些部分,这不可避免地会在这个过程中导致大量的错误。

    在任何情况下,我都不会尝试为此引入测试,但要尽快获得重写的许可。

        8
  •  2
  •   Cœur Gustavo Armenta    7 年前

    最重要的事情(购买后 Working efficiently with legacy code )从小事做起。我在几个项目中工作,每一个项目都有几千行PHP代码,而且常常没有一个函数(甚至不考虑对象),每当我需要更改代码时,我都会尝试将该部分重构为一个函数并为其编写测试。这是与广泛的手动测试相结合的部分,所以我可以确定它的工作与以前一样。当我有多个函数用于类似的事情时,我将它们作为静态方法移动到一个类中,然后一步一步地用适当的面向对象代码替换它们。

    从将其转换为函数到将其转换为实际类的每一步都要进行单元测试(这不是很好,因为90%的代码都是SQL查询,几乎不可能建立一个可靠的测试数据库,但我仍然可以测试它的行为)。

    因为有很多代码重复(我发现一个SQL查询在一个文件中重复了13次,在该项目的其他50个文件中重复了很多次),所以我可以更改所有其他地方,但我不能更改,因为这些地方既没有经过测试,也不能确定周围的代码是否以某种方式依赖于该代码(想想看 global

    这是一项漫长而乏味的工作,每当我看到代码时,我都觉得离精神崩溃更近了一步(或者更确切地说是一个飞跃),但是代码质量会提高(缓慢但主要是可靠的)。

    你的情况看起来很相似,所以也许我的想法可以帮助你编写代码。

    简言之

    从小处做起,只改变你所做的,开始只写有限的单元测试,并随着对系统的了解越多而扩展它们。

        9
  •  1
  •   nicomen    15 年前

    首先做黑盒,功能测试,连接的部分或零碎的东西。这使得继续开发和重构/重写变得更加容易。

    但我们最终还是需要一个单元来测试。

    它还远未防弹,但当您知道有一个测试套件在等待验证您的代码更改时,所有开发人员都更有信心敢于更改/修复某些东西。

        10
  •  1
  •   Dana the Sane    15 年前

        11
  •  0
  •   Paul Hadfield    15 年前

        12
  •  0
  •   Sam    15 年前

    如果事情表现可靠,你就可以测试它们,对吧?您的系统大部分时间都在工作,因此您可以测试这些成功条件。

    …网站无害的部分,例如 将“名称”字段拆分为两个 分开“第一个”和“最后一个”字段, 会让网站屈服

    把一个字段分开,比如名字和姓氏,听起来像是一件巨大的事情,但听起来你已经吸取了教训。至少,试着为一个全尺寸的测试系统获得一些资金,并将程序落实到位,使生产数据自动转移到它,这样你就可以完全测试这件事了。

    听起来很可怕。是时候把旧简历付之东流了?

        13
  •  0
  •   Stephan Eggermont    15 年前

    推荐文章