2012-04-27 66 views
5

我有一个JPA/Hibernate/Spring/Tomcat Web应用程序启用二级数据缓存的性能原因。缓存的功能非常好!休眠第二级数据缓存和集成/验收测试

我也有一个Cucumber测试套件,它将一些测试数据直接添加到应用程序的数据库,然后执行一些Selenium步骤。当然,它会失败,因为应用程序由于第二级缓存而没有看到更新。

我知道我可以为缓存禁用进行特殊构建测试(通过为Maven过滤或类似方法传递一些布尔属性)但是有很多@Cache注释实体,所以禁用缓存会导致应用程序失败,级高速缓存未启用“。

另一种方法是使用ehcache remoting清除缓存或将其配置为零对象生存期或类似。

我也只能使用应用程序的UI创建我的测试数据,但是这会增加不必要的复杂性测试案例,所以我宁愿试运行之前,并写入到数据库。

任何人可以分享他们与二级数据缓存集成测试应用程序的方式启用?

回答

0

既然你通过Selenium谈到功能测试,你应该考虑你的应用程序作为一个黑盒子,并测试它作为硒实际上是一个用户。所以你需要通过Web界面传递数据,然后测试应用程序如何处理并在之后显示。

替代此类应用程序范围的功能测试将是一个行为驱动开发,其中包含针对不同组件的测试。这里的组件是一些从你的控制器开始以DAO结尾的流程(通常DAO在这样的测试中被模拟,这些测试使它们传递得非常快,但没有测试数据库的工作情况)。在这种情况下,您有一整套完整的环境测试和大量的BDD测试。

+0

不是所有的,但我的一些BDD测试有以下步骤:创建测试数据,做硒事情,清理。 同意黑盒子,但使用UI创建和清理数据有时非常困难,并且可能使测试彼此依赖(如果与保存有关的UI被破坏,所有其他需要保存的测试也会被破坏) – ike3 2012-04-27 09:10:55

+0

是的,依赖测试会失败,但主要目的 - 失败的东西会得到满足。如果您直接向数据库填充数据,那么它本质上不是验收测试,这不是终端用户如何使用应用程序。而这样的测试应该或多或少是粗粒度的。如果您需要更多细粒度的硒,这对Selenium来说可能是一个糟糕的地方。 – 2012-04-27 10:51:29

0

我不得不实施只读缓存为少数豆类像国家,地区等的要求..

要检查,如果他们真的得到缓存我已经写了集成测试使用的春天。测试不太合适,这只是我想要得到的证明。你可以用它作为提示并实现你自己的。

您可以了解如何编写使用弹簧集成测试的文章阅读here

@Configurable(autowire = Autowire.BY_NAME) 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) 
public class HibernateCachingTestIntg { 

    @Autowired 
    private ConfigurationDAO configurationDAO; 

    @Autowired 
    private CountryDAO countryDAO; 

    @Test 
    public void testGetCountries() { 
     for (int i = 0; i < 5; i++) { 
      StopWatch sw = new StopWatch("C"); 
      sw.start(); 
      countryDAO.listCountries(); 
      sw.stop(); 
      System.out.println(sw); 
     } 

    } 

    @Test 
    public void testGetRegionList() { 

     for (int i = 0; i < 5; i++) { 
      StopWatch sw = new StopWatch("R"); 
      sw.start(); 
      configurationDAO.getRegionList(); 
      sw.stop(); 
      System.out.println(sw); 
     } 

    } 
} 

这里是输出: -

StopWatch 'C': running time (millis) = 217; [] took 217 = 100% 
StopWatch 'C': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'C': running time (millis) = 16; [] took 16 = 100% 
StopWatch 'C': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'C': running time (millis) = 16; [] took 16 = 100% 

StopWatch 'R': running time (millis) = 201; [] took 201 = 100% 
StopWatch 'R': running time (millis) = 15; [] took 15 = 100% 
StopWatch 'R': running time (millis) = 0; [] took 0 = 0% 
StopWatch 'R': running time (millis) = 16; [] took 16 = 100% 
StopWatch 'R': running time (millis) = 15; [] took 15 = 100% 

正如你可以在这里看到,查询需要更多的时间,第一次和更少的时间执行后记。如果您打开查询记录器,则可以看到仅第一次触发了SQL Anywhere 12.0.0.0.0,因此无法启动SQL查询记录器。

+0

谢谢。 Spring-test可以正常工作,因为它在单个持久性上下文中工作,但验收测试会在单独的上下文中插入数据。我的意图是用一些读写缓存实体测试功能逻辑,而不是缓存本身 – ike3 2012-04-27 04:43:05

0

虽然使验收测试独立于DB最好它需要太多的改写,所以我决定目前只创造org.hibernate.cache.Cache和实现org.hibernate.cache.CacheProvider接口非常简单的实现它什么都不做充当一个总是空的缓存。

测试版本将这个新的缓存替换为真正的缓存,使得hibernate注释和BDD步骤都很开心。

1

如果您需要使用单元测试测试二级缓存,则必须确保关闭会话并在每次调用dao方法时打开它。否则,您将使用仅存在于一个/当前hibernate会话范围内的第一级缓存。