【发布时间】:2010-07-14 22:55:31
【问题描述】:
我的典型场景:
- 我处理的遗留代码有一个只有生产中的客户端才有的错误
- 我附加了一个调试器,并找出如何在 他们的 系统上重现该问题(给定 他们的 输入)。但是,我不知道为什么会发生错误。
- 现在我想在我的本地系统上编写一个自动化测试来尝试重现然后修复错误
最后一步真的很难。输入可能非常复杂,并且包含大量数据。手动创建输入(例如:P p = new P(); p.setX("x"); p.setY("x"); 想象这样做 1000 次以创建对象)非常繁琐且容易出错。事实上,您可能会注意到我刚才给出的示例中有一个错字。
是否有一种自动化的方法可以从我的调试器中的断点获取字段并生成将创建该对象的源代码,并以相同的方式填充?
我想出的唯一办法就是序列化这个输入(例如,使用 Xstream)。我可以将其保存到文件中并在自动化测试中将其读回。这有一个主要问题:如果类以某些方式更改(例如:重命名字段/getter/setter 名称),我将无法再反序列化对象。换句话说,测试非常脆弱。
【问题讨论】:
-
你能解释一下为什么像 XStream 这样的东西不适合,为什么你绝对需要生成源代码吗?这肯定有助于获得更好的答案。
-
对于您现在要解决的现场测试事件,测试用例长期脆弱的问题是什么?
-
@IraBaxter 短期内没有什么问题。但是,如果有一些很酷的库/技术/策略可以比我现在更好地处理这个问题,我很想听听。
-
@DanielKaplan 你能解释一下你不喜欢反射方法的什么地方吗?
-
@assylias 很多原因。一方面,它没有正确获取设置器(
m[i].toString()将以公共/私有开始,而不是方法名称),它实际上将“(值)”传递给设置器,它不遍历对象树和我怀疑它不能正确处理集合。
标签: java testing code-generation automated-tests