3

我正在为 DAO 类编写单元测试,我只是对其进行了一些更改。由于这个 DAO 的性能非常重要,所以我想对单元测试中的性能做一些检查。而且因为我对这个 DAO 的更改可能会导致多次查询,所以我想检查 DAO 是否只查询数据库一次。如果没有,单元测试应该失败。

我不知道这是否可能。请帮忙:)

4

3 回答 3

1

除非您复制真实的数据库及其有效负载,否则在单元测试中测试性能将毫无用处。当然,您可以测量执行查询所需的时间,但这会导致什么结果?您在单元测试中执行的查询,如何转化为真实数据库的查询?

您可以衡量的是您的新查询与单元测试中的旧查询相比有何变化。我会为此使用一个框架(您必须在这里考虑 JVM 预热,并且可能是该框架有一些缓存也需要预热),我建议:Caliper

此外,如果您有只需要对数据库执行一次的查询,听起来很像您需要缓存。如果不是太复杂你可以看看

缓存

于 2013-04-15T07:03:51.440 回答
0

对于时间测试,您可以使用

超时注释之类的。

@Test(超时=500)

于 2013-04-15T07:03:32.777 回答
0

您可以注入代码(例如使用aspectJ)来计算数据库访问 - 每当您查询数据库时,都会增加一个计数器并进行时间测量。

一个更简单的解决方案是在测试上下文中实例化 DAO 时使用匿名类:

DAObject dao = new DAObject(){
                      @override
                      public void QueryDB(args){
                          incrementCounter();
                          long startTime = System.currentTimeMillis();
                          super.QueryDB(args);
                          _queryTime = System.currentTimeMillis() - startTime;
                      }
                   }

接着

assertEquels(counter,1);
assertTrue(_queryTime < MAX_ALLOWED_TIME);
于 2013-04-15T07:03:54.737 回答