我正在考虑使用反射进行单元测试,其中2个对象将进行相等性比较,GetProperties()和GetFields()方法将被广泛使用。但是,我知道性能影响将非常显着。实际上,我的几个同事使用反射将一些sourceobject的深层副本用于targetstobject。代码绝对优雅,美观,完全符合它应该做的。问题是他们不得不废弃它,因为它真的很慢。那么,在单元测试中使用反射时是否全部丢失,或者有没有一种方法来实现它而不会产生荒谬的性能损失?非常感谢。
答案 0 :(得分:2)
你可以看看HyperDescriptor,与反思相比,这可以加快速度。
答案 1 :(得分:1)
查看AutoFixture的Likeness。它完全符合您的描述。然后,您可以测试是否找到可接受的性能。
有关使用示例,请参阅此其他问题:How to Compare two objects in unit test?
答案 2 :(得分:1)
但是,我知道性能影响非常显着。
如果您没有测量,则不知道。你可能会怀疑它......
避免反射成本的最简单方法是使用反射来生成单元测试。然后单元测试本身没有反射。
答案 3 :(得分:0)
您的单元测试运行速度有多快?是一种解决方法(避免反射)更好地利用你的时间来节省一些单位测试时间吗?
您的测试现在需要多长时间?在使用反射实现单元测试之前,您不会知道它们实际上有多快(或慢),并且无法比较替代方案。
答案 4 :(得分:0)
一种方法是尝试加速反射调用。鉴于你正在依靠低级机械来实现这一目标,我在这里看不到很多希望。
另一种方法是支付费用,但只在需要再次测试时支付费用。 (如果您不更改正在测试的代码,则无需再次测试。)
我们的C# Test Coverage tool可以跟踪(抽象测试)和测试代码之间的关系。它可以通过检查更改代码的覆盖范围来确定是否需要再次运行(抽象)测试,它通过比较方法级别的代码文件来确定。如果有交叉点,则需要再次运行(抽象)测试。否则,您可以简单地跳过这些测试,以及它们可能包含的任何昂贵的开销(“反射”)。
狡猾的单词“抽象测试”只是意味着你定义了哪些测试活动对应于可检测的retestable单元;您可以决定跟踪每个单元测试,或以其他方便的方式对它们进行分组。理想情况下,您希望获得最精细的谷物抽象测试,以最大限度地减少实际重新测试;有时最好将一组测试放在一起。