Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 如何加快在VisualStudio2010中使用反射的单元测试?_Visual Studio 2010_Unit Testing_Reflection - Fatal编程技术网

Visual studio 2010 如何加快在VisualStudio2010中使用反射的单元测试?

Visual studio 2010 如何加快在VisualStudio2010中使用反射的单元测试?,visual-studio-2010,unit-testing,reflection,Visual Studio 2010,Unit Testing,Reflection,我曾考虑在单元测试中使用反射,在单元测试中比较两个对象的相等性,并广泛使用GetProperties()和GetFields()方法。但是,我知道性能影响将非常显著。事实上,我的几个同事使用反射将某个sourceobject的深层副本复制到targetobject。代码绝对优雅、美观,并且完全按照它应该做的做。问题是他们不得不放弃它,因为它太慢了。那么,当涉及到在单元测试中使用反射时,是完全失去了一切,还是有一种方法可以实现它而不会造成荒谬的性能损失?提前非常感谢。您可以看看与反射相比,哪些可以

我曾考虑在单元测试中使用反射,在单元测试中比较两个对象的相等性,并广泛使用GetProperties()和GetFields()方法。但是,我知道性能影响将非常显著。事实上,我的几个同事使用反射将某个sourceobject的深层副本复制到targetobject。代码绝对优雅、美观,并且完全按照它应该做的做。问题是他们不得不放弃它,因为它太慢了。那么,当涉及到在单元测试中使用反射时,是完全失去了一切,还是有一种方法可以实现它而不会造成荒谬的性能损失?提前非常感谢。

您可以看看与反射相比,哪些可以加快速度。

您的单元测试必须运行多快?工作环境(避免反射)是否可以更好地利用您的时间来节省一些单元测试时间


你的测试现在需要多长时间?除非您使用反射实现单元测试,否则您将不知道它们到底有多快(或慢),并且无法比较备选方案。

一种方法是尝试加快反射调用。考虑到你依靠低级机器来完成这项任务,我看不出有多大希望

另一种方法是支付费用,但只在再次需要测试时支付。(如果不更改正在测试的代码,则无需再次测试)

我们可以跟踪(抽象测试)和测试代码之间的关系。它可以通过检查(抽象)测试对已更改代码的覆盖率来确定是否需要再次运行(抽象)测试,这是通过在方法级别比较代码文件来确定的。如果存在交叉点,则需要再次运行(抽象)测试。否则,您可以直接跳过这些测试,以及它们可能包含的任何昂贵的开销(“反射”)

“抽象测试”这句话的意思是,你定义了什么样的测试活动集合对应于可检测的可重测单元;您可以决定跟踪每个单元测试,或者以其他方便的方式将它们分组。理想情况下,您希望获得最精细的抽象测试,以最小化实际的重新测试;有时候,最好将一组测试放在一起。

检查一下。它正是你上面描述的。然后,您可以测试性能是否可以接受

有关用法示例,请参见其他问题:

但是,我知道性能影响将非常显著

如果你没有测量,你就不知道。你可能会怀疑


避免反射成本的最简单方法是使用反射生成单元测试。那么单元测试本身就没有反射。

我之所以想使用反射,是因为我可以编写更少的单元测试代码,从而节省大量时间。据估计,按照目前的情况,如果实现,使用反射的单元测试将需要50分钟才能运行,这是不可接受的。正如我上面提到的,我的同事使用了一种类似于我打算用于单元测试的方法,当他们执行一个对象到另一个对象的深度复制时。由于糟糕的性能,他们不得不放弃花了3周时间的代码,尽管代码本身非常精简和优雅。非常感谢链接。这绝对是一个值得探索的想法。问题是HyperDescriptor无法修复GetProperties()方法的缓慢性,如果我没有弄错的话,这是最大的问题。抱歉,但这并不是我所需要的。我需要我的代码来挖掘两个填充了有效值的对象,比较它们的属性和字段。很抱歉造成混淆,但我的意思是我不需要自动生成的值,因为我需要与来自数据库、XML文件或其他文件的值进行比较。是的,我理解这一点。相似性是AutoFixture的反向部分。它不是创建对象,而是比较对象。不过,它确实是同一个包装。你读了我答案中的最后一个链接了吗?是的,我读了第二个链接。它仍然无法说服我如何逐个属性比较两个对象,其中一些对象有好几层深度,然后使用Assert.AreEqual方法为不相等的属性生成错误消息。在2.1(目前处于beta版)中,有一个ShouldEqual方法为您提供更详细的错误消息。但是,默认情况下,它不会比较“几个层次”。如果你停下来想一想,怎么可能呢?它将如何决定何时停止?当没有更多的财产时?在本例中,它还将对字符串进行深入比较,如果字符串具有相同的长度,则将其相等-这没有意义。