我正在为DAO类编写单元测试,我刚刚对其进行了一些更改。由于这个DAO的性能非常重要,所以我想对单元测试中的性能进行一些检查。并且因为我对此DAO的更改可能导致多次查询,我想检查DAO是否只查询数据库一次。如果没有,单元测试应该失败。
我不知道这是否可行。请帮助:)
答案 0 :(得分:1)
除非您复制真实数据库及其有效负载,否则在单元测试中测试性能将毫无用处。当然,您可以测量执行查询所需的时间,但这是什么结果呢?您在单元测试中执行的查询,如何转换为真实数据库的查询?
您可以衡量的是您的新查询在单元测试中如何针对旧查询进行更改。我会使用一个框架(你必须在这里考虑JVM热身,可能是框架有一些需要预热的缓存),我建议:Caliper
此外,如果您只需要对数据库执行一次查询,则听起来非常像您需要缓存。如果它不是太复杂你可以看看
答案 1 :(得分:0)
时间测试你可以使用
超时注释,如。
@Test(超时= 500)
答案 2 :(得分: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);