测试用例失败此代码?

问题描述:

我不得不从承包商维护的代码。它有这个“有趣”的片段:测试用例失败此代码?

String webServicesValue = 
    webResponse.substring(webResponse.indexOf("<" + fieldName + ">") + 
         fieldName.length() + 2, 
         webResponse.indexOf("</" + fieldName + ">")); 

我花了几分钟的时间才明白他想要做什么。

这似乎是一个跆拳道的代码,但我的同事建议,“如果不破,不解决它。”我想知道这段代码是否会失败。它似乎工作到目前为止,我真的不能想到测试用例会导致失败。

感谢,

+0

我想这应该是你做加法 – 2009-07-31 06:55:00

+0

“失败fieldName.length() “as in”引发异常? – 2009-07-31 06:55:31

+0

你说得对,它是fieldName.length()。 – gineer 2009-07-31 08:15:10

是。如果“<字段名>”是不存在的响应会抛出异常。具体来说,它会尝试调用webResponse.substring(fieldName.length()+ 1,-1);

“< fieldname/>”将会导致类似的问题,因为元素上的任何属性。

,如果你得到 “<字段名> ... <字段名> ... < /字段名> ... < /字段名>”,你会得到错误的答案。

编辑:在后续讨论的情况,我会说,这个代码应该被重写的使用恰当的XML解析器......除非你/你的团队可以保证代码将永远必须处理有问题的XML。 XML只允许通过特定字符串操作来处理太多有效(和无效)变体。

我建议在这种情况下,重新写它。如果不容易理解,那么测试就更加困难。

+0

+1同意。任何需要几分钟才能理解的单行代码都是维护问题,因此应该重写。 (在这种情况下,代码显然是“坏了”!) – 2009-07-31 07:33:53

+0

我应该如何重写它?我正在考虑使用合适的XML解析器来代替这个黑客工作,但是,正如我所提到的,我的同事(拥有更多的经验和资历)告诉我,除非证明破坏(即需要适当的XML解析器),否则不要修复它。 – gineer 2009-07-31 08:20:04

如果您收到,会发生什么<fieldname/>

  • 嵌套的标签。你会在第一打开标签开始,跳过存在的任何其他人并停止在第一关标签,而不是匹配的结束标记。
  • 有着密切的标签某处开放标记之前

(你从字符串,而不是打开的标签年底开始搜索的关闭标记),而无需手动解析XML是更好使用真正的XML解析器。有各种各样的角落案例难以用简单的字符串处理来覆盖。使用真正的解析器也会更具可读性。最好将XML数据视为二进制数据,特别是在考虑所有可能的字符编码时。

除了上面伊戈尔Brejc和斯蒂芬·C'S反应,有CDATA:

<fieldname><![CDATA[ I am not really </fieldname> ]]></fieldname> 

甚至

<othertag> 
    <![CDATA[ I am not really <fieldname> and there is no closing tag ]]> 
</othertag>