【发布时间】:2015-12-28 08:38:18
【问题描述】:
这个有点让人头疼:我有一个包含 8 个测试的 Arquillian 测试课程。如果我一次执行其中的 4 个,它们都可以工作,但如果我再添加一个测试,最后一个会失败。如果我执行所有 8 个,最后 4 个失败。如果我更改顺序,最后 4 个仍然失败。除此之外,没有押韵也没有理由说明哪些人会被执行,哪些人会失败。
(如果我将一半的测试放在另一个类中,情况也是如此。然后两个类都可以自行执行,但如果它们作为相同运行配置的一部分启动,第二个类的所有测试都将失败。 )
错误发生在@Before方法内部,所以这里是:
@PersistenceContext
private EntityManager em;
@Inject
private UserTransaction transaction;
@Before
public void setUp() throws Exception {
Assert.assertNotNull("EntityManager cannot be null!", this.em);
this.transaction.begin();
this.em.createNativeQuery(MY_SCRIPT_1).executeUpdate();
this.em.createNativeQuery(MY_SCRIPT_2).executeUpdate();
this.transaction.commit();
}
MY_SCRIPT_X 是一堆代码,但相关部分可能是:
-- MY_SCRIPT_1
DROP SCHEMA IF EXISTS scheme1 CASCADE;
DROP SCHEMA IF EXISTS scheme2 CASCADE;
DROP SCHEMA IF EXISTS public CASCADE;
CREATE SCHEMA public;
-- MY_SCRIPT_2
CREATE TABLE scheme1.dbconfig (
propkey character varying NOT NULL,
propvalue character varying NOT NULL,
CONSTRAINT dbconfig_pkey PRIMARY KEY (propkey)
);
COMMENT ON TABLE scheme1.dbconfig IS 'global database configuration properties';
INSERT INTO scheme1.dbconfig VALUES
('initialized', true),
('version', 2);
如果我只使用一个大脚本 [em.createNativeQuery(MY_SCRIPT_1 + MY_SCRIPT_2)],则不会发生此错误,即使表 scheme1.dbconfig 仅在其中一个文件中引用。
我得到的错误信息是:
09:20:18,243 错误 [org.hibernate.engine.jdbc.spi.SqlExceptionHelper](默认任务 24)错误:关系“scheme1.dbconfig”不存在 位置:169
我不知道位置 169 在哪里(忽略所有 cmets,第 169 个位置应该在 propkey 的 R 和 O 之间,这看起来很奇怪)。但是我在执行完整个类后检查了数据库,得到了上面的错误,表scheme1.dbconfig确实存在。
我知道,这是一个奇怪的具体问题,但有人知道问题可能是什么(或者甚至如何进一步调试它)吗?
更多信息:
- 数据库:PostgreSQL
- 休眠:4.3.5
- 容器:Wildfly 8.1.0.Final
我重现错误所需的只是(beans.xml 是默认的空文件,persistence.xml 只有jta-data-source ):
@RunWith(Arquillian.class)
public class BugTest {
private static final String CLEANUP_SCRIPT = "DROP SCHEMA IF EXISTS scheme1 CASCADE; "
+ "DROP SCHEMA IF EXISTS public CASCADE; "
+ "CREATE SCHEMA public AUTHORIZATION testdba;";
private static final String CREATE_SCRIPT = "CREATE SCHEMA scheme1; "
+ "CREATE TABLE scheme1.dbconfig ( propkey character varying NOT NULL, propvalue character varying NOT NULL, CONSTRAINT dbconfig_pkey PRIMARY KEY (propkey) ); "
+ "INSERT INTO scheme1.dbconfig VALUES ('initialized', true), ('version', 2);";
@Deployment
public static Archive<?> createDeployment() {
return ShrinkWrap.create(JavaArchive.class).addAsManifestResource("META-INF/beans.xml", "beans.xml")
.addAsManifestResource("META-INF/persistence.xml", "persistence.xml");
}
@PersistenceContext
private EntityManager em;
@Inject
private UserTransaction transaction;
@Before
public void setUp() throws Exception {
this.transaction.begin();
this.em.createNativeQuery(CLEANUP_SCRIPT).executeUpdate();
this.em.createNativeQuery(CREATE_SCRIPT).executeUpdate();
this.transaction.commit();
}
// since an exception gets thrown in the setUp() method, these are not called
// they are only needed because the exception gets thrown for more than
// four tests methods
@Test public void test1() { }
@Test public void test2() { }
@Test public void test3() { }
@Test public void test4() { }
@Test public void test5() { }
@Test public void test6() { }
@Test public void test7() { }
@Test public void test8() { }
}
【问题讨论】:
-
只是吐口水,但我猜这与测试运行者将测试拆分为并行作业有关,如果它们的数量超过阈值。
-
@Sneftel 我在 Maven 中禁用了并行测试,AFAIK Eclipse 根本不进行并行测试,所以不可能这样。
-
这太抽象了。您可以提供的信息越多越好。什么数据库提供商?什么版本的休眠?你在运行什么容器?f 你能提供完整的测试吗?完整的错误(你只包括 1 行)?
-
@JohnAment 我将信息添加到问题中。可悲的是,没有堆栈跟踪或任何东西,只有一行(JUnit / Client 端只将该行包装成
ArquillianProxyException)。
标签: jboss-arquillian