测试用例失败此代码?
我不得不从承包商维护的代码。它有这个“有趣”的片段:测试用例失败此代码?
String webServicesValue =
webResponse.substring(webResponse.indexOf("<" + fieldName + ">") +
fieldName.length() + 2,
webResponse.indexOf("</" + fieldName + ">"));
我花了几分钟的时间才明白他想要做什么。
这似乎是一个跆拳道的代码,但我的同事建议,“如果不破,不解决它。”我想知道这段代码是否会失败。它似乎工作到目前为止,我真的不能想到测试用例会导致失败。
感谢,
是。如果“<字段名>”是不存在的响应会抛出异常。具体来说,它会尝试调用webResponse.substring(fieldName.length()+ 1,-1);
“< fieldname/>”将会导致类似的问题,因为元素上的任何属性。
,如果你得到 “<字段名> ... <字段名> ... < /字段名> ... < /字段名>”,你会得到错误的答案。
编辑:在后续讨论的情况,我会说,这个代码应该被重写的使用恰当的XML解析器......除非你/你的团队可以保证代码将永远必须处理有问题的XML。 XML只允许通过特定字符串操作来处理太多有效(和无效)变体。
我建议在这种情况下,重新写它。如果不容易理解,那么测试就更加困难。
+1同意。任何需要几分钟才能理解的单行代码都是维护问题,因此应该重写。 (在这种情况下,代码显然是“坏了”!) – 2009-07-31 07:33:53
我应该如何重写它?我正在考虑使用合适的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>
我想这应该是你做加法 – 2009-07-31 06:55:00
“失败fieldName.length() “as in”引发异常? – 2009-07-31 06:55:31
你说得对,它是fieldName.length()。 – gineer 2009-07-31 08:15:10