【问题标题】:How do you effectively unit test the parameters of dynamic languages?您如何有效地对动态语言的参数进行单元测试?
【发布时间】:2010-12-01 07:11:39
【问题描述】:

This answer 触动了我的神经,我从未理解过您如何处理动态语言中的参数类型与 Java 中的静态语言(我的观点被告知或变形 - 如您所愿)。

给定一个采用动态语言参数 bar 的方法 foo,在编译时不强制执行 bar 的类型。上面链接的答案(以及我通常看到的答案)是您需要使用动态语言正确进行单元测试。

但在某些时候,单元外的某些东西会调用该方法。假设这是一个重量级的对象,将在任何使用它的类的单元测试中被模拟。现在你有很多类调用这个方法,你需要改变类型。为简单起见,它曾经接受一个数字,但现在需要一个字母数字,并且您需要使用专门用于字符串而不是具有新要求的数字对象的方法。

您如何更改它并知道调用代码将被修复?当然,如果您只是更改它,您的单元测试将会失败,但是由于您需要故意更改它,因此您表面上会修复您的单元测试。你怎么知道修复调用代码?我的意思不仅是你在概念上知道多少,我的意思是你怎么知道你已经找到了所有的调用者并且真的可以说它已经改变了。

似乎只有非常全面的集成测试才能为您提供保证。我错过了什么吗?

【问题讨论】:

    标签: parameters dynamic-languages


    【解决方案1】:

    我认为你已经给出了一个很好的具体例子来说明静态类型的优点之一。动态类型需要您自己找到所有这些呼叫位置。不过,这实际上并不是很困难——它只是代码中的文本搜索。这就是权衡:编译器可以交叉引用您的代码并确保所有内容都匹配,而不是在整个代码中使用分散注意力的类型标签。

    【讨论】:

    • 我想这就是答案。我只想说,类型标签可能更多是一种分散注意力的负担。我花了很多时间严格地“修复”代码以满足类型系统,更不用说因为它而重复代码了。
    • 不要用Java判断静态类型。它的类型系统强大到足以惹恼您,但还不足以帮助您解决问题。你至少应该看看 OCaml。
    【解决方案2】:

    我需要 15 个字符才能发布,但答案是四个字符长:grep。

    【讨论】:

    • +1。静态与动态都是关于权衡的。你得到一些东西,你必须放弃一些东西。简单的重构就是其中之一。但是,我不认为答案是 4 个字符长。这些天简直就是 ack。 :)
    【解决方案3】:
    1. 防御性代码。使更改在新方法中向后兼容。派发参数的类型; CLOS 让这一切变得简单。

    2. 使用编辑器或 IDE 的“谁来电”功能。

    【讨论】:

      【解决方案4】:

      这似乎更像是一个重构问题而不是单元测试问题。

      通过确保特定函数中所需的所有属性和方法都存在并返回预期结果,可以有效地对参数进行单元测试。接口与类型无关。

      【讨论】:

        【解决方案5】:

        简短的回答就是“一直进行更多的单元测试”。

        唯一重要的是新类型还具有所需的方法。因此,如果 ClassA 具有 Method1() ,它接受参数 obj 并调用 obj#M1()obj#M2() - 对 obj 的唯一限制是它响应这些消息。如果您更改实现以调用以前不存在的方法 Foo(),则执行 A 类的测试会失败。

        接下来,如果ClassB 调用A#Method1() 作为其功能的一部分,如果B 类传递一个确实具有所需方法的obj,它的测试将失败。如果 B 的要求行为没有实现,它的测试应该失败,这应该指向 B 中所需的更改。

        【讨论】:

        • 谢谢,但这就是为什么我明确给出了一个重对象的情况 - 比如说一个进行数据库访问的对象,你必须模拟它才能进行合理的单元测试。
        • 好的..所以你的问题,因为我们没有动态语言中的强类型接口,我们如何确保真实对象支持相同的消息集?我想说有一些使用真正的合作者的验收测试 - 不是在你的测试套件中,每秒钟执行一次。而是每天执行一次。
        • 我不认为强耦合类是一个好的解决方案。即使它使测试更容易,它也会使代码变得更意大利面。
        【解决方案6】:

        动态语言开发人员需要复制静态类型的优势,也就是说,通过让那些工具可以自动发现这些错误。在大多数情况下,这涉及类型推断工具。推理本身是相当困难的(我正在写我的博士论文来为 PHP 做这件事),但使用这些工具并不是非常困难。

        有以下错误查找工具:

        对于 PHP,phc 只需很少的工作量就可以做到这一点。

        总的来说,当你没有静态类型时,你需要一个工具来获得好处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-22
          • 2010-12-14
          相关资源
          最近更新 更多