Arquillian 不会执行超过 4 个测试
Arquillian Does Not Execute More Than 4 Tests
这个有点让人头疼:我有一个 Arquillian 测试 class 有 8 个测试。如果我一次执行其中的 4 个,它们都可以工作,但如果我再添加一个测试,最后一个就会失败。如果我执行全部 8 个,则最后 4 个失败。如果我更改顺序,最后 4 个仍然会失败。除此之外,没有押韵也没有理由执行哪些执行,哪些失败。
(如果我将一半的测试放在另一个 class 中也是如此。那么两个 classes 都可以自己执行,但是如果它们作为同一个 class 的一部分启动=68=]配置,第二个将无法通过所有测试。)
错误发生在@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)
],则不会发生错误,即使 table scheme1.dbconfig
仅在其中一个文件中被引用。
我得到的错误消息是:
09:20:18,243 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-24) ERROR: relation "scheme1.dbconfig" does not exist
Position: 169
我不知道169的位置在哪里(忽略所有评论,第169个位置应该在propkey
的R和O之间,这看起来很奇怪)。但是我在执行了整个class之后查了下数据库,出现了上面的错误,tablescheme1.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() { }
}
不,Arquillian 将 运行 在单个文件中进行尽可能多的测试,或者至少直到 JUnit(或 TestNG)停止 运行ning。以下是来自 Apache DeltaSpike 的一些示例,其中包含四个以上的测试 运行ning:
您的设置中一定有什么东西导致了问题。
我运行在过去的两年里一次又一次地解决这个问题。唯一可靠的作品如下:
- 使用一个脚本而不是两个;在这种情况下,我将在执行之前连接这两个文件
- 不是每次都初始化;我将测试是否存在其中一个模式,并希望并祈祷之前的测试使数据库处于可用状态(祝您调试顺利)
这个有点让人头疼:我有一个 Arquillian 测试 class 有 8 个测试。如果我一次执行其中的 4 个,它们都可以工作,但如果我再添加一个测试,最后一个就会失败。如果我执行全部 8 个,则最后 4 个失败。如果我更改顺序,最后 4 个仍然会失败。除此之外,没有押韵也没有理由执行哪些执行,哪些失败。
(如果我将一半的测试放在另一个 class 中也是如此。那么两个 classes 都可以自己执行,但是如果它们作为同一个 class 的一部分启动=68=]配置,第二个将无法通过所有测试。)
错误发生在@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)
],则不会发生错误,即使 table scheme1.dbconfig
仅在其中一个文件中被引用。
我得到的错误消息是:
09:20:18,243 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-24) ERROR: relation "scheme1.dbconfig" does not exist Position: 169
我不知道169的位置在哪里(忽略所有评论,第169个位置应该在propkey
的R和O之间,这看起来很奇怪)。但是我在执行了整个class之后查了下数据库,出现了上面的错误,tablescheme1.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() { }
}
不,Arquillian 将 运行 在单个文件中进行尽可能多的测试,或者至少直到 JUnit(或 TestNG)停止 运行ning。以下是来自 Apache DeltaSpike 的一些示例,其中包含四个以上的测试 运行ning:
您的设置中一定有什么东西导致了问题。
我运行在过去的两年里一次又一次地解决这个问题。唯一可靠的作品如下:
- 使用一个脚本而不是两个;在这种情况下,我将在执行之前连接这两个文件
- 不是每次都初始化;我将测试是否存在其中一个模式,并希望并祈祷之前的测试使数据库处于可用状态(祝您调试顺利)