测试用例使代码失败?

时间:2009-07-31 06:52:15

标签: java unit-testing testing

我必须维护承包商的代码。它有这个“有趣”的片段:

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

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

它似乎是一个WTF代码,但我的同事建议,“如果没有破坏,请不要修复它。”我想知道这段代码是否会失败。到目前为止似乎工作正常,我真的不能想到一个测试用例会失败。

谢谢,

6 个答案:

答案 0 :(得分:8)

是。如果“&lt; fieldname&gt;”将抛出异常在回复中没有出现。具体来说,它会尝试调用webResponse.substring(fieldName.length()+ 1,-1);

“&LT;字段名/&gt;” 中会导致类似的问题,元素上的任何属性都会出现。

如果您收到“&lt; fieldname&gt; ...&lt; fieldname&gt; ...&lt; / fieldName&gt; ...&lt; / fieldName&gt;”,您将得到错误的答案。

编辑:根据后续讨论,我会说应该重写此代码以使用正确的XML解析器...除非您/您的团队能够保证代码永远不会必须处理有问题的XML。 XML只允许通过临时字符串操作处理太多有效(和无效)变体。

答案 1 :(得分:6)

如果您收到 <fieldname/> 会怎样?

答案 2 :(得分:2)

不是手动解析XML,而是使用真正的XML解析器。有各种角落的情况很难用普通的字符串操作覆盖。使用真正的解析器也会更具可读性。最好将XML数据视为二进制数据,尤其是在考虑所有可能的字符编码时。

答案 3 :(得分:2)

除了Igor Brejc和Stephen C的上述回答之外,还有CDATA:

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

甚至

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

  • 嵌套标签。您将从第一个打开的标记开始,跳过存在的任何其他标记,并停在第一个关闭标记而不是匹配的关闭标记。
  • 在开放标记之前的某处有一个关闭标记(您正在从字符串的开头搜索close标记,而不是打开标记的结尾)