如何为Arquillian UI测试重置数据库

时间:2014-11-25 15:59:44

标签: jpa eclipselink flyway jboss-arquillian

我有一个带JPA / Eclipselink的默认Java EE 7应用程序。 我想用Arquillian Drone / Graphene编写一些UI测试。

我的测试工作是"工作"。我可以点击该应用程序并发表一些断言。

但是:我想创建多个测试。每个测试类都应重置数据库,以确保条件始终相同。

我正在使用flyway来重置我的数据库。

@Before
public void setup() {
 Flyway flyway = new Flyway();
 flyway.setDataSource(...);
 flyway.clean();
 flyway.init();
 flyway.migrate();
}

重置正常。并且第一次执行测试(在这种情况下,任何缓存中都没有)。 当我再次尝试执行测试时,数据库与奇怪的JPA错误不一致。 首先我认为没问题:重置缓存

getEntityManager().getEntityManagerFactory().getCache().evictAll();

还不够。同样的问题。 下一个想法是销毁会话(一些JPA数据可以保存在旧会话中)。我还没有找到一个摧毁所有会话的好方法。我做了一个解决方法,但这也不起作用。

我认为我有一个默认问题,但我找不到任何解决此问题的方法。

我也尝试过dbunit和arquillian-persistence-extension。但它就像飞路,只是另一种方式。

理论上问题是,数据库已经通过SQL手动重置,Java / JPA / EclipseLink / Sessions /部署的applaction对已更改的数据一无所知。 如何重置所有内容(所有缓存?)?

我还考虑过"在启动testclass"之前重新部署。但这有点太多了(需要更多时间而且不是很好的解决方案)?

还有一个信息:我也在进行正常的arquillian测试(没有UI / Selenium),这是我的flyway数据库重置工作。

感谢您的帮助:)。

1 个答案:

答案 0 :(得分:1)

你没有说出你真正得到的错误,你刚才说:

  

当我再次尝试执行测试时,数据库与奇怪的JPA错误(...)

不一致

很难相信您的问题在于JPA缓存。我认为你的问题源于完全不同。

您清理数据库的方法存在根本缺陷。 您提交的代码:在所有测试之前,应该只运行一次。因为Flyway用于准备数据库结构,而不是将其设置为已知状态 所以概念上DbUnit& Arquillian Persistence ExtensionFlyway 会做两件完全不同的事情。 它们不是彼此的替代品。

所以你的代码使用了flyway:

@Before
public void setup() {
 ...
  flyway.clean();
  flyway.init();
  flyway.migrate();
}

是错误的,因为它应该在所有测试之前只运行一次。为此,您可以使用一些容器功能:

  1. 如果使用EJB容器,则可以使用@Singleton + @Startup + @PostConstruct组合来启动flyway工具。
  2. 如果使用Spring Container,那么init-method="migrate"就可以了。
  3. 或使用maven及其pre-integration-test阶段启动飞路工具。
  4. 顺便说一下:为了避免与DbUnit的xml数据集相关的维护工作,我个人推荐使用DbSetup工具。简单明了的解决方案。

    修改

    除了事实之外,在测试期间更改数据库结构并不是一个好习惯 - 您的问题也可能导致Flyway和JPA使用不同的数据源(甚至指向相同的数据库)。您应该仔细检查您是否自己创建了DataSource - 只需为Flyways注入PersistenceUnit正在使用的那个。