【问题标题】:Strategy to unit test and refactor existing Grails app对现有 Grails 应用程序进行单元测试和重构的策略
【发布时间】:2011-01-20 11:09:59
【问题描述】:


您会推荐什么策略来对现有 Grails 应用程序进行单元测试?
我刚刚阅读了 Beck Kent 关于 TDD 的书,并希望将类似的方法应用于我的应用程序。 我的目标是对整个代码库进行单元测试,并能够重构代码并使其“更干净”。通过“更清洁”,我的意思是我想减少重复,通过将通用逻辑提取到服务等中来使我的控制器更苗条。
那么我应该从哪里开始呢?楷模?控制器?
你做类似事情的“坏”和“好”经历是什么?

@彼得。 在我看来,我的应用程序并不太大。它由 12 多个模型、类似数量的控制器、少量服务和大约 15 个实用程序类组成。
我想要完整的单元测试覆盖率的主要原因之一是在许多情况下系统可以正常工作。虽然从开发人员的角度来看,从用户的角度来看它是好的,但这样的代码是更改和维护的噩梦。
另一件重要的事情是我想做小而快的定期发布(新的小功能和/或改进),但如果没有单元测试覆盖,这几乎是不可能的。
所以问题不是:“我需要这样做吗?”,而是“我该怎么做?”

【问题讨论】:

    标签: unit-testing grails tdd


    【解决方案1】:

    取决于应用程序的大小,但对于任何不平凡的现实生活应用程序来说,通过单元测试令人满意地覆盖它是一个巨大的努力。因此,您需要优先考虑您的工作,专注于系统中最关键/最频繁更改/最多错误的部分(通常这些部分重叠很多:最关键的部分通常是最常被触及以添加新功能或修复错误)。

    一个好的方法是在您需要触及代码的任何部分时或多或少地以 TDD 方式编写单元测试。我写“或多或少”是因为对于遗留代码,您通常需要编写比新开发开发更高级别、更复杂的单元测试。事实上,在某些情况下,从单元测试开始可能甚至没有效率,相反,最好创建功能/系统测试以从用户角度涵盖大粒度的功能。

    请注意,根据可用的文档和开发人员/用户对系统的了解程度,您可能无法始终确定特定功能的“正确”行为,只能确定其当前行为。即使在这种情况下,也值得用(单元)测试来覆盖它:这些测试记录了代码的实际行为,并在未来检测到它的任何意外变化。

    一旦您的实际代码被单元测试合理覆盖,这会给您重构所需的信心。每当您接触代码时,请进行一些(简单或更复杂的)重构。但是,不要过度。如果您需要为错误修复更改单行,则开始重构整个继承层次结构可能是矫枉过正(即使它真的很混乱)。记下这些即将发生的重构任务,并尝试稍后安排它们。

    【讨论】:

      【解决方案2】:

      我通常同意@Peter 的观点,因为这是一件非常重要的事情,您可能会因为只知道事情做什么而不是他们应该做什么而受到阻碍。但这没关系,如果不理想的话,因为测试与可维护性(即知道何时更改会破坏事物)一样重要,因为它与正确性有关。因此,围绕现有功能进行测试,如果您必须修复错误,您可以更改测试以捕获修复。

      如果您和您的团队专注于添加新功能,那么现在就实施 TDD,即测试新功能,并为您正在修改的现有功能添加测试,正如已经建议的那样。

      如果您可以专注于测试,那么我会在垂直层进行测试。为模型编写一些测试,然后是它的服务,然后是控制器(该顺序只是一个建议)。关键是如果您正在测试应用程序的“图书”部分,请在继续之前测试所有图书功能。此外,您可以优先考虑应用程序的核心功能。如果“书籍”比其他东西重要得多,请先测试“书籍”。

      【讨论】:

      • 您有什么特别的原因会在控制器之前测试服务吗?
      • @Liutauras,对于我的思维方式,垂直层部分比您测试垂直层组件的顺序更重要。
      • 我明白你的意思。我问的原因是我只使用 grails 中的服务作为一种工具,通过从控制器中提取通用功能并将它们放入服务中来保持我的控制器苗条。
      • @liutauras,这是正确的做法。控制器应该只处理传入的请求、调用功能和返回响应。因此,如果这对您有意义,请先测试服务。
      【解决方案3】:

      就我个人而言,我发现进行 Grails 集成测试是最容易的。只针对一些常用的bean,我做了单元测试。我承认这不是很 TDD,但仍然给你一些信心。

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 2011-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多