性能规则测试的正确做法是什么?

时间:2011-09-20 20:18:58

标签: performance unit-testing version-control integration-testing qa

我知道我们所做的是不正确/奇怪的做法。

我们有一个在应用程序的许多地方构建的对象,其构造滞后会严重影响我们的性能。

我们想要一个大门停止办理登机手续,这会对这个建筑的表现产生太大的影响...... 所以我们所做的就是创建一个单元测试,基本上如下:

myStopwatch.StartNew()
newMyObject = New myObject()
myStopwatch.Stop()
Assert(myStopwatch.ElapsedMilliseconds < 100)

或者:如果构建时间超过100毫秒则失败

这种“工作”在某种意义上说,如果它们对这种性能产生太大的负面影响,签到就不会提交......但是它本身就是一个糟糕的单元测试,因为它可能会间歇性地失败...例如,如果我们的构建 - 无论出于何种原因,服务器都很慢。

编辑:回应一些答案;我们明确希望我们的大门拒绝影响此性能的签到,我们不想检查日志或查看数据趋势。

问题:
在我们的登记门口测量表现的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

首先我会说:难道你不能允许某些逻辑延迟运行而不是在构造函数/初始化中执行所有逻辑吗?或者你可以分区对象?一个有用的指标是LCOM4

其次,你可以缓存这些实例吗?在之前的项目中,我们遇到了类似的情况,我们决定将对象缓存几分钟。这带来了一些其他较小的问题,但应用程序的性能飙升。

最后,我认为这是一个很好的方法,但我会采取一个平均值,而不仅仅是一个样本(操作系统可能只是在那个时候决定运行其他东西,它可能需要超过100毫秒)。 此外,这种方法的一个问题是,如果您更新硬件并忘记更新它,您可能会添加更多逻辑,而不会意识到。

我认为更好的方法,但实现起来有点棘手,是存储运行N次迭代所需的时间,如果该值增加超过X%,则构建失败。这样做的好处在于,既然存储了多长时间,您就可以从中生成图表并查看趋势。

答案 1 :(得分:1)

为避免机器依赖,您可以首次构建具有已知可接受构造时间的“参考对象”。然后将构造对象的时间与参考对象的时间进行比较。

这可能有助于防止过载服务器上的错误故障,因为参考代码也会变慢。我也会多次运行测试,只需要X%的测试通过。 (因为有很多外部事件可以减慢代码速度,但没有一个可以加快速度。)

答案 2 :(得分:0)

我认为您不应该以阻止检查的方式执行此操作,因为在签入过程中要完成的工作太多。检查ins需要快速,因为您的开发人员在运行时无需执行任何其他操作。

这个单元测试必须在开发人员坐下来等待它时进行编译和运行。正如您所指出的,测试的一次迭代不足以产生一致的结果。需要运行多少次才能可靠? 10?一次10次迭代会使检查时间延长1秒,在我看来仍然不够可靠。如果你将其增加到100次迭代,你会得到更好的结果,但这会增加10秒的检查时间。

此外,如果两位开发人员同时检入代码会发生什么?第二个测试是否必须等待第一个测试在他们开始之前完成,或者测试是否同时进行?第一种情况是糟糕的,因为第二个开发人员必须等待两倍的时间。第二种情况很糟糕,因为你可能会在两次测试中失败。

我认为更好的选择是在检查完成后运行单元测试,如果失败,请将其与某人通信。您可以在每次办理登机手续后进行测试,但仍有可能让两个人同时办理登机手续。我认为每N分钟运行测试会更好。这样你就可以很快地跟踪它。

可以这样做,以便它阻止检查,但你必须确保它只在该对象(或依赖)发生变化时运行,这样才不会减慢每次提交的速度。您还必须确保测试不会一次运行多次。

至于具体的测试,我认为除了通过多次迭代运行测试以获得更准确的结果之外,你不能逃避任何其他事情。我不想依赖于低于5或10秒测试的任何东西(所以50到100次迭代)。